操作系统的进程调度实验报告.doc

上传人:scccc 文档编号:14534610 上传时间:2022-02-08 格式:DOC 页数:14 大小:291KB
返回 下载 相关 举报
操作系统的进程调度实验报告.doc_第1页
第1页 / 共14页
操作系统的进程调度实验报告.doc_第2页
第2页 / 共14页
操作系统的进程调度实验报告.doc_第3页
第3页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《操作系统的进程调度实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统的进程调度实验报告.doc(14页珍藏版)》请在三一文库上搜索。

1、计算机操作系统2实验报告实验一题目:操作系统的进程调度姓名:学号:12125807 实验日期:2014.12 实验要求:1. 设计一个有n个进程工行的进程调度程序。每个进程由一个进程控制块(PCB表示。进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。2. 调度程序应包含23种不同的调度算法,运行时可任意选一种,以利于各种算法的分 析比较。3. 系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程实验目的:1. 进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实习要 求学生

2、独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。例如,简单轮转法和优先数法等。本实习可加深对于进程调度和各种调度算 法的理解。实验内容:1. 编制和调试示例给出的进程调度程序,并使其投入运行。2. 自行设计或改写一个进程调度程序,在相应机器上调试和运行该程序,其功能应该不亚于示例。3. 直观地评测各种调度算法的性能。示例:1.题目本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。 各进程的优先数

3、或轮转时间片数、 以及进程 需要运行的时间片数,均由伪随机数发生器产生。进程控制块结构如下:PCB进程标识数链指针优先数/轮转时间片数占用CPU时间片数进程所需时间片数进程状态进程控制块链结构如下:RUNHEADTAIL其中:RUN 当前运行进程指针;HEAD 进程就绪链链首指针;TAID 进程就绪链链尾指针。2. 算法与框图(1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。 每过一个时间片, 运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。 接着比较现行进程和就绪链链首进程的优先数,

4、如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态, 直至所有进程都运行完各自的时间片数。(2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾, 调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片

5、。(3) 程序框图如下图所示。 胃 FQ W i丿 fly册肯退网丹人延仃rottin*i he n陆竝人决序措 列遵轨拴1M块甜I, ,-. m( HJtof-tWAi I汛 ft kl p ft Mil t Jr-琬 rr N ft 怖一純 /; jbft和近秤捽刊Hl 6!4:可片列可卩-T可”靱SlffflWlffTFhJlzIJ 1-亡.*1生熬临、退色锻实验步骤建立每个进程的数据结构,也就是计算机中的PCB。PCB有以下一些要素构成。进程ID:用来唯一标识每个进程(本次实验中随机给出) priority :这个属性就在 P算法中有用,数字越大优先级越高,每次执行后优先级减3,以此来

6、照顾优先级略小的小作业。 cputime :表示已经占用的cpu时间资源。 needtime:表示距离完成 还需要 的cpu时间资源,needtime和cputime此消彼长(cputime+needtime=初始的 needtime) round:这个属性就在 RR算法中有用,表示该进程“已经轮到了多少次” state:表示进程的三个状态:就绪,工作,完成 各个进程通过链表链接,指针指向下一个进程的pcb表格struct pcbi nt pid; int priority; int cputime;i nt needtittje; i nts匸ate process: pcb匸:实验运行结果

7、:P算法:*E;.T roy Document$cpposProc5ScliedLjiebinDebLig:rWopkin gWoikingfWoi*kinfWorl(ing399020血a也/8093020CFUIirhe=Proces sIBCpu.t idleNeedtimeRo un WorlcingWorlcingWorlcing-398301Finish8093301Finish在输入了进程数3,时间片大小3之后,由srand()函数给出每个函数的needtime。然后从位置靠前的进程开始,工作3个单位时间的cputime,之后 cputime=cputime+3 ,needtim

8、e=needtime-3,若 needtime 小于 3,则置 0.,round=round+1.由于同一个时间片只能 分配给一个进程,不能分割,因此每个cputime总是时间片大小的整数倍。实验感想:这个实验在编程上的要求很高,由于在数据结构语法上的不扎实,在实现的时候出处碰壁。在老师给的参考的帮助下,完成了这个实验。 在实现的过程中,对于书上概念的理解更加深入。例如pcb在内存中利用链表的数据结构链接,pcb中也有各种进程相关的信息。在模拟真机进程调度的同时,对每一个进程的每一步变化都很清晰。在比较这两个算法时,如果时间片过大,就会浪费时间cpu时间(因为在进程的最后可能只需要时间片的前面

9、一小部 分),造成资源浪费。在 P算法中,优先级每次减少的数也很关键,若是过小了,不能达到 照顾低优先级的小进程的作用,若是过大了,优先级这个属性的作用就不明显了。具体的取值还要参考优先数的大小和进程needtime的大小。思考题:(1)示例中的程序,没有使用指针型( pointer )数据结构,如何用指针型结构改写本实例,使更能体现 C 语言的特性。 答:将示例程序中的“下一个进程的进程号”把改为 int *next; 的数据类型,即: struct pcbint id;/ 进程号int *next;/ 下一个进程的进程号int pri;/ 进程优先数int ct;/ 占用 CPU 的时间片

10、数int at;/进程总共所需的时间片数int state;/进程状态(1.运行、2.就绪、3.完成);(2)如何在程序中真实地模拟进程运行的时间片? 答:通过建立一个 time 进行自增运算,从而真实地模拟时间片运行。(3)如果增加进程的“等待”状态,即进程因请求输入输出等问题而挂起的状态,如何 在程序中实现?通过增加一个判断语句, if( 有请求输入输出 )挂起程序,即时间片自增,但是进程需要 运行的时间,还有优先级均不变。若没有输入输出,则继续原来的操作。实验源代码:#include #include #include #include #include #include enum st

11、ate/进程的状态Ready,Working,Finish;struct pcb /PCB 数据结构int pid;int priority;int cputime;int needtime;int round; state process; pcb *next;int timepiece;pcb *get_process()/优先数算法 -输入进程个数int proc;pcb *q;pcb *t;pcb *p;int i=0;cout proc;while (proc10)cout endl Illegal Input! endl endl proc;/cout endl endl Star

12、t Scheduling!nn; getch();srand(unsigned)time(NULL);/ 初始化随机数种子发生器while (ipid=rand()%10000; q-needtime=rand()%10+1; q-cputime=0;q-priority=rand()%100;q-process=Ready;q-next=NULL; if (i=0)p=q; t=q;elset-next=q;t=q; i+;PCB 节点 /while return p;void display(pcb *p)/ 优先数算法结果输出coutProcessID Cputime Needtime

13、Priority Stateendl;while(p) cout pid; couttt; coutcputime; coutt; coutneedtime; coutneedtime=0) coutDone;else coutpriority;coutprocess) case Ready:coutReadyendl;break; case Working:coutWorking-endl;break; case Finish:coutFinishnext; int process_finish(pcb *q)/ 判断是否所有进程都已完成,是则返回1 int bl=1; while(bl&q

14、) bl=bl&q-needtime=0; q=q-next; return bl;/优先数算法模拟进程执行函数void cpuexe(pcb *q)pcb *t=q; int tp=-1;while(q)if (q-process!=Finish)未完成的进程置 Ready,完成的进程置 Fi nishq-process=Ready;if(q-needtime=0) q-process=Finish; if(tppriority&q-process!=Finish)/找到下一个优先数最高且未完成的进程tp=q-priority;t=q;q=q-next;if(t-needtime!=0)/修

15、改正在执行的进程的信息,并置其状态为Workingt-priority-=3;if(t-prioritypriority=0;t-needtime-;t-process=Working; t-cputime+;void priority_cal() / 优先数算法主控函数 pcb *p;system(cls); p=get_process();int cpu=0;char key;system(cls); coutCPUTime:cpuendl;display(p); coutendl;getch(); while(!process_finish(p)/ 当不是所有进程都完成时不断执行进程并显

16、示信息cpu+;coutCPUTime:cpuendl;cpuexe(p);display(p); coutendl; key=getch();if(key=q) exit(0);printf(All processes are finished!);getch();pcb *get_process_round()/时间片算法 - 输入进程个数及 CPU 时间片int proc;pcb *q;pcb *t;pcb *p;int i=0;coutproc;while(proc10)coutendlYour process is out of order,please try again!endl

17、endlproc;couttimepiece;while(timepiece5)coutendlIllegal Input!endlendltimepiece;/cout endl endl Start Scheduling!nn;getch();srand(unsigned)time(NULL);/ 初始化随机数种子发生器while (ipid=rand()%10000;q-needtime=rand()%10+1; q-cputime=0;q-round=0; q-process=Ready; q-next=NULL;if (i=0)/尾插法建立 PCB 节点p=q;t=q;else t-

18、next=q; t=q;i+; /while/时间片算法模拟进程执行函数/完成的进程置 Finish ,其它置 Ready/修改正在执行进程的信息,并置其状态为return p;void cpu_round(pcb *p,pcb *q) while(p)if (p-needtime=0) p-process=Finish;if (p-process=Working) p-process=Ready;p=p-next;q-cputime+=timepiece;Working q-needtime-=timepiece; if(q-needtimeneedtime=0;q-round+; q-pr

19、ocess=Working;pcb *get_next(pcb *k,pcb *head)/得到下一个应执行的进程pcb *t;t=k;dot=t-next;while (t & t-process=Finish);if(t=NULL) t=head;while (t!=k & t-process=Finish) t=t-next;return t;void display_round(pcb *p)/时间片算法输出结果RoundcoutProcessID Cputime Needtime Stateendl;while(p)cout pid;couttt;coutcputime;coutt;

20、 coutneedtime;coutt;coutround;coutprocess)case Ready:coutReadyendl;break;case Working:coutWorking-endl;break;case Finish:coutFinishnext;void round_cal()pcb * p;pcb * r;system(cls);p=get_process_round();int cpu=0;char key;system(cls); coutCPUTime:cpuendl;display_round(p); coutendl;getch();r=p;while(!

21、process_finish(p)cpu+=timepiece; cpu_round(p,r); r=get_next(r,p);coutCPUTime:cpuendl; display_round(p);coutendl;key=getch();if(key=q) exit(0);void display_menu()cout1 Priorityendl;cout2 Round Robinendl;cout3 Exitendl;cout key;switch(key)case 1:priority_cal();break;case 2:round_cal();break;case 3:exit(0);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1