Exemplo n.º 1
0
/*
 * schedule_tasks
 *
 * Description:
 *		Schedule tasks using EDF.
 *
 * Inputs:
 *		sched_task	- an array of tasks to schedule
 *		n_tasks		- number of tasks to schedule
 *
 * Outputs:
 *		none
 *
 * Returns:
 *		schedule_tasks return 0 upon success.
 *
 * Side Effects
 *		Job related fields in sched_task are modified.
 */
int schedule_tasks(task_t *sched_task, int n_tasks)
{
	double now;		/* current time */
	double end;		/* time to end simulation */
	double energy;		/* total energy used */
	int    index;

	task_t *cur;		/* pointer to current task */

	tasks = sched_task;
	ntask = n_tasks;
	srandom(599);

	/* all tasks are initially released at t = 0 */
	for (index = 0 ; index < n_tasks ; index++) {
		enqueue(&ready, &tasks[index]);
		release(&tasks[index]);
	}
	wait = NULL;

	freq = 1.0;
	volts = 1.0;
	energy = 0.0;

	/* run simulation for 2x the hyperperiod */
	end = compute_hyperperiod(tasks, n_tasks) * 2;
	now = 0.0;
	while(now < end) {
		/* run next job in ready queue */
		if (wait == NULL
		    || (now + (ready->cur_exec - ready->usage)/freq
			<= wait->next_evt)) {
			/* job runs to completion (i.e., it's not preempted) */
			energy += (ready->cur_exec - ready->usage)
			  * freq * volts * volts; 
			now = completion(now);
		} else {
			/* scheduling decision at next_evt */
			run_job(ready, ready->job, now, wait->next_evt, freq);
			ready->usage += (wait->next_evt - now) * freq;
			energy += (wait->next_evt-now) * freq * volts * volts;
			now = wait->next_evt;
		}
		if (ready == NULL) {
			/* skip idle time until next release */
			now = wait->next_evt;
		}
		/* release jobs in wait queue that are at release time */
		while(wait && wait->next_evt <= now) {
			cur = dequeue(&wait);
			cur->next_evt += cur->deadline;
			release(cur);
			enqueue(&ready, cur);
		}
	}
	printf("energy used = %f\n", energy);
	
	return 0;
}
Exemplo n.º 2
0
 std::vector<int> compute_all_deadlines(Iter a, Iter b)
 {
     std::vector<int> dl;
     int h = compute_hyperperiod(a, b, b-a);
     for (Iter p = a; p!=b; ++p) {
         int d = get_next_deadline(*p, 0);
         while (d <= h) {
             dl.push_back(d);
             d = get_next_deadline(*p, d);
         }
     }
     std::sort(dl.begin(), dl.end());
     std::unique(dl.begin(), dl.end());
     return dl;
 }