@@ -63,7 +63,6 @@ void printLog(struct log *head){
63
63
printf ("\n" );
64
64
}
65
65
66
-
67
66
void printAvgTurnaroundResponse (struct Process processes [], int n ){
68
67
int sum = 0 ;
69
68
for (int i = 0 ;i < n ;i ++ ){
@@ -206,9 +205,23 @@ struct log* shortestRemainingTimeFirst(struct Process processes[], int n) {
206
205
}
207
206
208
207
if (!job_found ) {
209
- current_time ++ ;
208
+ int temptime = INT_MAX ;
209
+ for (int i = 0 ;i < n ;i ++ ){
210
+ if (processes [i ].arrival_time > current_time && processes [i ].arrival_time < temptime ){
211
+ temptime = processes [i ].arrival_time ;
212
+ }
213
+ }
214
+ current_time = temptime ;
210
215
} else {
211
- int execution_time = 1 ; // Execute one unit of time
216
+ int execution_time = INT_MAX ; // Execute one unit of time
217
+ for (int i = 0 ;i < n ;i ++ ){
218
+ if (processes [i ].arrival_time > current_time && processes [i ].remaining_time > 0 && i != shortest_job_index ){
219
+ if (processes [i ].arrival_time - current_time < execution_time ){
220
+ execution_time = processes [i ].arrival_time - current_time ;
221
+ }
222
+ }
223
+ }
224
+ execution_time = (execution_time < processes [shortest_job_index ].remaining_time )?execution_time :processes [shortest_job_index ].remaining_time ;
212
225
current_time += execution_time ;
213
226
processes [shortest_job_index ].remaining_time -= execution_time ;
214
227
insertLog (& head ,processes [shortest_job_index ].pid ,current_time - execution_time ,current_time );
@@ -268,7 +281,7 @@ struct Process dequeue(struct Queue* queue) {
268
281
}
269
282
270
283
// Function to perform MLFQ scheduling
271
- struct log * mlfq (struct Process processes [], int n , int time_slice_high , int time_slice_med , int time_slice_low ) {
284
+ struct log * mlfq (struct Process processes [], int n , int time_slice_high , int time_slice_med , int time_slice_low , int boost ) {
272
285
struct Queue * queue_high = createQueue (n );
273
286
struct Queue * queue_med = createQueue (n );
274
287
struct Queue * queue_low = createQueue (n );
@@ -278,6 +291,7 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
278
291
279
292
int current_time = 0 ;
280
293
int completed = 0 ;
294
+ int boosttrack = 0 ;
281
295
282
296
while (completed < n ) {
283
297
for (int i = 0 ; i < n ; i ++ ) {
@@ -293,6 +307,12 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
293
307
if (!isEmpty (queue_high )) {
294
308
struct Process process = dequeue (queue_high );
295
309
int execution_time = (process .remaining_time < time_slice_high ) ? process .remaining_time : time_slice_high ;
310
+ if (boosttrack + execution_time > boost ){
311
+ execution_time = boost - boosttrack ;
312
+ boosttrack = 0 ;
313
+ }else {
314
+ boosttrack += execution_time ;
315
+ }
296
316
current_time += execution_time ;
297
317
process .remaining_time -= execution_time ;
298
318
@@ -324,6 +344,12 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
324
344
} else if (!isEmpty (queue_med )) {
325
345
struct Process process = dequeue (queue_med );
326
346
int execution_time = (process .remaining_time < time_slice_med ) ? process .remaining_time : time_slice_med ;
347
+ if (boosttrack + execution_time > boost ){
348
+ execution_time = boost - boosttrack ;
349
+ boosttrack = 0 ;
350
+ }else {
351
+ boosttrack += execution_time ;
352
+ }
327
353
current_time += execution_time ;
328
354
process .remaining_time -= execution_time ;
329
355
@@ -344,6 +370,12 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
344
370
} else if (!isEmpty (queue_low )) {
345
371
struct Process process = dequeue (queue_low );
346
372
int execution_time = (process .remaining_time < time_slice_low ) ? process .remaining_time : time_slice_low ;
373
+ if (boosttrack + execution_time > boost ){
374
+ execution_time = boost - boosttrack ;
375
+ boosttrack = 0 ;
376
+ }else {
377
+ boosttrack += execution_time ;
378
+ }
347
379
current_time += execution_time ;
348
380
process .remaining_time -= execution_time ;
349
381
@@ -362,7 +394,25 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
362
394
enqueue (queue_low , process );
363
395
}
364
396
} else {
365
- current_time ++ ; // No process is ready to execute, so move time forward
397
+ int temptime = INT_MAX ;
398
+ for (int i = 0 ;i < n ;i ++ ){
399
+ if (processes [i ].arrival_time > current_time && processes [i ].arrival_time < temptime ){
400
+ temptime = processes [i ].arrival_time ;
401
+ }
402
+ }
403
+ boosttrack += temptime - current_time ;
404
+ current_time = temptime ;
405
+ while (boosttrack >= boost ) boosttrack -= boost ;
406
+ }
407
+ if (boosttrack == 0 ){
408
+ while (!isEmpty (queue_med )){
409
+ struct Process process = dequeue (queue_med );
410
+ enqueue (queue_high ,process );
411
+ }
412
+ while (!isEmpty (queue_low )){
413
+ struct Process process = dequeue (queue_low );
414
+ enqueue (queue_high ,process );
415
+ }
366
416
}
367
417
}
368
418
@@ -397,6 +447,17 @@ int main(int argc, char **argv){
397
447
numberProcesses = i + 1 ;
398
448
}
399
449
450
+ // Sort processes by arrival time (ascending order)
451
+ for (int i = 0 ; i < numberProcesses - 1 ; i ++ ) {
452
+ for (int j = 0 ; j < numberProcesses - i - 1 ; j ++ ) {
453
+ if (processes [j ].arrival_time > processes [j + 1 ].arrival_time ) {
454
+ struct Process temp = processes [j ];
455
+ processes [j ] = processes [j + 1 ];
456
+ processes [j + 1 ] = temp ;
457
+ }
458
+ }
459
+ }
460
+
400
461
for (int i = 0 ;i < numberProcesses ;i ++ )clonedProcesses [i ]= processes [i ];
401
462
head = fcfs (clonedProcesses ,numberProcesses );
402
463
printLog (head );
@@ -418,7 +479,7 @@ int main(int argc, char **argv){
418
479
printAvgTurnaroundResponse (clonedProcesses ,numberProcesses );
419
480
420
481
for (int i = 0 ;i < numberProcesses ;i ++ )clonedProcesses [i ]= processes [i ];
421
- head = mlfq (clonedProcesses ,numberProcesses ,TsMLFQ1 ,TsMLFQ2 ,TsMLFQ3 );
482
+ head = mlfq (clonedProcesses ,numberProcesses ,TsMLFQ1 ,TsMLFQ2 ,TsMLFQ3 , BMLFQ );
422
483
printLog (head );
423
484
printAvgTurnaroundResponse (clonedProcesses ,numberProcesses );
424
485
0 commit comments