操作系统模拟进程调度算法.docx
- 文档编号:29316025
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:16
- 大小:91.72KB
操作系统模拟进程调度算法.docx
《操作系统模拟进程调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统模拟进程调度算法.docx(16页珍藏版)》请在冰豆网上搜索。
操作系统模拟进程调度算法
操作系统
——项目文档报告
进程调度算法
专业:
班级:
指导教师:
姓名:
学号:
一、核心算法思想
1.先来先服务调度算法
先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。
当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。
2.短作业(进程)优先调度算法
短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。
SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。
该算法对长作业不利,完全未考虑作业的紧迫程度。
3.高响应比优先调度算法
在批处理系统中,短作业优先算法是一种比较好的算法,其主要不足之处是长作业的运行得不到保证。
如果我们能为每个作业引人动态优先权,并使作业的优先级随着等待时间的增加而以速率a提高,则长作业在等待一定的时间后,必然有机会分配到处理机。
该优先权的变化规律可描述为:
优先权=(等待时间+要求服务时间)/要求服务时间
即优先权=响应时间/要求服务时间
如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因而该算法有利于短作业。
当要球服务的时间相同时,作业的优先权决定于其等待时间,等待时间越长,优先权越高,因而它实现的是先来先服务
对于长作业,作业的优先级可以随着等待时间的增加而提高,当其等待时间足够长时,其优先级便可以升到很高,从而也可获得处理机。
4.时间片轮转算法
在时间片轮转算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。
换言之,系统能在给定的时间内响应所有用户的请求。
二、核心算法流程图
1.先来先服务算法流程图
2.短进程优先算法
开始
获取进程信息
调用action,执行进程
按进程越要时间排序
结束
输出结果
3.时间片轮转算法
开始
获得进程信息
调用时间片轮转算法
计算各进程剩余时间
大于0
进程结束
等于0
在每个时间片执行程序
4.髙响应比优先算法
四、源代码
下面给出的是用C实现程序的源代码:
#include
#include
#include
typedefstructpcb
{
intname;
intneedtime;
intarrivetime;
intpri;
intstate;
intcputime;
}plist;
voidaction(plist*nowpro);
voidaction(plist*nowpro)
{
delay(1000);
printf("nowisprocess%d",nowpro->name);
nowpro->needtime--;
if(nowpro->needtime==0)
{
printf("theprocess%disend\n",nowpro->name);
/*nowpro->state=1;*/
printf("-----------------------------\n");
}
else
{
printf("process%dneedtimeis%d\n",nowpro->name,nowpro->needtime);
printf("-----------------------------\n");
}
}
voidcreatpro(intn,plist*process)
{
intj;
for(j=0;j { process[j].name=j; process[j].needtime=rand()%10+1; process[j].arrivetime=rand()%10; process[j].pri=rand()%4; process[j].state=0; process[j].cputime=0; } } voidshow(intn,plist*process) { intj; for(j=0;j { printf("nameofprocess%d\t",process[j].name); printf("needtime%d\t",process[j].needtime); printf("arrivetime%d\t",process[j].arrivetime); printf("pri%d\n",process[j].pri); printf("state%d\t",process[j].state); printf("cputime%d\n",process[j].cputime); } } voidmain() { voidcreatpro(intn,plist*process); voidshow(intn,plist*process); voidfcfs(intn,plist*process); voidsjf(intn,plist*process); voidrr(intn,plist*pro1); voidhrrn(intn,plist*pro1); intn;/*thenumberofprocess*/ intk; plistprocess[10]; printf("pleaseinputthenumberofprocessfrom0to10\n"); scanf("%d",&n); creatpro(n,process); show(n,process); printf("pleasechoosethewhatyouwanttouse\n"); printf("1FCFS\t2SJF\t3HRRN\t4RR\n"); scanf("%d",&k); switch(k) { case1: fcfs(n,process);break; case2: sjf(n,process);break; case3: hrrn(n,process);break; case4: rr(n,process);break; default: break; } getch(); } voidfcfs(intn,plist*pro1) { voidshow(intn,plist*process); inti,j,k; intm=0; inttime; plisttemp; plistpro2[10]; for(i=0;i { k=0; while(pro1[k].state==1) { k++; } temp=pro1[k]; for(j=k+1;j { if(temp.arrivetime>pro1[j].arrivetime&&pro1[j].state! =1) { temp=pro1[j]; k=j; } } pro2[m++]=temp; pro1[k].state=1; } show(n,pro2); for(i=0;i { while(pro2[i].needtime>0) { action(&pro2[i]); } } } voidsjf(intn,plist*pro1) { voidshow(intn,plist*process); inti,j,k; intm=0; plisttemp; plistpro2[10]; for(i=0;i { k=0; while(pro1[k].state==1) { k++; } temp=pro1[k]; for(j=k+1;j { if(temp.needtime>pro1[j].needtime&&pro1[j].state! =1) { temp=pro1[j]; k=j; } } pro2[m++]=temp; pro1[k].state=1; } show(n,pro2); for(i=0;i { while(pro2[i].needtime>0) { action(&pro2[i]); } } } voidrr(intn,plist*pro1) { voidshow(intn,plist*process); inti,j,k; intm=0; inttime; plisttemp; plistpro2[10]; for(i=0;i { k=0; while(pro1[k].state==1) { k++; } temp=pro1[k]; for(j=k+1;j { if(temp.arrivetime>pro1[j].arrivetime&&pro1[j].state! =1) { temp=pro1[j]; k=j; } } pro2[m++]=temp; pro1[k].state=1; } show(n,pro2); time=pro2[0].needtime; for(i=0;i { if(time { time=pro2[i].needtime; } } while(time>0) { for(i=0;i { if(pro2[i].needtime>0) { action(&pro2[i]); } } time--; } } voidhrrn(intn,plist*pro1) { intcal(inta,plist*pro2); inti,k,j,m; intcurtime=0; plisttemp; for(i=0;i { k=0; while(pro1[k].state==1) {k++;} temp=pro1[k]; m=cal(curtime,&temp); for(j=0;j { if(pro1[j].state! =1) { pro1[j].pri=cal(curtime,&pro1[j]); if(m>pro1[j].pri) { temp=pro1[j]; m=pro1[j].pri; k=j; } } } while(pro1[k].needtime>0) { action(&pro1[k]); curtime++; } pro1[k].state=1; } } intcal(inta,plist*pro2) { intpr; if((a-pro2->arrivetime)<=0) {pr=1;} else { pr=(a-pro2->arrivetime+pro2->needtime)/pro2->needtime; } returnpr; } 5、运行结果 1.先来先服务算法运行结果 短进程优先算法运行结果 3.髙相应比优先算法运行结果 4.时间片轮转算法运行结果 六、心得体会 课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去做一件事情,又如何完成一件事情的能力。 通过模拟进程的调度问题,更加深了我对于操作系统理论的理解,在自己的动手操作过程中,能够体会成功的喜悦和遇到问题自己解决的能力,对于我来说是一次提高,让自己多多的在实践中可以加深对理论的理解,也让我明白了以后应该如何更好,更高效的学习,在以后,我
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 模拟 进程 调度 算法