C++编写Round Robin调度程序调度多进程时运行卡死问题咨询
问题原因
你的代码存在两处核心逻辑错误,是程序卡死的直接原因:
- 未处理调度空转场景:当所有已到达的进程都执行完毕,但还有未到达的后续进程时,原有逻辑会让遍历下标
i反复重置为0,一直循环处理已经执行完成的进程,time值不会增长,永远等不到后续进程到达,触发死循环。 temp变量未初始化:声明temp时没有赋予初始值,首次访问时是内存随机值,可能导致逻辑判断异常。
修复后代码
#include<iostream> #include<vector> #include<climits> using namespace std; int main() { int i,n,time,remaining,temp=0,quantum_time; int wt=0,atat=0; //wt = Waiting Time, atat = Average Turn Around Time cout<<"Enter the number of processes to be scheduled"<<endl; cin>>n; remaining=n; vector<int>at(n); vector<int>bt(n); vector<int>rt(n); //Dynamic array declaration using 'vector' library cout<<"Enter the Arrival Time and Burst Time for all the processes"<<endl; for(i=0;i<n;i++) { cin>>at[i]; cin>>bt[i]; rt[i]=bt[i]; } cout<<"Enter the Quantum Time:"<<endl; cin>>quantum_time; cout<<"\n\nProcess\t\t: Arrival Time\t: Burst Time\t: Turnaround Time : Waiting Time\n\n"; for(time=0,i=0;remaining!=0;) { // 先找下一个已到达且未执行完的进程 int next_i = -1; for(int j=0;j<n;j++) { int cur = (i + j) % n; if(at[cur] <= time && rt[cur] > 0) { next_i = cur; break; } } // 没有可执行进程,跳转到下一个最早到达的进程的时间点 if(next_i == -1) { int min_at = INT_MAX; for(int j=0;j<n;j++) { if(rt[j]>0 && at[j] < min_at) { min_at = at[j]; } } time = min_at; continue; } i = next_i; if(rt[i]<=quantum_time&&rt[i]>0) { time+=rt[i]; rt[i]=0; temp=1; } else if(rt[i]>0) { rt[i]-=quantum_time; time+=quantum_time; } if(rt[i]==0&&temp==1) { remaining--; printf("Process{%d}\t:\t%d\t:\t%d\t:\t %d\t :\t %d\n",i+1,at[i],bt[i],time-at[i],time-at[i]-bt[i]); cout<<endl; wt += time-at[i]-bt[i]; atat += time-at[i]; temp=0; } // 下标偏移到下一个,下次循环从下一个开始找 i = (i+1)%n; } cout<<"Average Waiting Time: "<<wt*1.0/n<<endl; cout<<"Average TurnAround Time: "<<atat*1.0/n<<endl; return 0; }
内容的提问来源于stack exchange,提问作者Yash Gajakosh
相关产品推荐
相关产品推荐

