source: xssim/trunk/src/example/localplugin/FCFSCPUFreqScalingClusterLocalPlugin.java @ 204

Revision 204, 6.9 KB checked in by wojtekp, 13 years ago (diff)
  • Property svn:mime-type set to text/plain
RevLine 
[104]1package example.localplugin;
2
3import gridsim.Gridlet;
4import gridsim.gssim.ResourceHistoryItem;
5import gridsim.gssim.SubmittedTask;
6
7import java.util.ArrayList;
8import java.util.HashMap;
9import java.util.List;
10import java.util.Map;
11import java.util.Properties;
12
13import schedframe.resources.units.ResourceUnit;
14import schedframe.scheduling.TaskInterface;
15import schedframe.scheduling.events.SchedulingEvent;
16import schedframe.scheduling.events.TaskFinishedEvent;
[143]17import schedframe.scheduling.events.TaskRequestedTimeExpiredEvent;
[104]18import schedframe.scheduling.plugin.grid.ModuleList;
19import schedframe.scheduling.utils.ResourceParameterName;
20import test.rewolucja.GSSIMJobInterface;
21import test.rewolucja.energy.profile.PStateType;
22import test.rewolucja.resources.ProcessingElements;
23import test.rewolucja.resources.ResourceStatus;
24import test.rewolucja.resources.manager.implementation.ClusterResourceManager;
25import test.rewolucja.resources.manager.interfaces.ResourceManagerInterface;
26import test.rewolucja.resources.physical.base.ComputingResource;
[204]27import test.rewolucja.resources.physical.implementation.Processor;
[104]28import test.rewolucja.scheduling.JobRegistryInterface;
[172]29import test.rewolucja.scheduling.UsedResourceList;
[104]30import test.rewolucja.scheduling.plan.SchedulingPlanInterfaceNew;
31import test.rewolucja.scheduling.plan.SchedulingPlanNew;
[163]32import test.rewolucja.scheduling.queue.Queue;
[104]33import test.rewolucja.scheduling.queue.QueueList;
34
35public class FCFSCPUFreqScalingClusterLocalPlugin extends BaseLocalPlugin {
36
[204]37        List<Processor> allocatedCPUs;
[104]38        public FCFSCPUFreqScalingClusterLocalPlugin () {
[204]39                allocatedCPUs = new ArrayList<Processor>();
[104]40        }
41
42        public SchedulingPlanInterfaceNew schedule(SchedulingEvent event, QueueList queues, JobRegistryInterface jobRegistry,
43                        ResourceManagerInterface resManager, ModuleList modules) {
44
45                ClusterResourceManager resourceManager = (ClusterResourceManager) resManager;
46                SchedulingPlanNew plan = new SchedulingPlanNew();
47                // our tasks are placed only in first queue (see
[192]48                // BaseLocalPlugin.placeJobsInQueues() method)
[163]49                Queue q = queues.get(0);
[104]50                // chose the events types to serve.
51                // Different actions for different events are possible.
52                switch (event.getType()) {
53               
54                case START_TASK_EXECUTION:
55
56                        // check all tasks in queue
57                        for (int i = 0; i < q.size(); i++) {
58                                GSSIMJobInterface<?> job = q.get(i);
59                                TaskInterface<?> task = (TaskInterface<?>) job;
60                                // if status of the tasks in READY
61                                if (task.getStatus() == Gridlet.READY) {
62
63                                        Map<ResourceParameterName, ResourceUnit> choosenResources = chooseResourcesForExecution(resourceManager, task);
64                                        if (choosenResources  != null) {
65                                                addToSchedulingPlan(plan, task, choosenResources);
66                                                ProcessingElements pes = (ProcessingElements)choosenResources.get(ResourceParameterName.PROCESSINGELEMENTS);
[204]67                                                List<Processor> processors =  new ArrayList<Processor>();
[104]68                                                for(ComputingResource res : pes){
[204]69                                                        processors.add((Processor) res);
[104]70                                                }
71                                                adjustFrequency(ResourceStatus.BUSY,processors);
72                                        }
73                                }
74                        }
75                        break;
76                       
77                case TASK_FINISHED:
78                        TaskFinishedEvent finEvent = (TaskFinishedEvent) event;
79                        SubmittedTask subTask = jobRegistry.getSubmittedTask(finEvent.getJobId(), finEvent.getTaskId());
[172]80                        UsedResourceList<ResourceHistoryItem> usedResourcesList = subTask.getUsedResources();
81                        ProcessingElements pes = (ProcessingElements)usedResourcesList.getLast().getResourceUnits().get(ResourceParameterName.PROCESSINGELEMENTS);
[204]82                        List<Processor> processors =  new ArrayList<Processor>();
[104]83                        for(ComputingResource res : pes){
[204]84                                processors.add((Processor) res);
85                                allocatedCPUs.add((Processor) res);
[104]86                        }
87                        adjustFrequency(ResourceStatus.FREE, processors);
88                        break;
89                       
90                case TASK_REQUESTED_TIME_EXPIRED:
[143]91                        TaskRequestedTimeExpiredEvent timExpEvent = (TaskRequestedTimeExpiredEvent) event;
92                         subTask = jobRegistry.getSubmittedTask(timExpEvent.getJobId(), timExpEvent.getTaskId());
93                        usedResourcesList = subTask.getUsedResources();
[172]94                        pes = (ProcessingElements)usedResourcesList.getLast().getResourceUnits().get(ResourceParameterName.PROCESSINGELEMENTS);
[204]95                        processors =  new ArrayList<Processor>();
[143]96                        for(ComputingResource res : pes){
[204]97                                allocatedCPUs.remove((Processor) res);
[143]98                        }
[104]99                        // check all tasks in queue
100                        for (int i = 0; i < q.size(); i++) {
101                                GSSIMJobInterface<?> job = q.get(i);
102                                TaskInterface<?> task = (TaskInterface<?>) job;
103                                // if status of the tasks in READY
104                                if (task.getStatus() == Gridlet.READY) {
105
106                                        Map<ResourceParameterName, ResourceUnit> choosenResources = chooseResourcesForExecution(resourceManager, task);
107                                        if (choosenResources  != null) {
108                                                addToSchedulingPlan(plan, task, choosenResources);
[143]109                                                pes = (ProcessingElements)choosenResources.get(ResourceParameterName.PROCESSINGELEMENTS);
[204]110                                                processors =  new ArrayList<Processor>();
[104]111                                                for(ComputingResource res : pes){
[204]112                                                        processors.add((Processor) res);
[104]113                                                }
[143]114                                                adjustFrequency(ResourceStatus.BUSY, processors);
[104]115                                        }
116                                }
117                        }
118                        break;
119                }
120                return plan;
121        }
122       
123        private HashMap<ResourceParameterName, ResourceUnit> chooseResourcesForExecution(
124                        ClusterResourceManager resourceManager, TaskInterface<?> task) {
125
126                HashMap<ResourceParameterName, ResourceUnit> map = new HashMap<ResourceParameterName, ResourceUnit>();
127
128                int cpuRequest;
129                try {
130                        cpuRequest = Double.valueOf(task.getCpuCntRequest()).intValue();
131                } catch (NoSuchFieldException e) {
132                        cpuRequest = 1;
133                }
134
135                if (cpuRequest != 0) {
136                        List<ComputingResource> choosenResources = null;
[204]137                        List<Processor> processors = resourceManager.getProcessors();
[143]138                        processors.removeAll(allocatedCPUs);
[104]139                        if (processors.size() < cpuRequest) {
140                                // log.warn("Task requires more cpus than is availiable in this resource.");
141                                return null;
142                        }
143
144                        choosenResources = new ArrayList<ComputingResource>();
145
146                        for (int i = 0; i < processors.size() && cpuRequest > 0; i++) {
147                                if (processors.get(i).getStatus() == ResourceStatus.FREE) {
148                                        choosenResources.add(processors.get(i));
149                                        cpuRequest--;
150                                }
151                        }
152                        if (cpuRequest > 0) {
153                                // log.info("Task " + task.getJobId() + "_" + task.getId() +
154                                // " requires more cpus than is availiable in this moment.");
155                                return null;
156                        }
157
[143]158                        ProcessingElements result = new ProcessingElements();
[104]159                        result.addAll(choosenResources);
160                        map.put(ResourceParameterName.PROCESSINGELEMENTS, result);
161                }
162                return map;
163        }
164
[204]165        private void adjustFrequency(ResourceStatus status, List<Processor> processors){
[104]166                switch(status){
167                case BUSY:
[204]168                        for(Processor cpu: processors){
[143]169                                if(cpu.getPowerInterface().getSupportedPStates().containsKey(PStateType.P0))
170                                        cpu.getPowerInterface().setPState(PStateType.P0);
[104]171                        }
172                        break;
173                case FREE:
[204]174                        for(Processor cpu: processors){
[143]175                                if(cpu.getPowerInterface().getSupportedPStates().containsKey(PStateType.P3))
176                                        cpu.getPowerInterface().setPState(PStateType.P3);
[104]177                        }
178                        break;
179                }
180        }
181       
182        public String getName() {
183                return getClass().getName();
184        }
185
186        public void init(Properties properties) {
187                // no extra initialization is expected.
188        }
189
190}
Note: See TracBrowser for help on using the repository browser.