版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
专业:计算机科學与技术年级/班级:08级计科二班—第一學期課程名称计算机操作系统指导教師本组组员學号姓名试验地點试验時间项目名称進程管理试验类型综合性一、试验目的和规定通過使用不一样的算法来实現進程调度,运用优先级调度的時间片轮转算法、先後次序的時间片轮转调度算法和先来先服务算法来模拟進程调度的過程,加深對進程概念和進程调度過程的理解。在Linux下用C語言编程模拟优先级和時间片轮转進程调度算法。為了清晰地观测每個進程的调度過程,程序应将每個時间片内的進程状况显示出来。二、试验仪器或设备配有linux操作系统的微型计算机一台三、總体设计(设计原理、设计方案及流程等)首先,用交互式的過程来動态模拟進程的调度過程。通過输入数字来按特定的算法模拟处理机调度過程。输入1時,按优先级调度的時间片轮转算法模拟進程调度;输入2時,按先後次序的時间片轮转调度算法模拟進程调度;输入3時,按先来先服务算法模拟進程调度;输入4時,退出程序;输入其他数字時,會显示信息“YOUHAVENOTCHOOSEANYALGORITHM!”并退出程序。另一方面,為進程的信息寄存和進程的状态设置必要的数据构造来寄存。進程的信息包括進程名、已經执行的cpu時间、還需要的cpu時间、進程所处的状态和在進程队列中指向此進程的下一种進程的指针。這些是上述三個算法都要用到的。尚有某些信息是某個算法所特有的,如优先级時间片轮转算法需要用到進程优先级,先後次序的時间片轮转需要用到得到执行的時间片的個数(有的是2個cpu為一种時间片,有的是1個cpu為一种時间片),先来先服务的算法需要用到進程到来時间。尤其阐明,為了便于描述進程所处的状态,将進程的状态用枚举类型来寄存。最终,执行合适的算法来实現基础调度過程。四、试验环节(包括重要环节、代码分析等)试验分4次完毕第1次:完毕程序的主框架设计,進行调试,验证其對的性;)第2次:详细设计,進行调试,验证其對的性;第3次:進行整体调试;第4次:验证其设计的對的性,完毕试验汇报。代码分析:#include<stdio.h>#include<stdlib.h>#defineP_NUM5#defineP_TIME50enumstate{ 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<P_NUM){ 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("namecputimeneedtime priority state\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<q->priority&&q->process!=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<P_NUM){ 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("namecputimeneedtime count state\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<P_NUM) { 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("namecputimeneedtimecometime state\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:1PRIORITY2ROUNDROBIN3FIRSTCOMEFISETSERVER4EXIT1inputnameandtimea3b2c1d5e4输出各個進程的初始化信息:namecputimeneedtime priority statea 0 3 47 readyb 0 2 48 readyc 0 1 49 readyd 0 5 45 readye 0 4 46 readycputime:1namecputimeneedtime priority statea 0 3 47 readyb 0 2 48 readyc 1 0 46 executed 0 5 45 readye 0 4 46 readycputime:2namecputimeneedtime priority statea 0 3 47 readyb 1 1 45 executec 1 0 46 finishd 0 5 45 readye 0 4 46 readycputime:3namecputimeneedtime priority statea 1 2 44 executeb 1 1 45 readyc 1 0 46 finishd 0 5 45 readye 0 4 46 readycputime:4namecputimeneedtime priority statea 1 2 44 readyb 1 1 45 readyc 1 0 46 finishd 0 5 45 readye 1 3 43 executecputime:5namecputimeneedtime priority statea 1 2 44 readyB2 0 42 executec 1 0 46 finishd 0 5 45 readye 1 3 43 readycputime:6namecputimeneedtime priority statea 1 2 44 readyb 2 0 42 finishc 1 0 46 finishd 1 4 42 executee 1 3 43 readycputime:7namecputimeneedtime priority statea 2 1 41 executeb 2 0 42 finishc 1 0 46 finishd 1 4 42 readye 1 3 43 readycputime:8namecputimeneedtime priority statea 2 1 41 readyb 2 0 42 finishc 1 0 46 finishd 1 4 42 readye 2 2 40 executecputime:9namecputimeneedtime priority statea 2 1 41 readyb 2 0 42 finishc 1 0 46 finishd 2 3 39 executee 2 2 40 readycputime:10namecputimeneedtime priority statea 3 0 38 executeb 2 0 42 finishc 1 0 46 finishd 2 3 39 readye 2 2 40 readycputime:11namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 2 3 39 readye 3 1 37 executecputime:12namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 3 2 36 executee 3 1 37 readycputime:13namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 3 2 36 readye 4 0 34 executecputime:14namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 4 1 33 executee 4 0 34 finishcputime:15namecputimeneedtime priority statea 3 0 38 finishb 2 0 42 finishc 1 0 46 finishd 5 0 30 executee 4 0 34 finishAllprocesseshavefinished進程调度的時间片轮转次序為:cbaebdaedaededd,可以看出進程c結束時间為cpu=1時,進程b結束時间為cpu=5時,進程a結束時间為cpu=10時,進程e結束時间為cpu=13時,進程d結束時间為cpu=15時。成果2:CHOOSETHEALGORITHM:1PRIORITY2ROUNDROBIN3FIRSTCOMEFISETSERVER4EXIT2inputnameandtimea3b2c1d5e4输出各個進程的初始化信息:namecputimeneedtime count statea 0 3 0 readyb 0 2 0 readyc 0 1 0 readyd 0 5 0 readye 0 4 0 readycputime:2namecputimeneedtime count statea 2 1 1 executeb 0 2 0 readyc 0 1 0 readyd 0 5 0 readye 0 4 0 readycputime:4namecputimeneedtime count statea 2 1 1 readyb 2 0 1 executec 0 1 0 readyd 0 5 0 readye 0 4 0 readycputime:5namecputimeneedtime count statea 2 1 1 readyb 2 0 1 finishc 1 0 1 executed 0 5 0 readye 0 4 0 readycputime:7namecputimeneedtime count statea 2 1 1 readyb 2 0 1 finishc 1 0 1 finishd 2 3 1 executee 0 4 0 readycputime:9namecputimeneedtime count statea 2 1 1 readyb 2 0 1 finishc 1 0 1 finishd 2 3 1 readye 2 2 1 executecputime:10namecputimeneedtime count statea 3 0 2 executeb 2 0 1 finishc 1 0 1 finishd 2 3 1 readye 2 2 1 readycputime:12namecputimeneedtime count statea 3 0 2 finishb 2 0 1 finishc 1 0 1 finishd 4 1 2 executee 2 2 1 readycputime:14namecputimeneedtime count statea 3 0 2 finishb 2 0 1 finishc 1 0 1 finishd 4 1 2 readye 4 0 2 executecputime:15namecputimeneedtime count statea 3 0 2 finishb 2 0 1 finishc 1 0 1 finishd 5 0 3 executee 4 0 2 finishAllprocesseshavefinished進程调度的执行次序為:abcdeaded,可以看出進程b結束時间為cpu=4時,進程c結束時间為cpu=5時,進程a結束時间為cpu=10時,進程e結束時间為cpu=14時,進程d結束時间為cpu=15時。成果3:CHOOSETHEALGORITHM:1PRIORITY2ROUNDROBIN3FIRSTCOMEFISETSERVER4EXIT3inputname、cometimeandneedtimea14b73c52d03e151队列中的第一种输出各個進程的初始化信息:namecputimeneedtimecometime stated 0 3 0 readya 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第8课《列夫·托尔斯泰》 说课稿2024-2025学年统编版语文八年级上册
- 二零二五年度工业自动化设备安装工程合同书2篇
- 2024幼儿园食材采购标准协议版B版
- 叠螺污泥脱水机器领域安全操作规程
- 2024第九章航天技术研究与应用合同2篇
- 2025版物流行业仓储管理劳动雇佣合同规范示例3篇
- 加仑瓶口套标机安全操作规程
- 2025年度特许经营合同的违约责任问题3篇
- 2024年高中生专业培训服务合同版B版
- 二零二五年度商务考察车租赁及接待合同3篇
- 五输穴及临床应用1
- 中国成人急性呼吸窘迫综合征(ARDS)诊断与非机械通气治疗指南(2023版)解读
- 绿植租摆服务投标方案(完整技术标)
- 外研版八年级英语上册期末单词词性分类测试表(汉译英)
- 童话知识竞赛课件
- 一氧化氮让你远离心脑血管病第(全书回顾综合版)
- GB/T 12574-2023喷气燃料总酸值测定法
- 2022年天津三源电力集团限公司社会招聘33人上岸笔试历年难、易错点考题附带参考答案与详解
- 抑郁病诊断证明书
- 对话大国工匠-致敬劳动模范期末考试答案
- 财务总监绩效考核表
评论
0/150
提交评论