c - Round Robin Scheduling Issue -


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; }