資源簡介
編寫程序模擬進程調度過程,能夠按照時間片輪轉,短進程優先法,可搶占式和不可搶占式優先級法,以及先來先服務和高響應比優先法處理輸入的數據,運行結果包含界面。
代碼片段和文件信息
#include
#include
#include
#include
#include
using?namespace?std;
struct?node
{
????int?num;????????????///序號
????char?name[10];??????///進程名
????int?Gen_time;???????///產生時間
????double?Ser_time;????///要求服務時間
????int?Pty;????????????///優先級priority
????char?vis;???????????///進程狀態R表示就緒,E表示結束
????int?ends;???????????///完成時間
????double?t_time;??????///周轉時間
????double?rt_time;?????///帶權周轉時間
}?p[1000]pc[1000]p1[1000]
p2[1000]p3[1000]p4[1000]p5[1000];
///pc用于記錄時間片輪轉調度的進程數據,p1可搶占式,p2不可搶占式
///p3短進程優先調度,p4先來先服務,p5高響應比優先
int?process_n;??????///存放進程的時間片
int?number;?????????///出入的進程個數
struct?D_value
{
????int?sub;
????int?flage;
}s[1000];///針對時間片輪轉算法,記錄進程產生差值和是否被處理過一次
void?Init(node?m[]node?n[])????///初始化基本數據
{
????for(int?i=0;?i ????{
????????m[i].num=n[i].num;
????????strcpy(m[i].namen[i].name);
????????m[i].Gen_time=n[i].Gen_time;
????????m[i].Ser_time=n[i].Ser_time;
????????m[i].Pty=n[i].Pty;
????????m[i].vis=n[i].vis;
????}
}
void?print(int?by_order[]int?knode?q[])???///輸出進程執行結果
{
????printf(“%-16s%-16s%-16s%-16s%-16s%-16s%-16s\n“
???????????“進程序列號““進程名““產生時間““要求服務時間““完成時間“
???????????“周轉時間““帶權周轉時間“);
????double?sum1=0sum2=0;
????for(int?i=0;?i ????{
????????printf(“%-8d\t%-8s\t%-8d\t%-8.2lf\t%-8d\t%-8.2lf\t%-8.2lf\n“
???????????????q[i].numq[i].nameq[i].Gen_timeq[i].Ser_timeq[i].ends
???????????????q[i].t_timeq[i].rt_time);
????????sum1+=q[i].t_time;
????????sum2+=q[i].rt_time;
????}
????cout< ????printf(“平均周轉時間為:%.2lf?平均帶權周轉時間為:%.2lf\n\n“sum1/numbersum2/number);
????printf(“各進程執行順序為:\n“);
????for(int?i=0;?i ????{
????????if(i==0)
????????????printf(“%d?“by_order[i]);
????????else?if(i!=0&&by_order[i]!=by_order[i-1])
????????????printf(“%d?“by_order[i]);
????}
????printf(“\n“);
????return;
}
bool?cmp(node?anode?b)??///按照進程的序號排列
{
????return?a.num }
void?Time_Circular()????///時間片輪轉調度
{
????printf(“輸入時間片:“);
????cin>>process_n;
????int?sum=0run_sum=0;
????Init(pcp);?????///初始化
????memset(s0sizeof(s));
????for(int?i=0;?i ????{
????????if(i!=0)
????????????s[i].sub=p[i].Gen_time-p[i-1].Gen_time;
????????sum+=p[i].Ser_time;
????}
????int?cnt=0k=0;
????int?by_order[sum];??///記錄進程執行的順序。
????memset(by_order0sizeof(by_order));????///初始化
????node?q;?????????????///臨時存儲出隊列的進程
????queueQQ1;????///Q存儲為執行完成的進程,Q1存儲執行完成的進程
????Q.push(pc[0]);
????for(int?i=1;i ????{
????????if(s[i].sub<=process_n)
????????{///將進程產生的間隔差值與時間片比較,分為兩種情況,小于等于和大于
????????????Q.push(pc[i]);
????????????s[i].flage=1;
????????}
????????else
????????????break;
????}
????int?i=0;
????while(!Q.empty())
????{
????????q=Q.front();
????????Q.pop();
????????if(q.vis==‘R‘&&q.Gen_time<=i)
????????{
????????????by_order[k++]=q.num;
????????????if(process_n<=q.Ser_time)///剩余要求服務時間大于等于時間片
????????????{
????????????????run_sum=run_sum
- 上一篇:ten超級井字棋人機對戰
- 下一篇:C++五子棋源代碼程序解析
評論
共有 條評論