Skip to content

Commit c6af6b8

Browse files
committed
sorting,boosting,preparing for double times
1 parent 8847237 commit c6af6b8

File tree

2 files changed

+68
-7
lines changed

2 files changed

+68
-7
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 5 10 15 1
2+
gcc main.c -o main && ./main input_example.txt output.txt 5 5 10 15 2147483647
33
clean:
44
rm -f main.o

Assignment-2/main.c

+67-6
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ void printLog(struct log *head){
6363
printf("\n");
6464
}
6565

66-
6766
void printAvgTurnaroundResponse(struct Process processes[], int n){
6867
int sum = 0;
6968
for(int i=0;i<n;i++){
@@ -206,9 +205,23 @@ struct log* shortestRemainingTimeFirst(struct Process processes[], int n) {
206205
}
207206

208207
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;
210215
} 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;
212225
current_time += execution_time;
213226
processes[shortest_job_index].remaining_time -= execution_time;
214227
insertLog(&head,processes[shortest_job_index].pid,current_time - execution_time,current_time);
@@ -268,7 +281,7 @@ struct Process dequeue(struct Queue* queue) {
268281
}
269282

270283
// 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) {
272285
struct Queue* queue_high = createQueue(n);
273286
struct Queue* queue_med = createQueue(n);
274287
struct Queue* queue_low = createQueue(n);
@@ -278,6 +291,7 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
278291

279292
int current_time = 0;
280293
int completed = 0;
294+
int boosttrack = 0;
281295

282296
while (completed < n) {
283297
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
293307
if (!isEmpty(queue_high)) {
294308
struct Process process = dequeue(queue_high);
295309
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+
}
296316
current_time += execution_time;
297317
process.remaining_time -= execution_time;
298318

@@ -324,6 +344,12 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
324344
} else if (!isEmpty(queue_med)) {
325345
struct Process process = dequeue(queue_med);
326346
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+
}
327353
current_time += execution_time;
328354
process.remaining_time -= execution_time;
329355

@@ -344,6 +370,12 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
344370
} else if (!isEmpty(queue_low)) {
345371
struct Process process = dequeue(queue_low);
346372
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+
}
347379
current_time += execution_time;
348380
process.remaining_time -= execution_time;
349381

@@ -362,7 +394,25 @@ struct log* mlfq(struct Process processes[], int n, int time_slice_high, int tim
362394
enqueue(queue_low, process);
363395
}
364396
} 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+
}
366416
}
367417
}
368418

@@ -397,6 +447,17 @@ int main(int argc, char **argv){
397447
numberProcesses = i+1;
398448
}
399449

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+
400461
for(int i=0;i<numberProcesses;i++)clonedProcesses[i]=processes[i];
401462
head = fcfs(clonedProcesses,numberProcesses);
402463
printLog(head);
@@ -418,7 +479,7 @@ int main(int argc, char **argv){
418479
printAvgTurnaroundResponse(clonedProcesses,numberProcesses);
419480

420481
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);
422483
printLog(head);
423484
printAvgTurnaroundResponse(clonedProcesses,numberProcesses);
424485

0 commit comments

Comments
 (0)