1

我一直在研究循环调度程序。我的输入是:

Process     Arrival Time    Burst Time
   1            0               4
   2            2               2
   3            4               3
   4            6               5
   5            7               1

时间片是3个单位!我的输出必须是:

Process     AT      BT      WT      TT      FT
   1        0       4       9       13      13
   2        2       2       1       3       5
   3        4       3       1       4       8
   4        6       5       4       9       15
   5        7       1       4       5       12

但我没有得到流程 1、4 和 5 的正确结果(WT 和 FT)。这是我的代码,谁能帮我修复它并获得上述结果?

#include<stdio.h>
#include<conio.h>
struct proc
{
    int id;
    int arrival;
    int burst;
    int rem;
    int wait;
    int finish;
    int ti;
    int turnaround;
    float ratio;
}process[10];

int no,k;
int chkprocess(int);

void main()
{
 int i,j,t,time = 0,n;
 struct proc temp;
 int nextprocess(int);
 clrscr();
 printf("\n \n Enter the number of processes: ");
 scanf("%d", &n);
 printf("\n \n Enter the time slice of the CPU: ");
 scanf("%d", &t);

 for(i = 1; i <= n; i++)
 {
  process[i].id = i;
  printf("\n\nEnter the arrival time for process %d: ", i);
  scanf("%d", &(process[i].arrival));
  printf("\nEnter the burst time for process %d: ", i);
  scanf("%d", &(process[i].burst));
  process[i].rem = process[i].burst;
  process[i].ti=0;
  process[i].wait=0;
  process[i].finish=0;
 }

 for(i = 1; i <= n; i++)
 {
  for(j = i + 1; j <= n; j++)
  {
   if(process[i].arrival > process[j].arrival)
   {
    temp = process[i];
    process[i] = process[j];
    process[j] = temp;
   }
  }
 }

 no = 0;
 j = 1;

 while(chkprocess(n) == 1)
 {
  if(process[no + 1].arrival == time)
   no++;
  if((process[j].ti<=t)&&(process[j].rem !=0))
  {
   process[j].rem--;
   process[j].ti++;
   for(i = 1; i <= no; i++)
   {
    if((i!=j) && (process[i].rem != 0))
     process[i].wait++;
   }
  }
  if(process[j].rem==0)
   process[j].finish=time;
  if((process[j].ti >= t)||(process[j].rem==0))
  {
   process[j].ti = 0;
   j=nextprocess(j);
  }
  time++;
 }
 process[n].finish = time;
 printf("\n\n Process  Arrival  Burst   Waiting  Finishing turnaround  Tr/Tb \n");
 printf("%5s %9s %7s %10s %8s %9s\n\n", "id", "time", "time", "time", "time", "time");
 for(i = 1; i <= n; i++)
 {
  process[i].turnaround = process[i].wait + process[i].burst;
  process[i].ratio = (float)process[i].turnaround / (float)process[i].burst;
  printf("%5d %8d %7d  %8d %10d %9d %10.1f ", process[i].id, process[i].arrival,
                          process[i].burst,
                          process[i].wait, process[i].finish,
                          process[i].turnaround, process[i].ratio);

  printf("\n\n");
 }
 getch();
}

int chkprocess(int s)
{
 int i;
 for(i = 1; i <= s; i++)
 {
  if(process[i].rem != 0)
   return 1;
 }
 return 0;
}

int nextprocess(int k)
{
 int i;
 i=k+1;
 while(chkprocess(i) && i!=k)
 {
  if(process[i].rem != 0)
   return i;
  else
   i=(i+1)%no;
 }
}

谢谢你

4

6 回答 6

4

我敢肯定有很多错误(从不关心用户是否要输入 11 个或更多进程开始,即使您的进程数组限制为 10 个)。

