进程管理和调度.docx
- 文档编号:8287756
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:16
- 大小:18.63KB
进程管理和调度.docx
《进程管理和调度.docx》由会员分享,可在线阅读,更多相关《进程管理和调度.docx(16页珍藏版)》请在冰豆网上搜索。
进程管理和调度
#include
#include
#include
#include
#include
#include
usingnamespacestd;
#defineTXIANGYING5//响应时间为5s
#defineminprio20//优先权高低控制标准
#defineADDPRIO1//定义优先权增加幅度
#defineUPDATETIME2//定义优先权增加间隔
typedefstructnode
{
charname[20];//进程名字
intprio;//进程的优先级
intround;//分配CPU的时间片
intneedtime;//进程执行所需要的时间
charstate[8];//进程的状态,Wait——就绪态,Run——执行态,Finish——完成态
intcount;//记录执行的次数
intarrive;//到达时间
intzhouzhuan;//周转时间
doubleave_daiquan;//带权周转时间
intfuwu_time;//服务时间
structnode*next;//链表指针
}PCB;
intGetFirst(intsumtime);//从就绪队列取得第一个节点
voidOutput1();//输出时间片轮转队列信息
voidOutput2(intsumtime);//输出优先权调度队列信息
voidInsertPrio(PCB*in);//创建优先级队列,规定优先数越小,优先级越高
voidInsertRound(PCB*in);//创建时间片就绪队列
voidInsertFinish(PCB*in);//创建完成队列
voidPrioCreate();//优先级输入函数
voidTimeCreate();//时间片轮转调度算法——输入函数
voidPriority();//按照优先级调度
voidRoundRun();//时间片轮转调度
voidupdate_priority(int&add_priority);//等待队列的优先权更新
PCB*ready=NULL,*run=NULL,*finish=NULL;//定义3个队列,就绪队列,执行队列和完成队列
intmain()
{
charchoose;
FILE*fp;
cout<<"*****************欢迎进入进程管理和调度的算法模拟*****************\n"< cout<<"*****************************主菜单*****************************"< cout<<"输入进程的调度方法(请输入对应数字): "< cout<<"1.抢占式动态优先权调度(手工输入)"< cout<<"2.时间片轮转调度(手工输入)"< cout<<"3.抢占式动态优先权调度(从文件读入已设定的的数据)"< cout<<"4.时间片轮转调度(从文件读入已设定的的数据)"< cout<<"5.退出程序"< cin>>choose; switch(choose) { case'1': PrioCreate(); Priority(); Output1(); break; case'2': TimeCreate(); RoundRun(); Output1(); break; case'3': fp=freopen("yxj.txt","r",stdin);//优先级输入文件 PrioCreate(); Priority(); Output1(); fclose(fp); break; case'4': fp=freopen("sjp.txt","r",stdin);//时间片输入文件 TimeCreate(); RoundRun(); Output1(); fclose(fp); break; case'5': exit (1); default: break; } return0; } /* voidGetFirst()//取得就绪队列第一个节点 { run=ready; if(ready! =NULL) { strcpy(run->state,"Run"); ready=ready->next; run->next=NULL; } } */ intGetFirst(intsumtime)//取得就绪队列第一个节点 { PCB*fst,*temp1,*temp2,*temp3; if(ready! =NULL&&sumtime { fst=ready; while(sumtime { temp1=fst;//记录符合条件的前面一个值 fst=fst->next; if(fst==NULL) { sumtime++; Output2(sumtime); fst=ready; if(sumtime>=fst->arrive)//搜索一轮之后,设置CPU时间+1,即全部进程都等待 { run=ready; if(ready! =NULL) { strcpy(run->state,"Run"); ready=ready->next; run->next=NULL; } returnsumtime; } } } temp2=fst; temp1->next=fst->next; temp3=ready; ready=fst; ready->next=temp3; } run=ready; if(ready! =NULL) { strcpy(run->state,"Run"); ready=ready->next; run->next=NULL; } returnsumtime; } voidOutput2(intsumtime) { cout<<"-------------------------------------------------------"< PCB*p; p=run; cout<<"现在CPU时间为: "< if(p==NULL&&ready==NULL) { cout<<"所有进程调度已经完成! 队列具体信息如下: "< Output1(); exit(0); } cout<<"进程名到达时间服务时间剩余时间优先权状态"< if(p! =NULL) { cout< < < < < (2)< < p=p->next; } p=ready; while(p! =NULL) { cout< < < < < (2)< < p=p->next; } cout< } //创建优先级就绪队列,规定优先权数越小,优先级越低,0为最低优先权数 voidInsertPrio(PCB*in) { PCB*fst,*temp; fst=ready; intflag=0; if(ready==NULL)//如果队列为空,则为第一个元素 { in->next=ready; ready=in; } else//查到合适的位置进行插入 { if(in->prio>fst->prio)//比第一个还要大,则插入到队头 { in->next=ready; ready=in; } else { while(fst->next! =NULL)//移动指针查找第一个别它小的元素的位置进行插入 { temp=fst; fst=fst->next; if(in->prio>fst->prio)//插入就绪队列中 { in->next=fst; temp->next=in; flag=1; break; } elseif(in->prio==fst->prio&&in->arrive { in->next=fst; temp->next=in; flag=1; break; } } if(fst->next==NULL&&flag==0)//已经搜索到队尾,则其优先级数最小,将其插入到队尾即可 { in->next=NULL; fst->next=in; } } } } voidInsertRound(PCB*in)//将进程插入到就绪队列尾部——时间片轮转就绪队列 { PCB*fst; fst=ready; if(ready==NULL) { in->next=ready;//将进程插到空就绪队列 ready=in; } else { while(fst->next! =NULL) { fst=fst->next;//遍历到队列尾部 } in->next=fst->next;//将进程插到就绪队列尾部 fst->next=in; } } voidInsertFinish(PCB*in)//将进程插入到完成队列尾部 { PCB*fst; fst=finish; if(finish==NULL) { in->next=finish;//将进程插到空完成队列 finish=in; } else { while(fst->next! =NULL) { fst=fst->next;//遍历到队列尾部 } in->next=fst->next;//将进程插到完成队列尾部 fst->next=in; } } voidupdate_priority(int&add_priority) { PCB*fst; fst=ready; while(fst! =NULL)//如果队列为空,则为第一个元素 { if(fst->prio<=minprio)//优先权小于minprio,系统假定为50,则优先权+add_priority; { fst->prio=fst->prio+add_priority; } fst=fst->next; } } voidTimeCreate()//时间片轮转调度算法——输入函数 { intnum;//要创建的进程数目 cout<<"请输入要创建的进程数目: \n"; cin>>num; PCB*tmp; inti; floatT_xiangying;//响应时间 cout<<"请输入响应时间\n"; cin>>T_xiangying; //T_xiangying=TXIANGYING; cout<<"请输入进程名称到达时间服务时间\n"; for(i=0;i { if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL) { perror("malloc"); exit (1); } cin>>tmp->name>>tmp->arrive>>tmp->fuwu_time; strcpy(tmp->state,"Wait"); tmp->prio=0; tmp->round=T_xiangying/num;//系统假设时间片是1 tmp->count=0; tmp->needtime=tmp->fuwu_time;//把服务时间赋值给还需时间 InsertRound(tmp); } } voidRoundRun()//时间片轮转调度算法 { intsum_cputime=0; intflag=1; cout<<"**********时间片轮转调度算法具体实现过程: **********"< Output2(sum_cputime); GetFirst(sum_cputime); while(run! =NULL) { //Output(); while(flag) { sum_cputime++; run->count++; run->needtime--; if(run->needtime==0)//进程执行完毕 { strcpy(run->state,"Finish"); run->zhouzhuan=sum_cputime-run->arrive; run->ave_daiquan=(run->zhouzhuan*1.0)/run->fuwu_time; InsertFinish(run); flag=0; } elseif(run->count==run->round)//时间片用完 { strcpy(run->state,"Wait"); run->count=0;//计数器清零,为下次做准备 InsertRound(run); flag=0; } } flag=1; GetFirst(sum_cputime); } } voidOutput1()//输出队列,按完成时间排序 { PCB*p; cout<<"-------------------------------------------------------"< cout<<"进程名到达时间完成时间服务时间周转时间带权周转时间"< p=finish; while(p! =NULL) { cout< < < < < < p=p->next; } cout<<"************************感谢您的使用! ************************"< } voidPrioCreate()//优先级调度输入函数 { intnum;//要创建的进程数目 cout<<"请输入要创建的进程数目: \n"; cin>>num; PCB*tmp; inti; cout<<"请输入进程名称到达时间服务时间优先级初值\n"; for(i=0;i { if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL) { perror("malloc"); exit (1); } cin>>tmp->name>>tmp->arrive>>tmp->fuwu_time>>tmp->prio; strcpy(tmp->state,"Wait"); tmp->round=0;//假设时间片是0 tmp->count=0; tmp->needtime=tmp->fuwu_time;//把服务时间赋值给还需时间 InsertPrio(tmp); } } voidPriority()//按照优先级调度,每次执行一个时间片 { intadd_prio; //add_prio=ADDPRIO;//优先权的增加值 cout<<"请输入优先权的增加值: "< cin>>add_prio; intupdate_time; //update_time=UPDATETIME;//提升优先权的时间间隔 cout<<"提升优先权的时间间隔: "< cin>>update_time; cout< intsum_cputime=0; cout<<"***************您输入的调度信息如下: ***************"< Output2(sum_cputime);//输入数据,为改变状态 intflag=1; inttimecount=0; sum_cputime=GetFirst(sum_cputime); cout<<"**********抢占式优先级调度算法具体实现过程: **********"< Output2(sum_cputime);//输出每次调度过程中各个节点的状态 while(run! =NULL)//执行进程 { while(flag) { run->prio=run->prio-1;//优先权减1 run->needtime--;//进程还需要的时间片数减1 sum_cputime++; timecount++;//时间片计数器 if(run->needtime==0)//如果进程执行完毕,将进程状态置为Finish,将其插入到完成队 { strcpy(run->state,"Finish"); run->zhouzhuan=sum_cputime-run->arrive; run->ave_daiquan=(run->zhouzhuan*1.0)/run->fuwu_time; InsertFinish(run); Output2(sum_cputime);//输出完成进程信息 if(timecount==update_time) { timecount=0; update_priority(add_prio); } flag=0; } else//将进程状态置为W,入就绪队列 { strcpy(run->state,"Wait"); if(timecount==update_time) { timecount=0; update_priority(add_prio); } InsertPrio(run); flag=0; } } flag=1; sum_cputime=GetFirst(sum_cputime);//继续取就绪队列队头进程进入执行队列 Output2(sum_cputime);//输出每次调度过程中各个节点的状态 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 管理 调度