so writing simple round robin scheduler time slice of 1.
here input (first number arrival time, second burst time)
0 3 2 6 4 4 6 5 8 2
and here expected output (cpu being executed, ready queue waiting. letter of alphabet used indicate process being run , number after remaining time):
time cpu ready queue (pid/rst) ---- --- --------------------- 0 a3 -- 1 a2 -- 2 b6 a1 3 a1 b5 4 b5 c4 5 c4 b4 6 b4 d5, c3 7 d5 c3, b3 8 c3 b3, e2, d4 9 b3 e2, d4, c2 10 e2 d4, c2, b2 11 d4 c2, b2, e1 12 c2 b2, e1, d3 13 b2 e1, d3, c1 14 e1 d3, c1, b1 15 d3 c1, b1 16 c1 b1, d2 17 b1 d2 18 d2 -- 19 d1 --
however having error ready queue. arrivals should added rear of ready queue before preemptions (see how d5 added ready queue ahead of c3)
this getting:
time cpu ready_queue (pid/rst) ---- --- --------------------- 0 a3 -- 1 a2 -- 2 b6 -- 3 a1 -- 4 b5 -- 5 c4 -- 6 d5 -- 7 b4 -- 8 c3 -- 9 d4 -- 10 e2 -- 11 b3 -- 12 c2 -- 13 d3 -- 14 e1 -- 15 b2 -- 16 c1 -- 17 d2 -- 18 b1 -- 19 d1 --
here code:
#include <stdio.h> #include <stdlib.h> #define ts 1 struct process { char pid; int arrival_time; int service_time; int remaining_time; int departure_time; int turnaround_time; int wait_time; }; struct process processes[26]; char pid_rst[2]; char alphabet[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; int num_processes = 0; int total_time; char* create_id(char c, int i) { sprintf(pid_rst, "%c%d", c, i); return pid_rst; } void get_processes() { int a_t; int s_t; int = 0; while((scanf("%d %d", &a_t, &s_t) == 2)) { processes[i].pid = alphabet[i]; processes[i].arrival_time = a_t; processes[i].service_time = s_t; processes[i].remaining_time = processes[i].service_time; i++; num_processes++; total_time += processes[i].service_time; } } int main() { int time; int count; int remain; int flag = 0; int i; int w; get_processes(); char* cpu_queue[1]; char* wait_queue[num_processes]; remain = num_processes; for(i = 0; < num_processes; i++) { wait_queue[i] = "--"; } printf("\ntime\tcpu\tready_queue (pid/rst)\n"); printf("----\t---\t---------------------\n"); for(time = 0, = 0; remain != 0;) { w = 1; if(processes[i].remaining_time <= ts && processes[i].remaining_time > 0) { printf(" %d\t%s\t%s\n", time, create_id(processes[i].pid, processes[i].remaining_time), wait_queue[w-1]); time += processes[i].remaining_time; processes[i].remaining_time = 0; flag = 1; } else if (processes[i].remaining_time > 0) { printf(" %d\t%s\t%s\n", time, create_id(processes[i].pid, processes[i].remaining_time), wait_queue[w-1]); processes[i].remaining_time -= ts; time += ts; } if(processes[i].remaining_time == 0 && flag == 1) { remain--; processes[i].turnaround_time += time - processes[i].arrival_time; processes[i].wait_time += time - processes[i].arrival_time - processes[i].service_time; processes[i].departure_time = time; flag = 0; } if(i == num_processes-1) { = 0; } else if(processes[i+1].arrival_time <= time) { wait_queue[w] = create_id(processes[i].pid, processes[i].remaining_time); if(w < 4) w++; i++; } else { = 0; } } return 0; }