然而; 我花了 10 分钟试图破译你的代码,但仍然不知道它认为它在做什么 - 根本没有评论,变量名和函数名没有帮助(例如no,不是布尔“是/否”变量,checkprocess()不检查一个进程,而是检查所有进程以查看所有进程是否已完成等)。大多数情况下,如果我得到报酬来修复此代码,我会简单地将其扔掉并从头开始重写以节省时间。我想过从头开始重写它并发布结果代码;但这对你的家庭作业没有帮助。

我的建议是,从头开始重写而不是修复它。

它应该有一个全局currently_running_process变量,一个全局current_time变量,一个增加当前时间的函数,以及一个调度程序本身的函数。

增加当前时间的功能将:

  • 对于调度器链表上的每个进程,增加等待时间
  • current_time++
  • 找到任何应​​该启动的进程 ( current_time == arrival_time) 并将任何启动的进程附加到调度程序链表的末尾

调度程序功能应该:

  • 从调度程序的链表中删除第一个进程
  • 确定该进程应该使用多少时间(时间片长度或进程的剩余时间,以较低者为准)
  • 从进程的剩余时间中减去该时间量
  • 在循环中调用increase_time()函数,直到经过该时间量
  • 如果进程的剩余时间不为零;将进程放回链表的末尾
  • 如果进程剩余时间为零,则检查调度器的链表是否为空,如果是则退出程序

注意:在调用调度程序函数之前,我会current_time = -1;先调用该函数以增加当前时间一次;这样任何进程arrival_time == 0都将在调度程序开始工作之前添加到调度程序的链表中(并且这样调度程序函数在启动后就不会看到一个空列表)。

于 2013-02-16T18:56:58.137 回答
2
/* The following code doesn't take the arrival time of the processes in account.
                              HAPPY CODING */
#include<stdio.h>
void main()
{
int b[10],br[10],wo[10];
int n,i,bt,q,count;
float awt=0,att=0;
for (i=0;i<10;i++)
     wo[i]=0;
printf("Input the nmbr of processes running....");
scanf("%d",&n);
printf("\n Input their burst tym in order..");
for(i=0;i<n;i++)
    scanf("%d",&b[i]);
printf("\n Input the quantum time for the algorithm..");
scanf("%d",&q);
for(i=0;i<n;i++)
    br[i]=b[i];
bt=0;
for(i=0;i<n;i++)
    bt=bt+b[i];
count=0;
printf("\nThe Gantt Chart is as follows:\n");
printf("\n 0");
do
{
for(i=0;i<n;i++)
{
  if(br[i]==0)
   {}
  else
  {
   if(br[i]>=q)
   {
     br[i]=br[i]-q;
     if(br[i]==0)
        wo[i]=count;
     count=count+q;
     printf("\t(P%d)",i);
     printf("\t%d",count);
   }
   else
   {
     if(br[i]<q)
    {
       count=count+br[i];
       br[i]=0;
       wo[i]=count;
       printf("\t(P%d)",i);
       printf("\t%d",count);
     }
   }
 }
}
}while(count<bt);
for(i=0;i<n;i++)
    awt=awt+(wo[i]-b[i]);
awt=awt/n;
printf("\n The average waiting time is....%f",awt);
for(i=0;i<n;i++)
    att=att+wo[i];
att=att/n;
printf("\n The average turnaround time is....%f",att);
}
于 2013-10-06T18:21:04.400 回答
1

您可以使用队列来做同样的事情,我正在粘贴一个用 ANSI CPP 编写的链接。您可以查看此链接以获取更多信息。我遇到了和你一样的问题,但是链接上的代码对我帮助很大,它还包含许多其他调度程序,但我只从中提取了循环。 单击此处查看循环调度的代码

于 2014-04-03T17:46:11.153 回答
0

C中的循环调度程序

#include<stdio.h>
#include<conio.h>

