我确信有很多错误(如果用户想要输入11个或更多进程,即使您的进程数组限制为10个,也不要关心)。
然而;我花了10分钟试图破译你的代码,但仍然不知道它认为它在做什么 - 根本没有评论,变量名和函数名没有帮助(例如 no 不是布尔“是/否”变量, checkprocess() 不检查一个进程,但检查所有进程以查看是否所有进程都已完成,等等)。大多数情况下,如果我得到报酬修复此代码,我会简单地将其丢弃并从头开始重写以节省时间。我想过从头开始重写它,只是发布结果代码;但这不会帮助你完成你的作业。
no
checkprocess()
我的建议是,从头开始重写它而不是修复它。
它应该具有全球性 currently_running_process 变量,全局变量 current_time 变量,一个增加当前时间的函数,一个调度器本身的函数。
currently_running_process
current_time
增加当前时间的功能是:
current_time++
current_time == arrival_time
调度程序功能应该:
increase_time()
注意:我从一开始 current_time = -1; 并在调用调度程序函数之前调用该函数以增加当前时间;这样任何进程都可以 arrival_time == 0 将在调度程序开始工作之前添加到调度程序的链接列表中(以便调度程序函数在启动时不会看到空列表)。
current_time = -1;
arrival_time == 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; }
/* 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); }
你可以使用队列做同样的事情,我粘贴一个用ANSI CPP编写的链接 您可以查看此链接以获取更多信息。我遇到了和你一样的问题,但链接上的代码对我帮助很大,它还包含许多其他调度程序,但我只提取了循环法。 单击此处查看循环调度的代码
#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;} } }