1、优先数/轮转时间片数占用CPU时间片数进程所需时间片数进程状态进程控制块链结构如下:其中: RUN当前运行进程指针; HEAD进程就绪链链首指针; TAID进程就绪链链尾指针。2 算法与框图(1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状
2、态,直至所有进程都运行完各自的时间片数。(2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。(3) 程序框图如下图所示。实验步骤建立每个进程的数据结构,也就是计算机中的PCB。PCB有以下一些要素构成。 进程ID:用来唯一标识每个进程(本
3、次实验中随机给出) priority:这个属性就在P算法中有用,数字越大优先级越高,每次执行后优先级减3,以此来照顾优先级略小的小作业。 cputime:表示已经占用的cpu时间资源。 needtime:表示距离完成还需要的cpu时间资源,needtime和cputime此消彼长(cputime+needtime=初始的needtime) round:这个属性就在RR算法中有用,表示该进程“已经轮到了多少次”state:表示进程的三个状态:就绪,工作,完成各个进程通过链表链接,指针指向下一个进程的pcb表格实验运行结果:P算法:输入进程数4以后,由srand函数随机给出各个进程的needtim
4、e和priority。之后寻找priority最大的优先做,做的过程就是将cputime=cputime+1,needtime=needtime-1做完之后将priority=priority-3,再次开始寻找新的高优先级进程。RR算法: 在输入了进程数3,时间片大小3之后,由srand()函数给出每个函数的needtime。然后从位置靠前的进程开始,工作3个单位时间的cputime,之后cputime=cputime+3,needtime=needtime-3,若needtime小于3,则置0.,round=round+1.由于同一个时间片只能分配给一个进程,不能分割,因此每个cputime
5、总是时间片大小的整数倍。实验感想: 这个实验在编程上的要求很高,由于在数据结构语法上的不扎实,在实现的时候出处碰壁。在老师给的参考的帮助下,完成了这个实验。在实现的过程中,对于书上概念的理解更加深入。例如pcb在内存中利用链表的数据结构链接,pcb中也有各种进程相关的信息。在模拟真机进程调度的同时,对每一个进程的每一步变化都很清晰。在比较这两个算法时,如果时间片过大,就会浪费时间cpu时间(因为在进程的最后可能只需要时间片的前面一小部分),造成资源浪费。在P算法中,优先级每次减少的数也很关键,若是过小了,不能达到照顾低优先级的小进程的作用,若是过大了,优先级这个属性的作用就不明显了。具体的取值
6、还要参考优先数的大小和进程needtime的大小。思考题:(1)示例中的程序,没有使用指针型(pointer)数据结构,如何用指针型结构改写本实例,使更能体现C语言的特性。答:将示例程序中的“下一个进程的进程号”把改为int *next;的数据类型,即:struct pcb int id;/进程号 int *next;/下一个进程的进程号 int pri;/进程优先数 int ct;/占用CPU的时间片数 int at;/进程总共所需的时间片数 int state;/进程状态(1.运行、2.就绪、3.完成);(2)如何在程序中真实地模拟进程运行的时间片?通过建立一个time进行自增运算,从而真
7、实地模拟时间片运行。(3)如果增加进程的“等待”状态,即进程因请求输入输出等问题而挂起的状态,如何在程序中实现?通过增加一个判断语句,if(有请求输入输出)挂起程序,即时间片自增,但是进程需要运行的时间,还有优先级均不变。若没有输入输出,则继续原来的操作。实验源代码:#include dos.hstdlib.hconio.hiostream.htime.henum state /进程的状态 Ready, Working, Finishstruct pcb /PCB数据结构 int pid; int priority; int cputime; int needtime; int round;
8、state process; pcb *next;int timepiece;pcb *get_process() /优先数算法-输入进程个数 int proc; pcb *q; pcb *t; pcb *p; int i=0; cout proc; while (proc10) endl Illegal Input! proc; /cout endlStart Scheduling!nn getch(); srand(unsigned)time(NULL); /初始化随机数种子发生器 while (ipid=rand()%10000;needtime=rand()%10+1;cputime=
9、0;priority=rand()%100;process=Ready;next=NULL; /利用随机数生成进程信息 if (i=0) p=q; t=q; else t-next=q; /尾插法建立PCB节点 i+; /while return p;void display(pcb *p) /优先数算法结果输出 coutProcessIDCputimeNeedtimePriorityStateendl; while(p) coutpid;ttp-cputime;tneedtime; if(p-needtime=0)Donepriority; switch(p-process) case Re
10、ady:coutWorkingnext;int process_finish(pcb *q) /判断是否所有进程都已完成,是则返回1 int bl=1; while(bl&q) bl=bl&q-needtime=0; q=q- return bl;void cpuexe(pcb *q) /优先数算法模拟进程执行函数 pcb *t=q; int tp=-1; while(q) if (q-process!=Finish) /未完成的进程置Ready,完成的进程置Finish q- if(q- q-process=Finish; if(tp if(t-needtime!=0) /修改正在执行的进程
11、的信息,并置其状态为Working t-priority-=3; if(t-prioritypriority=0;needtime-;process=Working;cputime+;void priority_cal() /优先数算法主控函数 system(cls); p=get_process(); int cpu=0; char key;CPUTime:cpu display(p); while(!process_finish(p) /当不是所有进程都完成时不断执行进程并显示信息 cpu+; cpuexe(p); display(p); key=getch(); if(key=q) ex
12、it(0); printf(All processes are finished!pcb *get_process_round() /时间片算法-输入进程个数及CPU时间片 while(proc10)endlYour process is out of order,please try again!CPU TimePiece(1-5)?timepiece; while(timepiece5) /coutneedtime=0) /完成的进程置Finish,其它置Ready p-process=Working) q-cputime+=timepiece; /修改正在执行进程的信息,并置其状态为Wo
13、rkingneedtime-=timepiece; if(q-needtime while (t & t-process=Finish); if(t=NULL) t=head; while (t!=k &process=Finish) t=t- return t;void display_round(pcb *p) /时间片算法输出结果Roundround;void round_cal() pcb * p; pcb * r; p=get_process_round(); display_round(p); r=p; cpu+=timepiece; cpu_round(p,r); r=get_next(r,p); display_round(p);void display_menu()1 Priority2 Round Robin3 ExitChoice:int main() display_menu(); key; switch(key) case 1:priority_cal();2round_cal();3exit(0); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1