Advertisement
Bewin

scheduling

Feb 29th, 2024 (edited)
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.47 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. int q[100],front=-1,rear=-1;
  5. struct process
  6. {
  7.     char name[20];
  8.     int at,tt,bt,wt,ct,pr,status,left;
  9. }p[20],temp;
  10.  
  11. struct done
  12. {
  13.     char name[20];
  14.     int st,ct;
  15. }d[20];
  16.  
  17. int n,num,idle=0;
  18. float average_wt=0,average_tt=0;
  19.  
  20. void enqueue(int j)
  21. {
  22.     if(front==-1 && rear==-1)
  23.     {
  24.         front++;
  25.     }
  26.     rear++;
  27.     q[rear] = j;
  28. }
  29. int dequeue()
  30. {
  31.     int item;
  32.     item = q[front];
  33.     if(front == rear)
  34.     {
  35.         front = -1;
  36.         rear = -1;
  37.     }
  38.     else
  39.     {
  40.         front++;
  41.     }
  42.     return item;
  43. }
  44.  
  45. void read(){
  46.     printf("ENTER THE NUMBER OF PROCESSES : ");
  47.     scanf("%d",&n);
  48.     for(int i=0;i<n;i++)
  49.     {
  50.         printf("\nENTER DETAILS OF PROCESS %d",i+1);
  51.         printf("\nPROCESS NAME : ");
  52.         scanf(" %s",p[i].name);
  53.         printf("ARRIVAL TIME : ");
  54.         scanf("%d",&p[i].at);
  55.         printf("BURST TIME : ");
  56.         scanf("%d",&p[i].bt);
  57.         printf("PRIORITY : ");
  58.         scanf("%d",&p[i].pr);
  59.         p[i].left = p[i].bt;
  60.         p[i].status = 0;
  61.     }
  62. }
  63.  
  64. void sort(){
  65.     for(int i=0;i<n;i++)
  66.     {
  67.         for(int j=0;j<n-i-1;j++)
  68.         {
  69.             if(p[j].at > p[j+1].at)
  70.             {
  71.                 temp = p[j];
  72.                 p[j] = p[j+1];
  73.                 p[j+1] = temp;
  74.             }
  75.         }
  76.     }
  77. }
  78.  
  79. void FCFS(){
  80.     int i,j;
  81.     for(i=0,j=0,num=0;j<n;)
  82.     {
  83.         if(p[j].at<=i && p[j].status==0)
  84.         {
  85.             if(idle==1)
  86.             {
  87.                 d[num].ct=i;
  88.                 num++;
  89.                 idle = 0;
  90.             }
  91.             strcpy(d[num].name,p[j].name);
  92.             d[num].st = i;
  93.             d[num].ct = i + p[j].bt;
  94.             p[j].wt = d[num].st - p[j].at;
  95.             p[j].tt = p[j].wt + p[j].bt;
  96.             p[j].ct = d[num].ct;
  97.             i = d[num].ct;
  98.             p[j].status = 1;
  99.             j++;
  100.             num++;
  101.  
  102.         }
  103.         else if(idle == 0)
  104.         {
  105.             strcpy(d[num].name,"Idle");
  106.             d[num].st = i;
  107.             i++;
  108.             idle = 1;
  109.         }
  110.         else
  111.         {
  112.             i++;
  113.         }
  114.     }
  115. }
  116.  
  117. void NP_SJF(){
  118.     int i,j,ls,fnd,min;
  119.     for(i=0,ls=0,num=0,idle=0;ls<n;){
  120.         for(j=0,fnd=0;j<n;j++)
  121.         {
  122.             if(i>=p[j].at && p[j].status==0)
  123.             {
  124.                 if(fnd==0){
  125.                     min = j;
  126.                     fnd = 1;
  127.                 }
  128.                 else if(p[min].bt>p[j].bt){
  129.                     min = j;
  130.                 }
  131.             }
  132.         }
  133.         if(idle==0 && fnd==0){
  134.             strcpy(d[num].name,"Idle");
  135.             d[num].st = i;
  136.             i++;
  137.             idle = 1;
  138.         }
  139.         else if(fnd==1){
  140.             if(idle==1){
  141.                 d[num].ct = i;
  142.                 num++;
  143.                 idle = 0;
  144.             }
  145.             strcpy(d[num].name,p[min].name);
  146.             p[min].status =1;
  147.             d[num].st = i;
  148.             d[num].ct = i + p[min].bt;
  149.             i = d[num].ct;
  150.             p[min].ct = d[num].ct;
  151.             p[min].tt = p[min].ct - p[min].at;
  152.             p[min].wt = p[min].tt - p[min].bt;
  153.             num++;
  154.             ls++;
  155.         }
  156.         else{
  157.             i++;
  158.         }
  159.     }
  160. }
  161.  
  162. void NP_Priority(){
  163.     int i,j,ls,fnd,min;
  164.     for(i=0,ls=0,num=0,idle=0;ls<n;)
  165.     {
  166.         for(j=0,fnd=0;j<n;j++)
  167.         {
  168.             if(i>=p[j].at && p[j].status==0)
  169.             {
  170.                 if(fnd==0)
  171.                 {
  172.                     min = j;
  173.                     fnd = 1;
  174.                 }
  175.                 else if((p[min].pr>p[j].pr)||(p[min].pr==p[j].pr && p[min].at>p[j].at))
  176.                 {
  177.                     min = j;
  178.                 }
  179.             }
  180.         }
  181.         if(idle==0 && fnd==0)
  182.         {
  183.             strcpy(d[num].name,"Idle");
  184.             d[num].st = i;
  185.             i++;
  186.             idle = 1;
  187.         }
  188.         else if(fnd==1)
  189.         {
  190.             if(idle==1)
  191.             {
  192.                 d[num].ct = i;
  193.                 num++;
  194.                 idle = 0;
  195.             }
  196.             strcpy(d[num].name,p[min].name);
  197.             p[min].status =1;
  198.             d[num].st = i;
  199.             d[num].ct = i + p[min].bt;
  200.             i = d[num].ct;
  201.             p[min].ct = d[num].ct;
  202.             p[min].tt = p[min].ct - p[min].at;
  203.             p[min].wt = p[min].tt - p[min].bt;
  204.             num++;
  205.             ls++;
  206.         }
  207.         else
  208.         {
  209.             i++;
  210.         }
  211.     }
  212. }
  213.  
  214. void round_robin(){
  215.     int i,j,k,ls,t;
  216.     printf("\nENTER THE TIME QUANTUM : ");
  217.     scanf("%d",&t);
  218.  
  219.     for(i=0,num=0,ls=0;ls<n;)
  220.     {
  221.         for(j=0;j<n;j++)
  222.         {
  223.           if(p[j].status==0 && p[j].at<=i)
  224.           {
  225.             enqueue(j);
  226.             p[j].status = 1;
  227.           }
  228.         }
  229.         if(idle==0 && front == -1)
  230.         {
  231.           strcpy(d[num].name,"Idle");
  232.           d[num].st = i;
  233.           idle = 1;
  234.           i++;
  235.         }
  236.         else if(front!=-1)
  237.         {
  238.           if(idle==1)
  239.           {
  240.             d[num].ct = i;
  241.             idle = 0;
  242.             num++;
  243.           }
  244.           k = dequeue();
  245.           d[num].st = i;
  246.           strcpy(d[num].name,p[k].name);
  247.           if(p[k].left<=t)
  248.           {
  249.             d[num].ct = i+p[k].left;
  250.             p[k].ct = d[num].ct;
  251.             i = d[num].ct;
  252.             p[k].tt = i - p[k].at;
  253.             p[k].wt = p[k].tt - p[k].bt;
  254.             p[k].status = 2;
  255.             ls++;
  256.             num++;
  257.           }
  258.           else if(p[k].left>t)
  259.           {
  260.             d[num].ct = i+t;
  261.             i = d[num].ct;
  262.             p[k].left = p[k].left-t;
  263.             num++;
  264.             for(j=0;j<n;j++)
  265.             {
  266.               if(p[j].status==0 && p[j].at<=i)
  267.               {
  268.                 enqueue(j);
  269.                 p[j].status = 1;
  270.               }
  271.             }
  272.             enqueue(k);
  273.           }
  274.         }
  275.         else
  276.         {
  277.           i++;
  278.         }
  279.     }
  280. }
  281.  
  282. void print(){
  283.     printf("\n==============================================================================================================");
  284.     printf("\n| NAME\t\t| ARRIVAL\t| BURST\t\t| Priority\t| COMPLETION\t| WAITING\t| TURNAROUND |\n");
  285.     printf("--------------------------------------------------------------------------------------------------------------\n");
  286.     for(int i=0;i<n;i++)
  287.     {
  288.         printf("|  %-4s\t\t| %-7d\t| %-5d\t\t| %-8d\t| %-10d\t| %-7d\t| %-10d |\n",p[i].name,p[i].at,p[i].bt,p[i].pr,p[i].ct,p[i].wt,p[i].tt);
  289.         average_wt+=p[i].wt;
  290.         average_tt+=p[i].tt;
  291.     }
  292.     printf("==============================================================================================================\n");
  293.     printf("\n\nGANTT CHART ");
  294.     printf("\n\t--------------------------------------------------------------------------\n\t");
  295.     for(int i=0;i<num;i++)
  296.     {
  297.         printf("|");
  298.         printf("%s\t",d[i].name);
  299.     }
  300.     printf(" |");
  301.     printf("\n\t--------------------------------------------------------------------------\n\t");
  302.     for(int i=0;i<num;i++)
  303.     {
  304.         printf("%d\t",d[i].st);
  305.     }
  306.     printf("%d\t",d[num-1].ct);
  307.     printf("\n\nAVERAGE WAITING TIME : %f",(average_wt/n));
  308.     printf("\nAVERAGE TURNAROUND TIME : %f\n",(average_tt/n));
  309. }
  310. int main()
  311. {
  312.     int arg1,arg2;
  313.  
  314.     while(1){
  315.         printf("Enter your choice:\n");
  316.         printf("1. Non-Preemptive\n2. Preemptive\n0.Exit\n");
  317.         scanf("%d",&arg1);
  318.         switch(arg1){
  319.             case 1:
  320.             {
  321.                 printf("Enter your choice:\n");
  322.                 printf("1. FCFS\n2. SJF\n3. Priority\n");
  323.                 scanf("%d",&arg2);
  324.                 switch(arg2){
  325.                     case 1://FCFS
  326.                     {
  327.                         read();
  328.                         sort();
  329.                         FCFS();
  330.                         print();
  331.                         break;
  332.                     }
  333.                     case 2://SJF
  334.                     {
  335.                         read();
  336.                         NP_SJF();
  337.                         print();
  338.                         break;
  339.                     }
  340.                     case 3://Priority
  341.                     {
  342.                         read();
  343.                         NP_Priority();
  344.                         print();
  345.                         break;
  346.                     }
  347.                 }
  348.                 break;
  349.             }
  350.             case 2: {
  351.                 printf("Enter your choice:\n");
  352.                 printf("1. Round-Robin\n");
  353.                 scanf("%d", &arg2);
  354.                 switch (arg2) {
  355.                     case 1: //Round-Robin
  356.                     {
  357.                         read();
  358.                         round_robin();
  359.                         print();
  360.                         break;
  361.                     }
  362.                 }
  363.                 break;
  364.             }
  365.             case 0:
  366.                 exit(0);
  367.         }
  368.     }
  369. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement