Heaps
CIS 323
Winter 2007
Assignment 3

Scheduling Jobs With Priority Queues

Due 5pm Tuesday 6 March 2007

In this assignment you will use priority queues to determine whether a given list of repeating hard-real-time jobs can be scheduled so that they complete by their required deadlines, and to output what the schedule actually is. In particular, you must implement a Earliest-deadline-first scheduler, and a jobs generator that will put new jobs on the heap to be scheduled.

The input to your scheduler will consist of a number n, followed by n lines of whitespace separated data in three columns: job name, time required, periodicity. The output should either be a valid shedule, indicating what jobs run at what time all the way until time MAXTIME = lcm(all the time periods), or it should be the job schedule until a job becomes unschedulable, followed by the word unschedulable. This looser spec allows you to produce output no matter whether a schedule is viable or not, which makes implementing this a lot easier. Sample I/O for schedulable list of tasks is:

Input
3
T1 3 5
T2 2 7
T3 1 9
Output
0 T1 finishing at 3
3 T2 finishing at 5
5 T3 finishing at 6
6 T1 finishing at 9
9 T2 finishing at 11
11 T1 finishing at 14
14 T3 finishing at 15
15 T1 finishing at 18
18 T2 finishing at 20
20 T1 finishing at 23
23 T3 finishing at 24
24 T2 finishing at 26
26 T1 finishing at 29
29 T2 finishing at 31
31 T1 finishing at 34
34 T3 finishing at 35
35 T1 finishing at 38
38 T2 finishing at 40
40 T3 finishing at 41
41 T1 finishing at 44
44 T2 finishing at 46
46 T1 finishing at 49
49 T3 finishing at 50
50 T1 finishing at 53
53 T2 finishing at 55
55 T1 finishing at 58
58 T3 finishing at 59
59 T2 finishing at 61
61 T1 finishing at 64
64 T2 finishing at 66
66 T1 finishing at 69
69 T3 finishing at 70
70 T1 finishing at 73
73 T2 finishing at 75
75 T1 finishing at 78
78 T3 finishing at 79
79 T2 finishing at 81
81 T1 finishing at 84
84 T3 finishing at 85
85 T1 finishing at 88
88 T2 finishing at 90
90 T1 finishing at 93
93 T2 finishing at 95
95 T3 finishing at 96
96 T1 finishing at 99
99 T2 finishing at 101
101 T1 finishing at 104
104 T3 finishing at 105
105 T1 finishing at 108
108 T2 finishing at 110
110 T1 finishing at 113
113 T3 finishing at 114
114 T2 finishing at 116
116 T1 finishing at 119
119 T3 finishing at 120
120 T1 finishing at 123
123 T2 finishing at 125
125 T1 finishing at 128
128 T2 finishing at 130
130 T3 finishing at 131
131 T1 finishing at 134
134 T2 finishing at 136
136 T1 finishing at 139
139 T3 finishing at 140
140 T1 finishing at 143
143 T2 finishing at 145
145 T1 finishing at 148
148 T3 finishing at 149
149 T2 finishing at 151
151 T1 finishing at 154
154 T2 finishing at 156
156 T1 finishing at 159
159 T3 finishing at 160
160 T1 finishing at 163
163 T2 finishing at 165
165 T1 finishing at 168
168 T3 finishing at 169
169 T2 finishing at 171
171 T1 finishing at 174
174 T3 finishing at 175
175 T1 finishing at 178
178 T2 finishing at 180
180 T1 finishing at 183
183 T3 finishing at 184
184 T2 finishing at 186
186 T1 finishing at 189
189 T2 finishing at 191
191 T1 finishing at 194
194 T3 finishing at 195
195 T1 finishing at 198
198 T2 finishing at 200
200 T1 finishing at 203
203 T3 finishing at 204
204 T2 finishing at 206
206 T1 finishing at 209
209 T3 finishing at 210
210 T1 finishing at 213
213 T2 finishing at 215
215 T1 finishing at 218
218 T2 finishing at 220
220 T3 finishing at 221
221 T1 finishing at 224
224 T2 finishing at 226
226 T1 finishing at 229
229 T3 finishing at 230
230 T1 finishing at 233
233 T2 finishing at 235
235 T1 finishing at 238
238 T3 finishing at 239
239 T2 finishing at 241
241 T1 finishing at 244
244 T3 finishing at 245
245 T1 finishing at 248
248 T2 finishing at 250
250 T1 finishing at 253
253 T2 finishing at 255
255 T1 finishing at 258
258 T3 finishing at 259
259 T2 finishing at 261
261 T1 finishing at 264
264 T3 finishing at 265
265 T1 finishing at 268
268 T2 finishing at 270
270 T1 finishing at 273
273 T3 finishing at 274
274 T2 finishing at 276
276 T1 finishing at 279
279 T3 finishing at 280
280 T1 finishing at 283
283 T2 finishing at 285
285 T1 finishing at 288
288 T2 finishing at 290
290 T1 finishing at 293
293 T3 finishing at 294
294 T2 finishing at 296
296 T1 finishing at 299
299 T3 finishing at 300
300 T1 finishing at 303
303 T2 finishing at 305
305 T1 finishing at 308
308 T3 finishing at 309
309 T2 finishing at 311
311 T1 finishing at 314

Sample I/O for an unschedulable problem might be:

Input
4
T1 3 5
T2 2 7
T3 1 9
T4 1 11
Output
0 T1 finishing at 3
3 T2 finishing at 5
5 T3 finishing at 6
6 T1 finishing at 9
9 T4 finishing at 10
10 T2 finishing at 12
12 T1 finishing at 15
15 T3 finishing at 16
16 T1 finishing at 19
19 T2 finishing at 21
21 T4 finishing at 22
22 T1 finishing at 25
25 T3 finishing at 26
26 T2 finishing at 28
Unschedulable

But the only important part is that the last line says "Unschedulable" when a list of jobs is, indeed, unschedulable.

Implementation Strategy

To do this, you must maintain at least one heap - the heap of scheduled jobs with active deadlines. When a job becomes schedulable (that is, the current time has moved past the beginning of its period), you should put it in the priority queue of schedulable jobs. Whenever the queue of schedulable jobs is not empty, take the job with the soonest required completion time and schedule it. If it will complete in time, then increment the current time and move forwards.

Calculating the lcm of two numbers is easy, by the way. Here is sample code in python:

def gcd(a,b):
    a,b = min(a,b), max(a,b)
    if a == 0:
        return b
    else:
        return gcd(a, b%a)

def lcm(x,y):
    return x*y // gcd(x,y)  # "//" is integer division in python

Questions?