gpt4 book ai didi

c - 循环调度程序

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:26 24 4
gpt4 key购买 nike

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

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

谢谢

最佳答案

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

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

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

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

增加当前时间的函数是:

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

调度函数应该:

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

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

关于c - 循环调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com