进程调度.docx
- 文档编号:11393640
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:17
- 大小:202.17KB
进程调度.docx
《进程调度.docx》由会员分享,可在线阅读,更多相关《进程调度.docx(17页珍藏版)》请在冰豆网上搜索。
进程调度
操作系统课程设计
进
程
调
度
实
践
报
告
姓名:
董宇超
班级:
计算机一班
学号:
0906010124
目录:
●实践内容
●实践目的及意义
●功能设计及数据结构
●调试运行及测设分析
●存在的问题及改进设想
●实践体会
●总结
●参考文献
正文:
1.实践内容:
在多道程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。
这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由进程调度程序完成的。
一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同的进程队列。
于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。
进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。
进程调度的算法有多种,常用的有先来先服务算法、时间片轮转算法。
采用先来先服务及时间片轮转算法进行进程调度,编程模拟。
2.实践目的:
·要求设计并实现模拟进程调度的算法:
时间片轮转及先来先服务。
·理解进程控制块的结构。
·理解进程运行的并发性。
·掌握进程调度算法。
3.功能设计:
1)数据结构:
classPCB
{
stringProcessName;//进程名字
intTime;//进程需要时间
intLeftTime;//进程运行一段时间后还需要的时间
}
2)功能函数:
voidCopy(Processproc1,Processproc2);//把proc2赋值给proc1
voidsort(Processpr[],intsize);//此排序后按需要的cpu时间从小到大排列
voidFcfs(Processpr[],intnum);//先来先服务算法
voidTimeTurn(Processprocess[],intnum,intTimepice);//时间片轮转算法
源代码:
#include
#include
usingnamespacestd;
classPCB
{
public:
stringProcessName;//进程名字
intTime;//进程需要时间
intLeftTime;//进程运行一段时间后还需要的时间
};
voidCopy(PCBproc1,PCBproc2);//把proc2赋值给proc1
voidsort(PCBpr[],intsize);//此排序后按需要的cpu时间从小到大排列
voidFcfs(PCBpr[],intnum);//先来先服务算法
voidTimeTurn(PCBprocess[],intnum,intTimepice);//时间片轮转算法
voidmain()
{
inta;
cout< cout<<"选择调度算法: "< cout<<"1: FCFS2: 时间片轮换"< cin>>a; constintSize=30; PCBprocess[Size]; intnum; intTimePice; cout<<"输入进程个数: "< cin>>num; if(a==2) { cout<<"输入此进程时间片大小: "< cin>>TimePice; } for(inti=0;i { stringname; intCpuTime; cout<<"输入第"< "< cin>>name; cin>>CpuTime; process[i].ProcessName=name; process[i].Time=CpuTime; cout< } for(intk=0;k process[k].LeftTime=process[k].Time;//对进程剩余时间初始化 cout< if(a==1)//FCFS调度 { cout<<"进程名"<<"CPU时间"<<"状态"< Fcfs(process,num); } elseif(a==2)//时间片轮转调度 { cout<<"进程名"<<"剩余时间"<<"状态"< TimeTurn(process,num,TimePice); } } voidCopy(PCBproc1,PCBproc2) { proc1.ProcessName=proc2.ProcessName; proc1.Time=proc2.Time; } voidsort(PCBpr[],intsize)//以进程时间从低到高排序 {//直接插入排序 for(inti=1;i { PCBtemp; temp=pr[i]; intj=i; while(j>0&&temp.Time { pr[j]=pr[j-1]; j--; } pr[j]=temp; } } /*先来先服务算法的实现*/ voidFcfs(PCBprocess[],intnum) {//process[]是输入的进程,num是进程的数目 while(true) { if(num==0) { cout<<"所有进程都已经执行完毕! "< exit (1); } if(process[0].LeftTime==0)//由于第一个进程总是在运行,所以每次都只判断process[0].LeftTime { cout<<"进程"< "< for(inti=0;i process[i]=process[i+1]; num--; } elseif(process[num-1].LeftTime==0) { cout<<"进程"< "< num--; } elseif(process[0].LeftTime>0) { cout< process[0].LeftTime=0; cout<<""< cout< for(ints=1;s { cout<<""< cout<<"等待"< } }//else cout< system("pause"); cout< }//while } /*时间片轮转调度算法实现*/ voidTimeTurn(PCBprocess[],intnum,intTimepice) { while(true) { if(num==0) { cout<<"所有进程都已经执行完毕! "< exit (1); } if(process[0].LeftTime==0)//由于第一个进程总是在运行,所以每次都只判断process[0].LeftTime { cout<<"进程"< "< for(inti=0;i process[i]=process[i+1]; num--; } if(process[num-1].LeftTime==0) { cout<<"进程"< "< num--; } elseif(process[0].LeftTime>0) { cout< process[0].LeftTime=process[0].LeftTime-Timepice; if(process[0].LeftTime<=0)//当剩余时间小于零时,做零处理 process[0].LeftTime=0; cout<<""< cout<<"运行"< for(ints=1;s { cout<<""< if(s==1) cout<<"就绪"< else cout<<"等待"< } PCBtemp;//中间变量 temp=process[0]; for(intj=0;j process[j]=process[j+1]; process[num-1]=temp; }//else cout< system("pause"); cout< }//while } 4.调试运行: 运行开始后出现如下界面: 按提示选择1/2; ●先选1,进行FCFS调度: ●若选2,进行时间片轮转调度: 5.存在的问题: 由于初次做操作系统模拟实验,所以程序设计中存在很多问题,例如定义好PCB后,各种指针的使用,使得程序甚是复杂,再加上队列指针,而且指针错误在调试的时候不提示错误,只是编好的程序看似没有错误,却在执行时出现异常而中断,由于使用指针使得程序庞大检查改正困难,无法发现隐藏的错误,只是程序无法进行下去。 最终本程序选择数组保存PCB信息,存储和调用都简单化。 改进之处: 学习指针,并且使用三个队列,就绪队列,运行队列,完成队列,使得进程调度模拟更加清晰。 还有一些简单的以解决的问题,不一一列举了。 6.实践心得体会: 通过这次实践学会了不少内容,更深的理解了进程调度的几种算法,而且学会了系统的编写程序,而不是只编写几个功能函数。 在编程过程中,需要查阅各种资料,并且学习前人的编写方法,找出优劣,然后形成自己的思想,最终完成程序的编写。 通过模拟进程调度的两种算法,懂得了各种算法在不同情况下的作用。 选择一个好的调度算法可以是计算机在执行庞大的作业时井井有条,并且使用时间很短。 在模拟过程中出现过好多问题,有的解决了,有的还未解决,不管如何都是一种收获,编写功能函数时总会出现参数调用错误的情况,通过分析解决了。 在指针指向的问题上,觉得很复杂,最终没有解决。 7.总结: 为期一周的操作系统实践课结束了,编写了包含有两种调度算法的进程调度模拟程序,两种程序各有优劣,FCFS调度算法是按照进程进入系统的时间先后被CPU选择创建的,这种算法易于实现,但效率不高,只顾及到进程的等候时间,没考虑要求服务的时间长短,相比SJF算法不利于较短的作业。 本程序的另一种调度算法是RR算法,它在调度是是为每个进程分配时间片,当时间片用完时,进程便排到队尾以便下次分配,这种调度策略可以防止那些很少使用设备的进程长时间占用处理器,导致要使用设备的那些进程没机会启动设备。 在编写程序的同时,还学习了进程调度的其他算法,明白了它们各自的优劣,懂得了计算机在调度进程时的取舍。 8.参考文献: 1.操作系统教程(第4版)…………孙钟秀主编高等教育出版社; 2.算法与数据结构-C语言描述(第2版)……张乃孝主编高等教育出版社; 3.网络资源;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度
![提示](https://static.bdocx.com/images/bang_tan.gif)