blob: dd7091c02195988e06b04bd27042dfc6a792c015 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// -*- C++ -*-
//=============================================================================
/**
* @file FTRMFF_Bestfit.cpp
*
* $Id$
*
* @author Friedhelm Wolf (fwolf@dre.vanderbilt.edu)
*/
//=============================================================================
#include <sstream>
#include "FTRMFF_Bestfit.h"
#include "Forward_Ranking_Scheduler.h"
#include "Packing_Scheduler.h"
FTRMFF_Bestfit::~FTRMFF_Bestfit ()
{
}
FTRMFF_Output
FTRMFF_Bestfit::operator () (const FTRMFF_Input & input)
{
FTRMFF_Bestfit_Algorithm algorithm (input.processors,
input.backup_count);
FTRMFF_Output output;
output.schedule = algorithm (input.tasks);
output.unscheduled_tasks = algorithm.get_unschedulable ();
DBG_OUT (algorithm.schedule ());
return output;
}
FTRMFF_Bestfit_Algorithm::FTRMFF_Bestfit_Algorithm (
const PROCESSOR_LIST & processors,
unsigned int consistency_level)
: consistency_level_ (consistency_level),
scheduler_ (processors,
consistency_level_)
{
}
FTRMFF_Bestfit_Algorithm::~FTRMFF_Bestfit_Algorithm ()
{
}
SCHEDULING_MAP
FTRMFF_Bestfit_Algorithm::operator () (const TASK_LIST & tasks)
{
// sort tasks based on their periods, which results in a priority
// ordered list since we do rate monotonic scheduling
TASK_LIST sorted_input = tasks;
std::sort (sorted_input.begin (),
sorted_input.end (),
PeriodComparison <Task> ());
for (TASK_LIST::iterator it = sorted_input.begin ();
it != sorted_input.end ();
++it)
{
// create the right amount of backup replica tasks
TASK_LIST task_group = create_ranked_tasks (*it,
consistency_level_);
// schedule the tasks of one application
for (TASK_LIST::iterator task_it = task_group.begin ();
task_it != task_group.end ();
++task_it)
{
ScheduleResult r = scheduler_ (*task_it);
if (r.wcrt <= .0)
{
ScheduleProgress pg = {*task_it,
task_it->rank - consistency_level_ + 1};
unschedulable_.push_back (pg);
break;
}
else
{
scheduler_.update_schedule (r);
}
TRACE (*task_it << " -> " << r.processor);
}
}
return transform_schedule (scheduler_.schedule ());
}
SCHEDULE_PROGRESS_LIST
FTRMFF_Bestfit_Algorithm::get_unschedulable ()
{
return unschedulable_;
}
SCHEDULE
FTRMFF_Bestfit_Algorithm::schedule () const
{
return scheduler_.schedule ();
}
|