GreenCloud Simulator
Public Member Functions | Private Attributes | List of all members
CoreScheduler Class Reference

#include <corescheduler.h>

Collaboration diagram for CoreScheduler:
Collaboration graph
[legend]

Public Member Functions

 CoreScheduler (Capacity *nominal_mips_, Capacity *available_mips_)
 
virtual ~CoreScheduler ()
 
void setProvider (ResourceProvider *provider)
 
void setDVFS (int eDVFS_enabled_)
 
double getCurrentMIPS ()
 
double getCurrentMIPSRecursive ()
 
double getNominalMIPS ()
 
double getAvailableMIPS ()
 
ResourceProvidergetProvider ()
 
void updateTskList (double c_mips)
 
void updateTskList ()
 
void removeCompleted ()
 
CloudTaskremoveTaskAlloc (std::vector< TaskAlloc * >::iterator &iter, bool executed)
 
void removeTaskAlloc (TaskAlloc *ta)
 
void removeFailedTaskAlloc (std::vector< TaskAlloc * >::iterator &iter, bool executed)
 
void updateTskComputingRates (double c_mips)
 
double getMostUrgentTaskRate ()
 
void setComputingRate ()
 
int getAllTasksNumber ()
 
void assignTask (TaskAlloc *tskobj)
 
void executeTask (TaskAlloc *tskobj)
 
bool removeFromAssginedList (TaskAlloc *tskobj)
 
bool removeAllocationsFromAssginedList (CloudTask *tskobj)
 
void startTaskExecution (CloudTask *tskobj)
 
void addVcoreScheduler (CoreScheduler *cs)
 
void removeVcoreScheduler (CoreScheduler *cs)
 
CoreSchedulergetHostScheduler ()
 

Private Attributes

Capacitynominal_mips_
 
Capacityavailable_mips_
 
double current_mips_
 
ResourceProviderprovider
 
std::vector< CoreScheduler * > hosted_vcores_schedulers
 
std::vector< TaskAlloc * > tasks_alloc_list_
 
std::vector< TaskAlloc * > tasks_alloc_assigned_
 
CoreSchedulerhost_scheduler_
 
int eDVFS_enabled_
 
int tskAllocFailed_
 

Detailed Description

Definition at line 26 of file corescheduler.h.

Constructor & Destructor Documentation

CoreScheduler::CoreScheduler ( Capacity nominal_mips_,
Capacity available_mips_ 
)

Definition at line 12 of file corescheduler.cc.

13  this->nominal_mips_=nominal_mips_;
14  this->available_mips_=available_mips_;
15  tasks_alloc_list_.clear();
16  tasks_alloc_assigned_.clear();
18 
19 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
Capacity * available_mips_
Definition: corescheduler.h:64
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
CoreScheduler * host_scheduler_
Definition: corescheduler.h:71
double current_mips_
Definition: corescheduler.h:65
Capacity * nominal_mips_
Definition: corescheduler.h:63
std::vector< CoreScheduler * > hosted_vcores_schedulers
Definition: corescheduler.h:68
CoreScheduler::~CoreScheduler ( )
virtual

Definition at line 23 of file corescheduler.cc.

