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

多くのバグがあると確信しています (プロセスの配列が 10 に制限されている場合でも、ユーザーが 11 以上のプロセスを入力することを気にしないことから始まります)。

でも; 私はあなたのコードを解読するのに 10 分間費やしましたが、それが何をしていると考えているのかまだよくわかりません - コメントはまったくなく、変数名と関数名は役に立ちません (例えばno、ブール値の "yes/no" 変数ではありません) 、checkprocess()1つのプロセスをチェックするのではなく、すべてのプロセスをチェックして、すべてのプロセスが終了したかどうかを確認するなど)。ほとんどの場合、このコードを修正するためにお金が支払われている場合、時間を節約するために単純にそれを破棄して最初から書き直します。ゼロから書き直して、結果のコードを投稿することを考えました。しかし、それは宿題の助けにはなりません。

私のアドバイスは、修正するのではなく、ゼロから書き直すことです。

グローバルcurrently_running_process変数、グローバルcurrent_time変数、現在の時刻を増やす関数、およびスケジューラ自体の関数が 1 つずつ必要です。

現在の時間を増やす関数は次のようになります。

  • スケジューラーのリンクされたリストの各プロセスについて、待機時間を増やします
  • 行うcurrent_time++
  • 開始する必要のあるプロセスを検索し ( current_time == arrival_time)、開始されたプロセスをスケジューラのリンク リストの最後に追加します。

スケジューラ関数は次のことを行う必要があります。

  • スケジューラのリンク リストから最初のプロセスを削除する
  • プロセスが使用する時間を決定します (タイム スライスの長さまたはプロセスの残り時間のいずれか短い方)
  • プロセスの残り時間からその時間を差し引く
  • increase_time()その時間が経過するまで、関数をループで呼び出します
  • プロセスの残り時間がゼロでない場合。プロセスをリンクされたリストの最後に戻します
  • プロセスの残り時間がゼロの場合は、スケジューラのリンク リストが空かどうかを確認し、そうであればプログラムを終了します。

注:current_time = -1;スケジューラー関数を呼び出す前に、関数を呼び出して現在の時刻を 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

このコードは、フォーマットが 1 行に 1 つのプロセス情報、到着時間バースト時間、間隔を持ち、ファイルが -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 に答える