@@ -228,6 +228,156 @@ struct log* shortestRemainingTimeFirst(struct Process processes[], int n) {
228
228
}
229
229
230
230
231
+ struct Queue {
232
+ int front , rear , size ;
233
+ unsigned capacity ;
234
+ struct Process * array ;
235
+ };
236
+
237
+ // Function to create a queue with a given capacity
238
+ struct Queue * createQueue (unsigned capacity ) {
239
+ struct Queue * queue = (struct Queue * )malloc (sizeof (struct Queue ));
240
+ queue -> capacity = capacity ;
241
+ queue -> size = 0 ;
242
+ queue -> front = 0 ;
243
+ queue -> rear = capacity - 1 ;
244
+ queue -> array = (struct Process * )malloc (queue -> capacity * sizeof (struct Process ));
245
+ return queue ;
246
+ }
247
+
248
+ // Function to check if a queue is empty
249
+ bool isEmpty (struct Queue * queue ) {
250
+ return (queue -> size == 0 );
251
+ }
252
+
253
+ // Function to enqueue a process
254
+ void enqueue (struct Queue * queue , struct Process process ) {
255
+ if (queue -> size == queue -> capacity )
256
+ return ;
257
+ queue -> rear = (queue -> rear + 1 ) % queue -> capacity ;
258
+ queue -> array [queue -> rear ] = process ;
259
+ queue -> size += 1 ;
260
+ }
261
+
262
+ // Function to dequeue a process
263
+ struct Process dequeue (struct Queue * queue ) {
264
+ struct Process process = queue -> array [queue -> front ];
265
+ queue -> front = (queue -> front + 1 ) % queue -> capacity ;
266
+ queue -> size -= 1 ;
267
+ return process ;
268
+ }
269
+
270
+ // 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 ) {
272
+ struct Queue * queue_high = createQueue (n );
273
+ struct Queue * queue_med = createQueue (n );
274
+ struct Queue * queue_low = createQueue (n );
275
+ struct log * head = NULL ;
276
+ int queued [n ];
277
+ for (int i = 0 ;i < n ;i ++ ) queued [i ]= 0 ;
278
+
279
+ int current_time = 0 ;
280
+ int completed = 0 ;
281
+
282
+ while (completed < n ) {
283
+ for (int i = 0 ; i < n ; i ++ ) {
284
+ if (processes [i ].arrival_time <= current_time && queued [i ]== 0 ) {
285
+ if (processes [i ].remaining_time > 0 ) {
286
+ enqueue (queue_high , processes [i ]);
287
+ queued [i ]= 1 ;
288
+ }
289
+ }
290
+ }
291
+
292
+ // Dequeue from the highest-priority queue first
293
+ if (!isEmpty (queue_high )) {
294
+ struct Process process = dequeue (queue_high );
295
+ int execution_time = (process .remaining_time < time_slice_high ) ? process .remaining_time : time_slice_high ;
296
+ current_time += execution_time ;
297
+ process .remaining_time -= execution_time ;
298
+
299
+ insertLog (& head ,process .pid ,current_time - execution_time ,current_time );
300
+
301
+ if (process .response_time == -1 ){
302
+ process .response_time = 1 ;
303
+ for (int i = 0 ;i < n ;i ++ ){
304
+ if (strcmp (process .pid ,processes [i ].pid ) == 0 ){
305
+ processes [i ].response_time = current_time - processes [i ].arrival_time - execution_time ;
306
+ break ;
307
+ }
308
+ }
309
+ process .response_time = current_time - process .arrival_time - execution_time ;
310
+ }
311
+
312
+ if (process .remaining_time == 0 ) {
313
+ completed ++ ;
314
+ process .turnaround_time = current_time - process .arrival_time ;
315
+ for (int i = 0 ;i < n ;i ++ ){
316
+ if (strcmp (process .pid ,processes [i ].pid ) == 0 ){
317
+ processes [i ].turnaround_time = current_time - processes [i ].arrival_time ;
318
+ break ;
319
+ }
320
+ }
321
+ } else {
322
+ enqueue (queue_med , process );
323
+ }
324
+ } else if (!isEmpty (queue_med )) {
325
+ struct Process process = dequeue (queue_med );
326
+ int execution_time = (process .remaining_time < time_slice_med ) ? process .remaining_time : time_slice_med ;
327
+ current_time += execution_time ;
328
+ process .remaining_time -= execution_time ;
329
+
330
+ insertLog (& head ,process .pid ,current_time - execution_time ,current_time );
331
+
332
+ if (process .remaining_time == 0 ) {
333
+ completed ++ ;
334
+ process .turnaround_time = current_time - process .arrival_time ;
335
+ for (int i = 0 ;i < n ;i ++ ){
336
+ if (strcmp (process .pid ,processes [i ].pid ) == 0 ){
337
+ processes [i ].turnaround_time = current_time - processes [i ].arrival_time ;
338
+ break ;
339
+ }
340
+ }
341
+ } else {
342
+ enqueue (queue_low , process );
343
+ }
344
+ } else if (!isEmpty (queue_low )) {
345
+ struct Process process = dequeue (queue_low );
346
+ int execution_time = (process .remaining_time < time_slice_low ) ? process .remaining_time : time_slice_low ;
347
+ current_time += execution_time ;
348
+ process .remaining_time -= execution_time ;
349
+
350
+ insertLog (& head ,process .pid ,current_time - execution_time ,current_time );
351
+
352
+ if (process .remaining_time == 0 ) {
353
+ completed ++ ;
354
+ process .turnaround_time = current_time - process .arrival_time ;
355
+ for (int i = 0 ;i < n ;i ++ ){
356
+ if (strcmp (process .pid ,processes [i ].pid ) == 0 ){
357
+ processes [i ].turnaround_time = current_time - processes [i ].arrival_time ;
358
+ break ;
359
+ }
360
+ }
361
+ } else {
362
+ enqueue (queue_low , process );
363
+ }
364
+ } else {
365
+ current_time ++ ; // No process is ready to execute, so move time forward
366
+ }
367
+ }
368
+
369
+ free (queue_high -> array );
370
+ free (queue_med -> array );
371
+ free (queue_low -> array );
372
+ free (queue_high );
373
+ free (queue_med );
374
+ free (queue_low );
375
+
376
+ combineLogs (head );
377
+ return head ;
378
+ }
379
+
380
+
231
381
232
382
int main (int argc , char * * argv ){
233
383
FILE * input = fopen (argv [1 ],"r" );
@@ -266,7 +416,11 @@ int main(int argc, char **argv){
266
416
head = shortestRemainingTimeFirst (clonedProcesses ,numberProcesses );
267
417
printLog (head );
268
418
printAvgTurnaroundResponse (clonedProcesses ,numberProcesses );
269
- // MLFQ();
419
+
420
+ for (int i = 0 ;i < numberProcesses ;i ++ )clonedProcesses [i ]= processes [i ];
421
+ head = mlfq (clonedProcesses ,numberProcesses ,TsMLFQ1 ,TsMLFQ2 ,TsMLFQ3 );
422
+ printLog (head );
423
+ printAvgTurnaroundResponse (clonedProcesses ,numberProcesses );
270
424
271
425
return 0 ;
272
426
}
0 commit comments