方案进程调度算法模拟.docx
- 文档编号:9813857
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:21
- 大小:130.77KB
方案进程调度算法模拟.docx
《方案进程调度算法模拟.docx》由会员分享,可在线阅读,更多相关《方案进程调度算法模拟.docx(21页珍藏版)》请在冰豆网上搜索。
方案进程调度算法模拟
个人资料整理仅限学习使用
设计进程调度算法的模拟
一、设计目的
1、通过编程实现进程调度算法的模拟,了解进程调度的过程,理解进程调度各方法的特
点。
二、设计要求
1•用语言来实现对n个进程采用不同调度算法的进程调度。
2•每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
<1)进程优先数ID,其中0为闲逛进程,用户进程的标识数为1,2,3…。
<2)进程优先级Priority,闲逛进程vidle)的优先级为0,用户进程的优先级大于0,且随机产生,优先数越大,优先级越高。
<3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。
<4)进程总共需要运行时间Alltime,利用随机函数产生。
<5)进程状态,0:
就绪态;1:
运行态;2:
阻塞态。
<6)队列指针next,用来将多个进程控制块PCB链接为队列。
3.优先数改变的原则
<1)进程在就绪队列中每呆一个时间片,优先数增加1。
<2)进程每运行一个时间片,优先数减3。
4.在调度前,系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程控制块PCB链接成就绪队列。
三、设计说明
SJS算法,按照ALLTIME从小到大依次输出
优先级算法,按照优先从大到小输出,进程执行依次P-3,就绪队列中的进程
RR算法,按照时间片依次执行进程,ALLTIME—
=4.I
结束
1FCFS模块
1.1功能
对于先到达的进程优先分配CPU,按照先来先服务的原则依次执行各进程
1.2数据结构
typedefstructPCB
{
intID。
〃进程优先数,用于标示不同的进程
intPriority。
//进程优先级
intCPUTime。
〃进程占用的CPU时间CPUtime,进程每运行一次,累计值等
于4
intALLTime。
〃进程总共需要运行时间Alltime
intStatus。
〃用于表示进程状态,0:
就绪态;1:
运行态;2:
阻塞态
}PCB。
1.3算法
voidFCFS(>
{
Node*p=head->next。
while(p!
=NULL>
{
cout«"执行进程"<
p=p->next。
}
cout«endl。
cout«"所有进程都执行完成"< } 2.SJF模块 2.1功能 先找到运行时间最短的程序,然后执行,再从剩余的程序中找到运行时间最短的在执行,依次每次都执行运行时间最短的,直到程序执行完毕。 2..2数据结构 typedefstructPCB { intID。 〃进程优先数,用于标示不同的进程 intPriority。 //进程优先级 intCPUTime。 〃进程占用的CPU时间CPUtime,进程每运行一次,累计值等 于4 intALLTime。 〃进程总共需要运行时间Alltime intStatus。 〃用于表示进程状态,0: 就绪态;1: 运行态;2: 阻塞态 }PCB。 2.3算法 voidSJF(> { Node*p。 Node*pmin。 while(head2->next! =NULL> { pmin=head2->next。 for(p=head2->next。 p! =NULL。 p=p->next> { if(pmin->data.ALLTime>p->data.ALLTime> pmin=p。 } cout«"执行剩余区间长度最短的进程"< for(p=head2。 p! =NULL。 p=p->next> { if(p->next==pmin> { p->next=p->next->next。 free(pmin>。 } } } printf("\n">。 printf("所有进程都执行完成。 \n\n">。 _个人资料整理―仅限学习使用 3SearchMaxPRI模块 3.1功能 按照优先级从高到低依次执行程序 3.2数据结构 qO指向q的前一个进程,便于删除进程;p返回优先级最大进程;q用于遍历链表 3.3算法 voidSearchMaxPRI(intm> { Node*p=head->next。 Node*q=head->next。 Node*qO=heac。 while(q! =NULL> { if(q->data.ALLTime==O> { cout«"进程已执行完成"< n--。 qO->next=q0->next->next。 free(q>。 q=q0->next。 } else { if(q->data.Priority>p->data.Priority> p=q。 qO=qO->next。 q=q->next。 } } if(n>0> action(p>。 按照轮转的次序分配给每个程序一定的时间执行,执行完成后执行后面的进程,依次循环执行直到所有进程执行完成。 4.2数据结构 4.3算法 voidRR(intm> { Node*p。 while(head1->next! =NULL> { p=head1->next Node*prep=head1。 Node*q。 while(p! =NULL> {cout«"执行进程一个时间片" for(q=head1。 q->next! =NULL。 q=q->next> if(q->next==p>{ p->data.ALLTime-=4。 p->data.CPUTime+=4。 } } if(p->data.ALLTime<=0> { cout«"进程已执行完成" prep->next=prep->next->next。 free(p>。 p=prep->next。 } else { prep=prep->next。 p=p->nexto } } cout«endl。 cout«"进入下一次轮转"< } cout«"所有进程都执行完成"< 四、运行结果及分析 远宏E^CodenckienQ5^t■ilhenq.exe 完-程下进入有 试程 优先紙 GnJTinc AlITinc Gtatus 1 5 e 7 B 2 3 e 4 3 1 薛 7 V\ Procc^aI'dbuurricd0C0k0>cxccutnonitine-工石.0? 4目Prc^sanyke^ilutunliiiue- 该程序实现了进程调度的四种不同调度算法下的调度顺序的输出情况 五、总结 通过该程序的实现,对进程的调度有了更多的了解,对于不同的系统和系统目标,通常采用不同的调度算法。 有的算法适用于为数众多的短作业调度,有的算法为系统合理的响应时间提供了保证。 调度算法的选择的合适与否很重要。 源代码: #include #include #inelude #defineTRUE1 #defineFALSE0 #defineOK1typedefstructPCB { intID。 intPriority。 intCPUTime。 intALLTime。 intStatu® }PCB。 typedefPCBDt。 typedefstructNode { Dtdata。 structNode*next。 }Node。 Node*head=(Node*>malloc(sizeof(Node>>。 Node*head1=(Node*>malloc(sizeof(Node>>。 Node*head2=(Node*>malloc(sizeof(Node>>。 intn。 voidcreate(intn> inti=1。 srand((int>time(O>>。 head->next=NULL。 Node*q=head。 cout«"优先数优先级CPUTimeAllTimeStatus"< while(i<=n> { Node*p=(Node*>malloc(sizeof(Node>>。 p->data.1D=i。 p->data.CPUTime=O。 p->data.Status=0 p->data.Priority=rand(>%10+1。 p->data.ALLTime=rand(>%8+1。 cout«""vvp->data.lD p->data.CPUTime<<""< p->next=NULL。 q->next=p。 q=q->next。 i++。 } Node*p0=head1。 head1->next=NULL。 for(q=head->next。 q! =NULL。 q=q->next> { Node*r=(Node*>malloc(sizeof(Node>>。 r->data」D=q->data」D。 r->data.CPUTime=q->data.CPUTimebr->data.Status=q->data.Statu。 r->data.Priority=q->data.Priority。 r->data.ALLTime=q->data.ALLTime。 pO->next=r。 r->next=NULL。 pO=pO->next。 } Node*p仁head2=head2->next=NULL。 for(q=head->next。 q! =NULL。 q=q->next> { Node*k=(Node*>malloc(sizeof(Node>>。 k->data」D=q->data」D。 k->data.CPUTime=q->data.CPUTimetk->data.Status=q->data.Statu。 k->data.Priority=q->data.Priority。 k->data.ALLTime=q->data.ALLTime。 p1->next=k。 k->next=NULL。 p1=p1->nexto } }voidFCFS(> Node*p=head->nexlwhile(p! =NULL> { cout«"执行进程"< p=p->next。 } cout«endl。 cout«"所有进程都执行完成"< } voidSJF(> { Node*p。 Node*pmin。 while(head2->next! =NULL> { pmin=head2->next。 for(p=head2->next。 p! =NULL。 p=p->next> { if(pmin->data.ALLTime>p->data.ALLTime> pmin=p。 } cout«"执行剩余区间长度最短的进程"< for(p=head2。 p! =NULL。 p=p->next> {if(p->next==pmin>p->next=p->next->next。 free(pmin>。 } } } cout«endl。 cout«"所有进程都执行完成"< } voidaction(Node*p> { Node*q=head->next= while(q! =NULL> { "vvendl。 cout =p>q->data.Priority=q->data.Priority+1。 else { q->data.Priority=q->data.Priority-3。 if(q->data.ALLTime>4> q->data.ALLTime-=4。 else q->data.ALLTime=O。 q->data.Status=1 q=q->next。 } }voidSearchMaxPRI(intm> { Node*p=head->next= Node*q=head->next= Node*q0=headowhile(q! =NULL> { if(q->data.ALLTime==O> { cout< n--o qO->next=q0->next->next。 free(q>o q=q0->next。 } else if(q->data.Priority>p->data.Priority>p=q。 q0=q0->next。 q=q->next。 } } if(n>0> action(p>。 } voidRR(intm> { Node*p。 while(head1->next! =NULL> { p=head1->next Node*prep=head1。 Node*q。 while(p! =NULL> { cout for(q=head1。 q->next! =NULL。 q=q->next> { if(q->next==p> { p->data.ALLTime-=4。 p->data.CPUTime+=4。 } if(p->data.ALLTime<=0>{ cout prep->next=prep->next->next。 free(p>。 p=prep->next。 } else { prep=prep->next。 p=p->nexto } } cout«endl。 cout«"进入下一次轮转"< } cout«"所有进程都执行完成"< } intmain(> { cout«"请输入系统进程数: "< cin>>n。 intm=n。 if(n==0> cout«"此时没有就绪进程"< else create(n> cout«endl。 coutvv"先来先服务调度"< FCFS(>。 cout«endl。 coutvv"最短作业优先调度"< SJF(>。 coutvvendl。 coutvv"优先权的分时调度"< while(head->next! =NULL> { SearchMaxPRI(m>。 } coutvv"所有进程都执行完成"< coutvvendl。 coutvv"轮转法调度"vvendl。 RR(m>。 } } 模拟银行家算法 设计2 一、设计目的 1通过对银行家算法的模拟,理解银行家算法的实现过程,了解系统解决死锁的方法 1、编程序模拟银行家算法 2能体现算法的全过程 三、设计说明 1.bank模块 1.1功能 利用银行家算法,给系统分配资源,避免死锁 1.2数据结构 TypedefstructRESOURCE { intavailable[R]。 //系统可用资源数 intallocation[W][R]。 〃M个进程已经得到N类资源的资源量 intneed[W][R]。 〃M个进程还需要N类资源的资源量 intrequest[R]。 //请求资源个数 _个人资料整理―仅限学习使用 }RESOURCE 1.3算法 { inti=O,j=O。 charchoice='Y'。 while(choice=='Y'||choice=='y'> { i=-1。 while(i { cout«endl<<"请输入需申请资源的进程号: "。 cin>>i。 if(i<0||i>=M>cout«"进程号不存在,重新输入! "< } coutvv"请输入进程"vvivv"申请各类资源的数量: "< for(j=0。 j j++> { coutvv"资源"vvjvv": "。 cin>>request[j]。 if(request[j]>need[i][j]> { 的数量! " coutvvendlvv"进程"vvivv"申请的资源数大于进程"vvivv"还需要"vvjvv"类资源 coutvv"若继续执行系统将处于不安全状态! "vvendl。 choice='N'。 breaks else { if(request[j]>available|j]> { cout«endlvv"进程"< coutvv"继续执行系统将处于不安全状态! "< choice='N'。 break } } } if(choice=='Y'||choice=='y'> { distribute^〉。 if(check(>> { restore(i>。 print(>。 } else print(>。 } else cout< cout<<"是否继续银行家算法演示? Y/N" cin>>choice。 } } 2.check模块 2.1功能 检查资源分配后系统是否处于安全状态。 2.2数据结构 TypedefstructRESOURCE { intavailable[R]。 //系统可用资源数 intallocation[W][R]。 〃M个进程已经得到N类资源的资源量 intneed[W][R]。 〃M个进程还需要N类资源的资源量 intrequest[R]。 //请求资源个数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 方案 进程 调度 算法 模拟