main(){

    int i, j, k, n, so, tq, sob, sum, swt, stat, tata, temp, count;
    int bt[10], bth[10], wt[10], tat[10];
    float awt=0.0, atat=0.0;
    char new;

    // i = loop controller
    // j = loop controller
    // k = loop controller
    // n = number of process
    // so = (burst time holder divided by time quantum) and added by one
    // tq = time quantum
    // awt =average waiting time
    // new = hold the value of start command
    // sob = gantt chart size from so
    // swt = summation of waiting time              l
    // bt[] = burst time
    // wt[] = waiting time
    // atat = average turn around time
    // gcps = gantt chart process sequence
    // stat = summation of turn around time
    // tata = accumulator of turn around time
    // temp = time quantum holder
    // count = counter
    // bth[] = burst time holder
    // tat[] = turn around time



    printf("\n\n\n\n   To start round robin scheduling press any key: ");

    k = 0;
    new = getche();
    system("cls");

    while(k < 7){

        j = 0; sob = 0; count = 0; sum = 0; swt = 0; stat = 0; tata = 0;

        printf("\n\n\n\t\t\t      ROUND-ROBIN SCHEDULING");
        printf("\n\t\t\t      ======================");
        printf("\n\n\n\n\n   Enter number of processes: ");
        scanf("%d", &n);
        printf("\n");

        for(i = 0; i < n; i++){

            printf("\n   Enter burst time for Process P%d: ", i+1);
            scanf("%d", &bt[i]);
            bth[i] = bt[i];
        }

        printf("\n\n   Enter time quantum: ");
        scanf("%d", &tq);
        system("cls");
        printf("\n\n\n\t\t\t      ROUND-ROBIN SCHEDULING");
        printf("\n\t\t\t      ======================");
        printf("\n\n\n\n\n   Time quantum: %d", tq);

        for(i = 0; i < n; i++){

            if(bth[i] % tq == 0){

                so = bth[i] / tq;
            }
            else{so = (bth[i] / tq) +1;}
            sob = sob + so;
        }

        int gc[sob], gcps[sob];

        while(1){

            for(i = 0,count = 0; i < n; i++){

                temp = tq;
                if(bth[i] == 0){

                    count++;
                    continue;
                }

                if(bth[i] > tq){

                    gc[j] = tq;
                    gcps[j] = i+1; j++;
                    bth[i] = bth[i] - tq;
                }

                else if(bth[i] >= 0){

                    if(bth[i] == tq){gc[j] = tq; gcps[j] = i+1; j++;}
                    else{gc[j] = bth[i]; gcps[j] = i+1; j++;}
                    temp = bth[i];
                    bth[i] = 0;
                }

                tata = tata + temp;
                tat[i ]= tata;
            }

            if(n==count){

                break;
            }
        }

        for(i = 0; i < n; i++){

            wt[i] = tat[i] - bt[i];
            swt = swt + wt[i];
            stat = stat + tat[i];
        }

        awt = (float)swt/n;
        atat = (float)stat/n;

        printf("\n\n   Process   Burst time   Waiting time   Turn around time\n");
        printf("   -------   ----------   ------------   ----------------\n");

        for(i = 0; i < n; i++){

            printf("\n\n      P%d\t %d\t       %d \t        %d", i+1, bt[i], wt[i], tat[i]);
        }

        printf("\n\n\n\n   Gantt Chart:\n");
        printf("   ------------\n\n");
        for(j = 0; j < sob; j++){

            printf("\tP%d", gcps[j]);
        }
        printf("\n   0");
        for(j = 0; j < sob; j++){

            sum = sum + gc[j];
            if(j == 0){printf("        %d", sum);}
            else{printf("\t    %d", sum);}
        }
        printf("\n\n\n\n   Average waiting time: %.2f \n\n   Average turn around time: %.2f",awt,atat);
        printf("\n\n\n\n   To start again press S and to exit press any key: ");

        new = getche();
        system("cls");

        if(new == 'S'|| new == 's'){k++;}
        else{printf("\n\n\n   Program was terminated successfully\n\n   Thank you\n\n\n"); break;}

    }

}
于 2014-07-12T19:36:45.410 回答
0

