《操作系统的进程调度-实验报告(共13页).doc》由会员分享,可在线阅读,更多相关《操作系统的进程调度-实验报告(共13页).doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上计算机操作系统2实验报告 实验一题目:操作系统的进程调度姓名: 学号: 实验日期: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时间片数进程所需时间片数进程状态 进程控制块链结构如下:其中:RUN当前运行进程指针; HEAD进程就绪链链首指针; TAID进程就绪链链尾指针。2 算法与框图(1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者
4、相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。(2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。(3) 程序框图如下图所
5、示。实验步骤建立每个进程的数据结构,也就是计算机中的PCB。PCB有以下一些要素构成。 进程ID:用来唯一标识每个进程(本次实验中随机给出) priority:这个属性就在P算法中有用,数字越大优先级越高,每次执行后优先级减3,以此来照顾优先级略小的小作业。 cputime:表示已经占用的cpu时间资源。 needtime:表示距离完成还需要的cpu时间资源,needtime和cputime此消彼长(cputime+needtime=初始的needtime) round:这个属性就在RR算法中有用,表示该进程“已经轮到了多少次”state:表示进程的三个状态:就绪,工作,完成各个进程通过链表链
6、接,指针指向下一个进程的pcb表格实验运行结果:P算法:输入进程数4以后,由srand函数随机给出各个进程的needtime和priority。之后寻找priority最大的优先做,做的过程就是将cputime=cputime+1,needtime=needtime-1做完之后将priority=priority-3,再次开始寻找新的高优先级进程。RR算法:在输入了进程数3,时间片大小3之后,由srand()函数给出每个函数的needtime。然后从位置靠前的进程开始,工作3个单位时间的cputime,之后cputime=cputime+3,needtime=needtime-3,若needt
7、ime小于3,则置0.,round=round+1.由于同一个时间片只能分配给一个进程,不能分割,因此每个cputime总是时间片大小的整数倍。实验感想:这个实验在编程上的要求很高,由于在数据结构语法上的不扎实,在实现的时候出处碰壁。在老师给的参考的帮助下,完成了这个实验。在实现的过程中,对于书上概念的理解更加深入。例如pcb在内存中利用链表的数据结构链接,pcb中也有各种进程相关的信息。在模拟真机进程调度的同时,对每一个进程的每一步变化都很清晰。在比较这两个算法时,如果时间片过大,就会浪费时间cpu时间(因为在进程的最后可能只需要时间片的前面一小部分),造成资源浪费。在P算法中,优先级每次减
8、少的数也很关键,若是过小了,不能达到照顾低优先级的小进程的作用,若是过大了,优先级这个属性的作用就不明显了。具体的取值还要参考优先数的大小和进程needtime的大小。思考题:(1) 示例中的程序,没有使用指针型(pointer)数据结构,如何用指针型结构改写本实例,使更能体现C语言的特性。答:将示例程序中的“下一个进程的进程号”把改为int *next;的数据类型,即:struct pcbint id;/进程号int *next;/下一个进程的进程号int pri;/进程优先数int ct;/占用CPU的时间片数int at;/进程总共所需的时间片数int state;/进程状态(1.运行、
9、2.就绪、3.完成);(2) 如何在程序中真实地模拟进程运行的时间片?答:通过建立一个time进行自增运算,从而真实地模拟时间片运行。(3) 如果增加进程的“等待”状态,即进程因请求输入输出等问题而挂起的状态,如何在程序中实现?通过增加一个判断语句,if(有请求输入输出)挂起程序,即时间片自增,但是进程需要运行的时间,还有优先级均不变。若没有输入输出,则继续原来的操作。实验源代码:#include #include #include #include #include #include enum state /进程的状态 Ready,Working,Finish;struct pcb /PCB
10、数据结构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 Start Scheduling!nn;getch();srand(unsigned)time(NULL
11、); /初始化随机数种子发生器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; /尾插法建立PCB节点i+; /whilereturn p;void display(pcb *p)/优先数算法结果输出coutProcessID Cputime Needtime Priority Stateendl;while(p) cout pid;
12、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) /判断是否所有进程都已完成,是则返回1int bl=1;while(bl&q) bl=bl&q-needtime=0;q=q-next;return bl;void cpu
13、exe(pcb *q) /优先数算法模拟进程执行函数pcb *t=q;int tp=-1;while(q) if (q-process!=Finish) /未完成的进程置Ready,完成的进程置Finishq-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) /修改正在执行的进程的信息,并置其状态为Workingt-priority-=3;if(t-priori
14、typriority=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) /当不是所有进程都完成时不断执行进程并显示信息cpu+;coutCPUTime:cpuendl;cpuexe(p);display(p);coutendl;
15、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!endlendlproc;couttimepiece;while(timepiece5) coutendlIllegal Input!
16、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;elset-next=q;t=q;i+; /whilereturn p;void cpu_round(pcb *p,pcb *q)/时间片算法模拟
17、进程执行函数while(p)if (p-needtime=0) /完成的进程置Finish,其它置Readyp-process=Finish;if (p-process=Working)p-process=Ready;p=p-next;q-cputime+=timepiece; /修改正在执行进程的信息,并置其状态为Workingq-needtime-=timepiece;if(q-needtimeneedtime=0;q-round+;q-process=Working;pcb *get_next(pcb *k,pcb *head)/得到下一个应执行的进程pcb *t;t=k;do t=t-
18、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)/时间片算法输出结果coutProcessID Cputime Needtime Round Stateendl;while(p)cout pid;couttt;coutcputime;coutt;coutneedtime;coutt;coutround;coutprocess)case Ready:coutReadyendl;break;ca
19、se 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(!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;专心-专注-专业
限制150内