处理机调度实验报告.docx
- 文档编号:9187082
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:28
- 大小:20.98KB
处理机调度实验报告.docx
《处理机调度实验报告.docx》由会员分享,可在线阅读,更多相关《处理机调度实验报告.docx(28页珍藏版)》请在冰点文库上搜索。
处理机调度实验报告
计算机与信息技术学院综合性、设计性实验报告
专业:
计算机科学与技术年级/班级:
08级计科二班2010—2011学年第一学期
课程名称
计算机操作系统
指导教师
本组成员
学号姓名
实验地点
实验时间
项目名称
进程管理
实验类型
综合性
一、实验目的和要求
通过使用不同的算法来实现进程调度,运用优先级调度的时间片轮转算法、先后顺序的时间片轮转调度算法和先来先服务算法来模拟进程调度的过程,加深对进程概念和进程调度过程的理解。
在Linux下用C语言编程模拟优先级和时间片轮转进程调度算法。
为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程情况显示出来。
二、实验仪器或设备
配有linux操作系统的微型计算机一台
三、总体设计(设计原理、设计方案及流程等)
首先,用交互式的过程来动态模拟进程的调度过程。
通过输入数字来按特定的算法模拟处理机调度过程。
输入1时,按优先级调度的时间片轮转算法模拟进程调度;输入2时,按先后顺序的时间片轮转调度算法模拟进程调度;输入3时,按先来先服务算法模拟进程调度;输入4时,退出程序;输入其他数字时,会显示信息“YOUHAVENOTCHOOSEANYALGORITHM!
”并退出程序。
其次,为进程的信息存放和进程的状态设置必要的数据结构来存放。
进程的信息包括进程名、已经执行的cpu时间、还需要的cpu时间、进程所处的状态和在进程队列中指向此进程的下一个进程的指针。
这些是上述三个算法都要用到的。
还有一些信息是某个算法所特有的,如优先级时间片轮转算法需要用到进程优先级,先后顺序的时间片轮转需要用到得到执行的时间片的个数(有的是2个cpu为一个时间片,有的是1个cpu为一个时间片),先来先服务的算法需要用到进程到来时间。
特别说明,为了便于描述进程所处的状态,将进程的状态用枚举类型来存放。
最后,执行合适的算法来实现基础调度过程。
四、实验步骤(包括主要步骤、代码分析等)
实验分4次完成
第1次:
完成程序的主框架设计,进行调试,验证其正确性;)
第2次:
详细设计,进行调试,验证其正确性;
第3次:
进行整体调试;
第4次:
验证其设计的正确性,完成实验报告。
代码分析:
#include
#include
#defineP_NUM5
#defineP_TIME50
enumstate{
ready,//准备好
execute,//执行
block,//阻塞
finish//结束
};
structpcbb{
charname[4];
intcometime;//进程到来时间
intpriority;//数越大优先级越高
intcputime;//已占用CPU的时间,也就是该处理机开始工作的时间
intneedtime;//执行时间
intcount;//得到的时间片的次数
enumstateprocess;
structpcbb*next;
};
typedefstructpcbbpcb;
voiddisplay_menu(){
printf("CHOOSETHEALGORITHM:
\n");
printf("1PRIORITY\n");
printf("2ROUNDROBIN\n");
printf("3FIRSTCOMEFISETSERVER\n");
printf("4EXIT\n");
}
pcb*get_process(){//输入各个进程,并组合成链队列处理,返回队头指针
pcb*q;inti=0;
pcb*p;//队头指针
pcb*t;//队尾指针
printf("inputnameandtime\n");
while(i q=(pcb*)malloc(sizeof(pcb)); scanf("%s",q->name); scanf("%d",&q->needtime); q->cputime=0;//cputime初始化为0 q->priority=P_TIME-q->needtime;//所需要的时间越少优先级越高 q->process=ready;//process的状态初始化为ready q->next=NULL; if(i==0){//队列中的第一个 p=q; t=q;//队尾指针也要处理 } else{//插入到队列尾 t->next=q; t=q; } i++; } returnp; } voidfree_process(pcb*p){ pcb*q; while(p! =NULL){//队列不空时,处理队头 q=p; p=p->next; free(q); } } voiddisplay(pcb*p){ printf("namecputimeneedtimeprioritystate\n"); while(p){ printf("%s",p->name); printf(""); printf("%d",p->cputime); printf(""); printf("%d",p->needtime); printf(""); printf("%d",p->priority); printf(""); switch(p->process){ caseready: printf("ready\n");break; caseexecute: printf("execute\n");break; caseblock: printf("block\n");break; casefinish: printf("finish\n");break; } p=p->next; } } intprocess_finish(pcb*q){//判断队列中有没有进程,没有返回1,有返回0 intb=1; while(q){ b=b&&q->needtime==0; q=q->next; } returnb; } voidcpuexe(pcb*q){//cputime指已经执行的时间,needtime指还需要的时间 pcb*tr=q; inttp=0; while(q){ if(q->process! =finish){//时间片到,修改上次执行的进程的状态 q->process=ready; if(q->needtime==0){ q->process=finish; } } if(tp =finish){ //让tr指向优先级最高的未完成的进程 tp=q->priority; tr=q; } q=q->next; } if(tr->needtime! =0){//执行tr所指向的进程 tr->priority-=3;//每执行一次优先级降低三个单位 tr->needtime--;//进程还需要的时间减去1 tr->process=execute;//状态为执行 tr->cputime++;//进程的已经执行的时间加上1 } } voidpriority_cal(){ pcb*p;intcpu; p=get_process();//输入各个进程,并组合成链队列处理,返回队头指针 printf("输出各个进程的初始化信息: \n"); display(p); cpu=0;//表示当前执行的cpu时间 while(! process_finish(p)){//就绪队列中还有进程 cpu++; printf("cputime: %d\n",cpu); cpuexe(p);//选择优先级最高的进程执行一个时间单位 display(p);//每调度一次就显示次 sleep (2); } free_process(p);//释放所有进程 printf("Allprocesseshavefinished\n"); } pcb*get_process_round(){ pcb*q; pcb*p;//头指针 pcb*t;//尾指针 inti=0; printf("inputnameandtime\n"); while(i q=(pcb*)malloc(sizeof(pcb)); scanf("%s",q->name); scanf("%d",&q->needtime); q->cputime=0; q->count=0; q->process=ready; q->next=NULL; if(i==0){ p=q; t=q; } else{ t->next=q; t=q; } i++; } returnp; } voidcpu_round(pcb*q){ if(q->needtime==1) q->cputime++; else q->cputime+=2; q->needtime-=2; if(q->needtime<0){ q->needtime=0; } q->count++; q->process=execute; } pcb*get_next(pcb*k,pcb*head){ pcb*t; t=k; do{ t=t->next; }while(t&&t->process==finish); if(t==NULL){ t=head; //k是刚刚被执行的节点,如果t->next=k,所明就绪队列除了k和t以外都//已结束,按照时间片轮转算法,该t执行 while(t->next! =k&&t->process==finish){ t=t->next; } } returnt; } voidset_state(pcb*p){ pcb*q; q=p; while(q){ if(q->needtime==0){ q->process=finish; } if(q->process==execute){ q->process=ready; } q=q->next; } } voiddisplay_round(pcb*p){//显示各个进程的信息 pcb*q; q=p; printf("namecputimeneedtimecountstate\n"); while(q){ printf("%s",q->name); printf(""); printf("%d",q->cputime); printf(""); printf("%d",q->needtime); printf(""); printf("%d",q->count); printf(""); switch(q->process){ caseready: printf("ready\n");break; caseexecute: printf("execute\n");break; caseblock: printf("block\n");break; casefinish: printf("finish\n");break; } q=q->next; } } voidround_cal(){ pcb*p; pcb*r;intcpu; p=get_process_round();//输入各个进程,并组成链队列,返回队头指针 printf("输出各个进程的初始化信息: \n"); display_round(p); cpu=0; r=p; while(! process_finish(p)){//就绪队列中还有进程 if(r->needtime==1) cpu+=1; else//如果需要的时间长度大于等于2 cpu+=2;//时间片长度是2 cpu_round(r); r=get_next(r,p);//获得下一个需要执行的进程 printf("cputime: %d\n",cpu); display_round(p);//每调度一次就显示次 set_state(p); sleep (2); } free_process(p);//释放所有进程 printf("Allprocesseshavefinished\n"); } pcb*get_process_fcfs(){//输入各个进程,并组成链队列处理,返回队头指针 pcb*q,*r,*f;inti=0; pcb*p;//队头指针 pcb*t;//队尾指针 printf("inputname、cometimeandneedtime\n"); while(i { q=(pcb*)malloc(sizeof(pcb)); scanf("%s",q->name); scanf("%d",&q->cometime); scanf("%d",&q->needtime); q->cputime=0;//cputime初始化为0 q->process=ready;//process的状态初始化为ready q->next=NULL; if(i==0) {//队列中的第一个 printf("队列中的第一个\n"); p=q; t=q;//队尾指针也要处理 } else { if(q->cometime>=t->cometime) {//插到队列尾 t->next=q; t=q; } else {//从队头开始扫描 if(p->cometime>q->cometime) { q->next=p; p=q; } else { r=p; f=r; while(r) { if(r->cometime<=q->cometime) { f=r; r=r->next; } else {//插入到r前面 q->next=r; f->next=q; break; } } } } } i++; } returnp; } voiddisplay_fcfs(pcb*p,intcpu){//显示各个进程的信息 pcb*q; q=p; printf("namecputimeneedtimecometimestate\n"); while(q&&cpu>=q->cometime){ printf("%s",q->name); printf(""); printf("%d",q->cputime); printf(""); printf("%d",q->needtime); printf(""); printf("%d",q->cometime); printf(""); switch(q->process){ caseready: printf("ready\n");break; caseexecute: printf("execute\n");break; caseblock: printf("block\n");break; casefinish: printf("finish\n");break; } q=q->next; } } voidfcfs_cal(){ pcb*p; pcb*r; intcpu; intcpufree; p=get_process_fcfs();//输入各个进程,并组成链队列,返回队头指针 printf("输出各个进程的初始化信息: \n"); display_fcfs(p,100); cpu=0; r=p; while(r&&r->process! =finish){//就绪队列中还有进程 cpufree=0; if(cpu<=r->cometime){//cpu空闲 cpufree=r->cometime-cpu; cpu=r->cometime+r->needtime; } else{ cpu=cpu+r->needtime; } r->cputime=r->needtime; r->needtime=0; r->process=execute; printf("cputime: %dcpufree: %d\n",cpu,cpufree); display_fcfs(p,cpu);//每调度一次就显示次 set_state(p); r=r->next; sleep (2); } free_process(p);//释放所有进程 printf("Allprocesseshavefinished\n"); } intmain(){ intk; display_menu(); scanf("%d",&k); switch(k){ case1: priority_cal();break;//按优先级的时间片轮转 case2: round_cal();break;//按先后顺序的有条件的时间片轮转 case3: fcfs_cal();break;//按先来先服务执行算法 case4: printf("退出! \n");break; default: printf("YOUHAVENOTCHOOSEANYALGORITHM! \n"); } } 五、结果分析与总结 结果与分析: 结果1: CHOOSETHEALGORITHM: 1PRIORITY 2ROUNDROBIN 3FIRSTCOMEFISETSERVER 4EXIT 1 inputnameandtime a3 b2 c1 d5 e4 输出各个进程的初始化信息: namecputimeneedtimeprioritystate a0347ready b0248ready c0149ready d0545ready e0446ready cputime: 1 namecputimeneedtimeprioritystate a0347ready b0248ready c1046execute d0545ready e0446ready cputime: 2 namecputimeneedtimeprioritystate a0347ready b1145execute c1046finish d0545ready e0446ready cputime: 3 namecputimeneedtimeprioritystate a1244execute b1145ready c1046finish d0545ready e0446ready cputime: 4 namecputimeneedtimeprioritystate a1244ready b1145ready c1046finish d0545ready e1343execute cputime: 5 namecputimeneedtimeprioritystate a1244ready B2042execute c1046finish d0545ready e1343ready cputime: 6 namecputimeneedtimeprioritystate a1244ready b2042finish c1046finish d1442execute e1343ready cputime: 7 namecputimeneedtimeprioritystate a2141execute b2042finish c1046finish d1442ready e1343ready cputime: 8 namecputimeneedtimeprioritystate a2141ready b2042finish c1046finish d1442ready e2240execute cputime: 9 namecputimeneedtimeprioritystate a2141ready b2042finish c1046finish d2339execute e2240ready cputime: 10 namecputimeneedtimeprioritystate a3038execute b2042finish c1046finish d2339ready e2240ready cputime: 11 namecputimeneed
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 处理机 调度 实验 报告