C语言 循环调度程序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14912813/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Round Robin Scheduling Program
提问by Ankur Sinha
I have been working on a Round Robin Scheduling Program. My inputs are:
我一直在研究循环调度程序。我的输入是:
Process Arrival Time Burst Time
1 0 4
2 2 2
3 4 3
4 6 5
5 7 1
Time Slice is 3 units! My output must be:
时间片是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
But I am not getting the correct results(WT & FT) for Process 1, 4 & 5. Here's my code, can anyone please help me fix it and get the above results?
但是我没有得到流程 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;
}
}
Thank You
谢谢你
回答by Brendan
I'm sure there are many bugs (starting with not caring if the user wants to enter 11 or more processes even though your array of processes is limited to 10).
我确定有很多错误(从不关心用户是否想要输入 11 个或更多进程开始,即使您的进程数组限制为 10 个)。
However; I spent 10 minutes trying to decipher your code and still don't really know what it thinks it's doing - there's no comments at all and the variable names and function names don't help (e.g. nois not a boolean "yes/no" variable, checkprocess()doesn't check one process but checks all processes to see if all processes have finished, etc). Mostly, if I were being paid to fix this code I'd simple throw it out and rewrite it from scratch to save time. I thought about rewriting it from scratch and just posting the resulting code; but that's not going to help you with your homework.
然而; 我花了 10 分钟试图破译你的代码,但仍然不知道它在做什么 - 根本没有注释,变量名和函数名也没有帮助(例如no不是布尔“是/否”变量,checkprocess()不检查一个进程而是检查所有进程以查看是否所有进程都已完成等)。大多数情况下,如果我得到报酬来修复此代码,我会简单地将其丢弃并从头开始重写以节省时间。我想从头开始重写它并发布结果代码;但这对你的家庭作业没有帮助。
My advice is, rewrite it from scratch instead of fixing it.
我的建议是,从头开始重写它而不是修复它。
It should have a global currently_running_processvariable, a global current_timevariable, one function to increase the current time, and one function for the scheduler itself.
它应该有一个全局currently_running_process变量、一个全局current_time变量、一个增加当前时间的函数和一个调度程序本身的函数。
The function to increase the current time would:
增加当前时间的函数将:
- for each process on the scheduler's linked list, increase the waiting time
- do
current_time++ - find any processes that should be started (
current_time == arrival_time) and append any started processes to the end of the scheduler's linked list
- 对于调度器链表上的每个进程,增加等待时间
- 做
current_time++ - 找到任何应该
current_time == arrival_time启动的进程( ) 并将所有启动的进程附加到调度程序链表的末尾
The scheduler function should:
调度程序功能应该:
- remove the first process from the scheduler's linked list
- determine how much time that process should use (the time slice length or the process' remaining time, whichever is lower)
- subtract that amount of time from the process' remaining time
- call the
increase_time()function in a loop, until that amount of time has passed - if the process' remaining time is not zero; put the process back onto the end of the linked list
- if the process` remaining time was zero, check if the scheduler's linked list is empty and exit the program if it is
- 从调度程序的链表中删除第一个进程
- 确定该进程应该使用多少时间(时间片长度或进程的剩余时间,以较低者为准)
- 从进程的剩余时间中减去该时间量
increase_time()在循环中调用该函数,直到经过这段时间- 如果进程的剩余时间不为零;将进程放回链表的末尾
- 如果进程剩余时间为零,则检查调度器的链表是否为空,如果是则退出程序
Note: I'd start with current_time = -1;and call the function to increase the current time once before calling the scheduler function; so that any processes with arrival_time == 0would be added to the scheduler's linked list before the scheduler starts working (and so that the scheduler function doesn't see an empty list as soon as it's started).
注意:current_time = -1;在调用调度程序函数之前,我首先调用该函数以增加当前时间;以便arrival_time == 0在调度程序开始工作之前将任何进程添加到调度程序的链表中(并且调度程序功能一旦启动就不会看到空列表)。
回答by kanika
/* 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);
}
回答by ROHIT PATEL
You can use queue for doing the same, i am pasting a link which is written in ANSI CPP You can check this link for more info. I was having same problem like you had but the code on the link helped me a lot it also contains many other Scheduling program but i extracted only round robin from it. click here to see the code for round robin Scheduling
您可以使用队列来做同样的事情,我正在粘贴一个用 ANSI CPP 编写的链接,您可以查看此链接以获取更多信息。我遇到了和你一样的问题,但链接上的代码对我帮助很大,它还包含许多其他调度程序,但我只从中提取了循环。 单击此处查看循环调度的代码
回答by user3832997
Round Robin Scheduling program in C
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;}
}
}
回答by Khurram Raza
This code will read data from file whose format should have one process info in a single line, arrival time, burst time, spaced, and file should terminate with -1. File name and time slice must be passed in command arguments. Like:
此代码将从文件中读取数据,该文件的格式应在一行中包含一个进程信息、到达时间、突发时间、间隔,并且文件应以 -1 终止。文件名和时间片必须在命令参数中传递。喜欢:
0 3
1 2
2 1
-1
The code is in C and variable names are self-descriptive.
代码是用 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;
}