23  {
24  std::vector <TaskAlloc*>::iterator task;
25  for(task = tasks_alloc_list_.begin(); task!=tasks_alloc_list_.end() ;task++){
26  delete (*task);
27  }
28  tasks_alloc_list_.~vector();
29  for(task = tasks_alloc_assigned_.begin(); task!=tasks_alloc_assigned_.end() ;task++){
30  delete (*task);
31  }
32  tasks_alloc_assigned_.~vector();
33 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70

Member Function Documentation

void CoreScheduler::addVcoreScheduler ( CoreScheduler cs)

Definition at line 308 of file corescheduler.cc.

308  {
309  hosted_vcores_schedulers.push_back(cs);
310  cs->host_scheduler_ = this;
311 }
CoreScheduler * host_scheduler_
Definition: corescheduler.h:71
std::vector< CoreScheduler * > hosted_vcores_schedulers
Definition: corescheduler.h:68
void CoreScheduler::assignTask ( TaskAlloc tskobj)

Definition at line 71 of file corescheduler.cc.

71  {
72  tasks_alloc_assigned_.push_back(tskobj);
73  tskobj->setCoreScheduler(this);
74 }
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
void setCoreScheduler(CoreScheduler *cs)
Definition: taskalloc.cc:28
void CoreScheduler::executeTask ( TaskAlloc tskobj)

Definition at line 76 of file corescheduler.cc.

76  {
77  tasks_alloc_list_.push_back(tskobj); // add to the active tasks links
78  tskobj->setCoreScheduler(this);
79 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
void setCoreScheduler(CoreScheduler *cs)
Definition: taskalloc.cc:28
int CoreScheduler::getAllTasksNumber ( )

Definition at line 67 of file corescheduler.cc.

67  {
68  return tasks_alloc_list_.size() + tasks_alloc_assigned_.size();
69 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
double CoreScheduler::getAvailableMIPS ( )

Definition at line 59 of file corescheduler.cc.

59  {
60  return *available_mips_;
61 }
Capacity * available_mips_
Definition: corescheduler.h:64
double CoreScheduler::getCurrentMIPS ( )

Definition at line 43 of file corescheduler.cc.

43  {
44  return current_mips_;
45 }
double current_mips_
Definition: corescheduler.h:65
double CoreScheduler::getCurrentMIPSRecursive ( )

Definition at line 46 of file corescheduler.cc.

46  {
47  double result = getCurrentMIPS();
48  std::vector<CoreScheduler*>::iterator iter;
49  int i = 1;
50  for(iter = hosted_vcores_schedulers.begin(); iter != hosted_vcores_schedulers.end();iter++){
51  result += (*iter)->getCurrentMIPSRecursive();
52  i++;
53  }
54  return result;
55 }
double getCurrentMIPS()
std::vector< CoreScheduler * > hosted_vcores_schedulers
Definition: corescheduler.h:68
CoreScheduler * CoreScheduler::getHostScheduler ( )

Definition at line 319 of file corescheduler.cc.

319  {
320  return host_scheduler_;
321 }
CoreScheduler * host_scheduler_
Definition: corescheduler.h:71
double CoreScheduler::getMostUrgentTaskRate ( )

Definition at line 201 of file corescheduler.cc.

202 {
203  std::vector<TaskAlloc*>::iterator iter;
204 
205  /* update what is already computing */
206 
207  for (iter = tasks_alloc_list_.begin(); iter != tasks_alloc_list_.end(); iter++)
208  {
209  (*iter)->updateMIPS(); // update what is already computing
210  }
211  /* remove completed */
212  removeCompleted();
213 
214  /* Compute highest MIPS/deadline ratio */
215  double maxrate = 0.0;
216 
217  /* get most urgent task rate from the execution list */
218  for (iter = tasks_alloc_list_.begin(); iter != tasks_alloc_list_.end();)
219  {
220  if((double)((*iter)->getDeadline() - Scheduler::instance().clock())>0 && (*iter)->cloudTask->failed_==false){
221  double rate = (double)(*iter)->getMIPS()/(double)((*iter)->getDeadline() - Scheduler::instance().clock());
222  if(rate>maxrate){
223  maxrate = rate;
224  }
225  iter++;
226  }
227  else {
228  removeFailedTaskAlloc(iter,true);
229  }
230  }
231 
232  /* get most urgent task rate from the in-fly list */
233  for (iter = tasks_alloc_assigned_.begin(); iter != tasks_alloc_assigned_.end();)
234  {
235  if((double)((*iter)->getDeadline() - Scheduler::instance().clock())>0 && (*iter)->cloudTask->failed_==false){
236  double rate = (double)(*iter)->getMIPS()/(double)((*iter)->getDeadline() - Scheduler::instance().clock());
237  if(rate>maxrate){
238  maxrate = rate;
239  }
240  iter++;
241  } else {
242  removeFailedTaskAlloc(iter,false);
243  }
244  }
245  if (maxrate > getAvailableMIPS()){return getAvailableMIPS();}
246  else{return maxrate;}
247 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
double getAvailableMIPS()
void removeFailedTaskAlloc(std::vector< TaskAlloc * >::iterator &iter, bool executed)
void removeCompleted()
double CoreScheduler::getNominalMIPS ( )

Definition at line 56 of file corescheduler.cc.

56  {
57  return *nominal_mips_;
58 }
Capacity * nominal_mips_
Definition: corescheduler.h:63
ResourceProvider * CoreScheduler::getProvider ( )

Definition at line 63 of file corescheduler.cc.

63  {
64  return provider;
65 }
ResourceProvider * provider
Definition: corescheduler.h:67
bool CoreScheduler::removeAllocationsFromAssginedList ( CloudTask tskobj)

Definition at line 94 of file corescheduler.cc.

94  {
95  vector<TaskAlloc*>::iterator iter;
96  bool found = false;
97  for (iter = tasks_alloc_assigned_.begin(); iter != tasks_alloc_assigned_.end();)
98  {
99  /* task received remove from in-fly list */
100  if ((*iter)->cloudTask->id_ == tskobj->id_) {
101  iter = tasks_alloc_assigned_.erase(iter);
102  found = true;
103  } else {
104  iter++;
105  }
106  }
107  return found;
108 }
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
int id_
Definition: cloudtask.h:51
void CoreScheduler::removeCompleted ( )

Definition at line 173 of file corescheduler.cc.

174 {
175  std::vector<TaskAlloc*>::iterator iter;
176 
177  /* remove completed tasks from the execution list */
178  for (iter = tasks_alloc_list_.begin(); iter != tasks_alloc_list_.end();)
179  {
180  /* task should be completed and remove it from the list */
181  if ((*iter)->getMIPS() <= 1) {
182  CloudTask* ct = removeTaskAlloc(iter,true);
183  //check if finished:
184  if(ct->isFinished()){
187  }
188  }
189  /*Task run over its deadline, remove it and mark as failed. */
190  else if(Scheduler::instance().clock() >= (*iter)->cloudTask->getDeadline()) {
191  removeFailedTaskAlloc(iter,true);
192  } else if ((*iter)->cloudTask->failed_==true){
193  std::cerr << "This should not happen!\n";
194  }
195  else {
196  iter++;
197  }
198  }
199 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
void sendTaskOutput(CloudTask *task)
bool isFinished()
Definition: cloudtask.cc:83
CloudTask * removeTaskAlloc(std::vector< TaskAlloc * >::iterator &iter, bool executed)
void removeFailedTaskAlloc(std::vector< TaskAlloc * >::iterator &iter, bool executed)
bool releaseAllocation(ResourceConsumer *rc)
ResourceProvider * provider
Definition: corescheduler.h:67
void CoreScheduler::removeFailedTaskAlloc ( std::vector< TaskAlloc * >::iterator &  iter,
bool  executed 
)

Definition at line 158 of file corescheduler.cc.

159 {
160  if((*iter)->cloudTask->failed_==false){
161  (*iter)->cloudTask->fail(this->provider);
162  }
163  // REMOVE ALL TASK ALLOCATIONS FOR THE CLOUDTASK OF THIS TASK_ALLOC
164  if(executed){
165  iter = tasks_alloc_list_.begin();
166  } else {
167  iter = tasks_alloc_assigned_.begin();
168  }
169 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
ResourceProvider * provider
Definition: corescheduler.h:67
bool CoreScheduler::removeFromAssginedList ( TaskAlloc tskobj)

Definition at line 81 of file corescheduler.cc.

81  {
82  vector<TaskAlloc*>::iterator iter;
83  for (iter = tasks_alloc_assigned_.begin(); iter != tasks_alloc_assigned_.end();iter++)
84  {
85  /* task received remove from in-fly list */
86  if ((*iter) == tskobj) {
87  tasks_alloc_assigned_.erase(iter);
88  return true;
89  }
90  }
91  return false;
92 }
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
CloudTask* CoreScheduler::removeTaskAlloc ( std::vector< TaskAlloc * >::iterator &  iter,
bool  executed 
)
void CoreScheduler::removeTaskAlloc ( TaskAlloc ta)

Definition at line 148 of file corescheduler.cc.

149 {
151  tskAllocFailed_++;
152  tasks_alloc_list_.erase(remove(tasks_alloc_list_.begin(),tasks_alloc_list_.end(),ta),
153  tasks_alloc_list_.end()); /*erase-remove idiom*/
155  tasks_alloc_assigned_.end()); /*erase-remove idiom*/
156 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
virtual void updateEnergyAndConsumption()=0
ResourceProvider * provider
Definition: corescheduler.h:67
void CoreScheduler::removeVcoreScheduler ( CoreScheduler cs)

Definition at line 313 of file corescheduler.cc.

313  {
315  hosted_vcores_schedulers.end()); /*erase-remove idiom*/
316  cs->host_scheduler_ = NULL;
317 }
CoreScheduler * host_scheduler_
Definition: corescheduler.h:71
std::vector< CoreScheduler * > hosted_vcores_schedulers
Definition: corescheduler.h:68
void CoreScheduler::setComputingRate ( )

Definition at line 294 of file corescheduler.cc.

295 {
296  if (eDVFS_enabled_) {
297  /* Max requested rate times the number of active taks */
299  } else {
300  /* no energy saving */
301  if (tasks_alloc_list_.size() != 0){current_mips_ = getAvailableMIPS();}
302  else {(current_mips_) = 0;}
303  }
304  /* new computing rate, report it to tasks */
306 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
double getMostUrgentTaskRate()
void updateTskComputingRates(double c_mips)
double getAvailableMIPS()
double current_mips_
Definition: corescheduler.h:65
void CoreScheduler::setDVFS ( int  eDVFS_enabled_)

Definition at line 39 of file corescheduler.cc.

39  {
41 }
void CoreScheduler::setProvider ( ResourceProvider provider)

Definition at line 35 of file corescheduler.cc.

35  {
36  this->provider = provider;
37 }
ResourceProvider * provider
Definition: corescheduler.h:67
void CoreScheduler::startTaskExecution ( CloudTask tskobj)

Definition at line 110 of file corescheduler.cc.

110  {
111  vector<TaskAlloc*>::iterator iter;
112  for (iter = tasks_alloc_assigned_.begin(); iter != tasks_alloc_assigned_.end();)
113  {
114  /* task received remove from in-fly list */
115  if ((*iter)->cloudTask->id_ == tskobj->id_) {
116  executeTask((*iter));
117  (*iter)->setExecTime(Scheduler::instance().clock());
118  iter = tasks_alloc_assigned_.erase(iter);
119 
120  } else {
121  iter++;
122  }
123  }
124  if(!tskobj->started_){
125  tskobj->started_ = true;
126  }
127  this->updateTskList();
128 }
std::vector< TaskAlloc * > tasks_alloc_assigned_
Definition: corescheduler.h:70
int id_
Definition: cloudtask.h:51
void updateTskList()
void executeTask(TaskAlloc *tskobj)
bool started_
Definition: cloudtask.h:53
void CoreScheduler::updateTskComputingRates ( double  c_mips)

Definition at line 251 of file corescheduler.cc.

252 {
253  vector<TaskAlloc*>::iterator iter;
254 
255 
256  for (iter = tasks_alloc_list_.begin(); iter != tasks_alloc_list_.end(); iter++)
257  {
258  /* each task with then update mips left */
259  (*iter)->setComputingRate((double)c_mips/tasks_alloc_list_.size());
260  }
261 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
void CoreScheduler::updateTskList ( double  c_mips)

Definition at line 263 of file corescheduler.cc.

264 {
265 
266  vector<TaskAlloc*>::iterator iter;
267  if (tasks_alloc_list_.size()==0) return;
268 // std::cout << "Prov: " << provider->id_ << "\n";
269  /* update task computing rates to see which tasks are completed */
270  updateTskComputingRates(c_mips);
271  removeCompleted();
272 
273  /* set server computing rate */
275 
276  /* compute next deadline */
277  double nextDeadline = DBL_MAX;
278  for (iter = tasks_alloc_list_.begin(); iter != tasks_alloc_list_.end(); iter++)
279  {
280  if (nextDeadline > (*iter)->execTime()){
281  nextDeadline = (*iter)->execTime();
282  }
283  }
284 
285 
286  provider->scheduleNextExent(nextDeadline);
287 
288 }
std::vector< TaskAlloc * > tasks_alloc_list_
Definition: corescheduler.h:69
void setComputingRate()
void scheduleNextExent(double nextDeadline)
void updateTskComputingRates(double c_mips)
void removeCompleted()
ResourceProvider * provider
Definition: corescheduler.h:67
void CoreScheduler::updateTskList ( )

Definition at line 290 of file corescheduler.cc.

290  {
292 }
double current_mips_
Definition: corescheduler.h:65
void updateTskList()

Member Data Documentation

Capacity* CoreScheduler::available_mips_
private

MIPS unavailable for this scheduler (reserved for hosted vms)

Definition at line 64 of file corescheduler.h.

double CoreScheduler::current_mips_
private

MIPS currently used by this scheduler

Definition at line 65 of file corescheduler.h.

int CoreScheduler::eDVFS_enabled_
private

DVFS flag, influences the scheduling policy

Definition at line 72 of file corescheduler.h.

CoreScheduler* CoreScheduler::host_scheduler_
private

The scheduler that hosts this (next level) scheduler

Definition at line 71 of file corescheduler.h.

std::vector<CoreScheduler *> CoreScheduler::hosted_vcores_schedulers
private

List of schedulers of hosted vcores

Definition at line 68 of file corescheduler.h.

Capacity* CoreScheduler::nominal_mips_
private

Maximal available MIPS from ResourceSpec

Definition at line 63 of file corescheduler.h.

ResourceProvider* CoreScheduler::provider
private

The resorce provider that uses the scheduler

Definition at line 67 of file corescheduler.h.

std::vector<TaskAlloc *> CoreScheduler::tasks_alloc_assigned_
private

in-fly list

Definition at line 70 of file corescheduler.h.

std::vector<TaskAlloc *> CoreScheduler::tasks_alloc_list_
private

execution list

Definition at line 69 of file corescheduler.h.

int CoreScheduler::tskAllocFailed_
private

Number of TaskAllocations that failed on this scheduler (not used yet)

Definition at line 73 of file corescheduler.h.


The documentation for this class was generated from the following files: