Skip to content

Commit 8847237

Browse files
committed
mlfq main.c done
1 parent 4148081 commit 8847237

File tree

2 files changed

+156
-2
lines changed

2 files changed

+156
-2
lines changed

Assignment-2/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
default:
2-
gcc main.c -o main && ./main input_example.txt output.txt 5 1 2 3 6
2+
gcc main.c -o main && ./main input_example.txt output.txt 5 5 10 15 1
33
clean:
44
rm -f main.o

Assignment-2/main.c

+155-1
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,156 @@ struct log* shortestRemainingTimeFirst(struct Process processes[], int n) {
228228
}
229229

230230

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+
231381

232382
int main(int argc, char **argv){
233383
FILE *input = fopen(argv[1],"r");
@@ -266,7 +416,11 @@ int main(int argc, char **argv){
266416
head = shortestRemainingTimeFirst(clonedProcesses,numberProcesses);
267417
printLog(head);
268418
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);
270424

271425
return 0;
272426
}

0 commit comments

Comments
 (0)