source: xssim/branches/tpiontek/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
Line 
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;
17import schedframe.scheduling.events.TaskRequestedTimeExpiredEvent;
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;
27import test.rewolucja.resources.physical.implementation.Processor;
28import test.rewolucja.scheduling.JobRegistryInterface;
29import test.rewolucja.scheduling.UsedResourceList;
30import test.rewolucja.scheduling.plan.SchedulingPlanInterfaceNew;
31import test.rewolucja.scheduling.plan.SchedulingPlanNew;
32import test.rewolucja.scheduling.queue.Queue;
33import test.rewolucja.scheduling.queue.QueueList;
34
35public class FCFSCPUFreqScalingClusterLocalPlugin extends BaseLocalPlugin {
36
37        List<Processor> allocatedCPUs;
38        public FCFSCPUFreqScalingClusterLocalPlugin () {
39                allocatedCPUs = new ArrayList<Processor>();
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
48                // BaseLocalPlugin.placeJobsInQueues() method)
49                Queue q = queues.get(0);
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);
67                                                List<Processor> processors =  new ArrayList<Processor>();
68                                                for(ComputingResource res : pes){
69                                                        processors.add((Processor) res);
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());
80                        UsedResourceList<ResourceHistoryItem> usedResourcesList = subTask.getUsedResources();
81                        ProcessingElements pes = (ProcessingElements)usedResourcesList.getLast().getResourceUnits().get(ResourceParameterName.PROCESSINGELEMENTS);
82                        List<Processor> processors =  new ArrayList<Processor>();
83                        for(ComputingResource res : pes){
84                                processors.add((Processor) res);
85                                allocatedCPUs.add((Processor) res);
86                        }
87                        adjustFrequency(ResourceStatus.FREE, processors);
88                        break;
89                       
90                case TASK_REQUESTED_TIME_EXPIRED:
91                        TaskRequestedTimeExpiredEvent timExpEvent = (TaskRequestedTimeExpiredEvent) event;
92                         subTask = jobRegistry.getSubmittedTask(timExpEvent.getJobId(), timExpEvent.getTaskId());
93                        usedResourcesList = subTask.getUsedResources();
94                        pes = (ProcessingElements)usedResourcesList.getLast().getResourceUnits().get(ResourceParameterName.PROCESSINGELEMENTS);
95                        processors =  new ArrayList<Processor>();
96                        for(ComputingResource res : pes){
97                                allocatedCPUs.remove((Processor) res);
98                        }
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);
109                                                pes = (ProcessingElements)choosenResources.get(ResourceParameterName.PROCESSINGELEMENTS);
110                                                processors =  new ArrayList<Processor>();
111                                                for(ComputingResource res : pes){
112                                                        processors.add((Processor) res);
113                                                }
114                                                adjustFrequency(ResourceStatus.BUSY, processors);
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;
137                        List<Processor> processors = resourceManager.getProcessors();
138                        processors.removeAll(allocatedCPUs);
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
158                        ProcessingElements result = new ProcessingElements();
159                        result.addAll(choosenResources);
160                        map.put(ResourceParameterName.PROCESSINGELEMENTS, result);
161                }
162                return map;
163        }
164
165        private void adjustFrequency(ResourceStatus status, List<Processor> processors){
166                switch(status){
167                case BUSY:
168                        for(Processor cpu: processors){
169                                if(cpu.getPowerInterface().getSupportedPStates().containsKey(PStateType.P0))
170                                        cpu.getPowerInterface().setPState(PStateType.P0);
171                        }
172                        break;
173                case FREE:
174                        for(Processor cpu: processors){
175                                if(cpu.getPowerInterface().getSupportedPStates().containsKey(PStateType.P3))
176                                        cpu.getPowerInterface().setPState(PStateType.P3);
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.