此代码将从文件中读取数据,其格式应在一行中包含一个进程信息,到达时间突发时间、间隔,并且文件应以 -1 结尾。文件名和时间片必须在命令参数中传递。像:

0 3
1 2
2 1
-1

代码是 C 语言,变量名是自描述的。

#include<stdio.h>

int main(int argc, char *argv[])
{
int flag = 0;

int timeSlice = atoi(argv[2]);

printf("%d\n\n", timeSlice);

int arrivalTime[10], burstTime[10], responseTime[10], finishTime[10];
int remainingProcesses, processCount = 0;

FILE * file = fopen(argv[1], "r");

if (!(file == NULL))
{
    while (fscanf(file, "%d", &arrivalTime[processCount]))
    {
        if (arrivalTime[processCount] == -1)
            break;

        fscanf(file, "%d", &burstTime[processCount]);

        responseTime[processCount] = burstTime[processCount];

        processCount++;
    }

    remainingProcesses = processCount;

    fclose(file);
}

printf("Process\t|  Arrival time\t|  Finish Time\t|     Burst\t|   Turnaround\t|\n");
printf("-------------------------------------------------------------------------\n");

int i = 0; int time = 0;

while (remainingProcesses != 0)
{
    if (responseTime[i] <= timeSlice && responseTime[i]>0)
    {
        time += responseTime[i];
        responseTime[i] = 0;
        flag = 1;
    }
    else if (responseTime[i] > 0)
    {
        responseTime[i] -= timeSlice;
        time += timeSlice;
    }

    if (responseTime[i] == 0 && flag == 1)
    {
        finishTime[i] = time;
        remainingProcesses--;

        printf("P[%d]\t|\t%d\t|\t%d\t|\t%d\t|\t%d\t|\n", i + 1, arrivalTime[i], finishTime[i], burstTime[i], finishTime[i] - arrivalTime[i]);
        flag = 0;
    }


    if (i == processCount - 1) // If its the last process go back to slicing process 1
    {
        i = 0;
    }

    else if (arrivalTime[i + 1] <= time) // If the next process has kicked in
    {
        i++;
    }

    else // If the process haven't kicked in yet
    {
        time++;
        i = 0;
    }
}

return 0;
}
于 2015-11-23T12:55:28.610 回答
0

特别感谢kanika

我只是修改了一些代码。输出: 在此处输入图像描述

#include<stdio.h>
void main()
{
int bt[10],btTmp[10],tat[10];
int n,i,btAll,quantum,count;
float awt=0,att=0;
for (i=0;i<10;i++)
     tat[i]=0;
     
printf("Input the number of processes : ");
scanf("%d",&n);
printf("\n Input their burst time in order : ");
for(i=0;i<n;i++){
     scanf("%d",&bt[i]);
     btTmp[i]=bt[i];
}
   
printf("\n Input the quantum time : ");
scanf("%d",&quantum);

btAll=0;
for(i=0;i<n;i++)
    btAll=btAll+bt[i];
    
count=0;

while(count<btAll)
{
for(i=0;i<n;i++)
{
  if(btTmp[i]==0)
   {}
  else
  {
   if(btTmp[i]>=quantum)
   {
     btTmp[i]=btTmp[i]-quantum;
     if(btTmp[i]==0)
        tat[i]=count+quantum;
     count=count+quantum;
   }
   else
   {
       count=count+btTmp[i];
       btTmp[i]=0;
       tat[i]=count;

   }
 }
}
}
 printf("\nprocess \t bt time \t wt time \t TAT\n");
for(i=0;i<n;i++){
    printf(" \tP%d \t\t  %d \t\t  %d \t \t %d\n",i, bt[i], tat[i]-bt[i], tat[i]);
    awt=awt+(tat[i]-bt[i]);
    att=att+tat[i];
}

printf("\n The average waiting time is %f :  ",awt/n);
printf("\n The average turnaround time is....%f :  ",att/n);
}
于 2021-09-24T19:42:41.573 回答