1、TAIL就需队列尾指针FINISH完成队列头指针(3)程序说明1.在优先数算法中,进程优先数的初值设为:50-NEEDTIME每执行一次,优先数减1, CPU时间片数加1,进程还需要的时间片数减1。在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次, CPU时间片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪队列尾, 等待下一次调度。2.程序的模块结构提示如下:整个程序可由主程序和如下7个过程组成:(1)INSERT1 在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪 队列中;(2)INSERT2在轮转法中,将执行了一个时间片单位(为2),但尚未完成 的进
2、程的PCB,插到就绪队列的队尾;(3)FIRSTIN调度就绪队列的第一个进程投入运行;(4)PRINT显示每执行一次后所有进程的状态及有关信息。(5)CREATE创建新进程,并将它的PCB插入就绪队列;(6)PRISCH按优先数算法调度进程;(7)ROUNDSCH按时间片轮转法调度进程。主程序定义PCB结构和其他有关变量。(4)运行和显示程序开始运行后,首先提示:请用户选择算法,输入进程名和相应的NEEDTIME 值。每次显示结果均为如下5个字段:1.在state字段中,代表执行态,W,代表就绪(等待)态F” 代表完成态。2.应先显示R态的,再显示态的,再显示F态的。3.在VT态中,以优先数高
3、低或轮转顺序排队;在F”态中,以完成先后顺 序排队。view plaincopy to cl ipboardpr int?1. /*2.操作系统实验之时间片轮转算法和优先级调度算法3.By VisuaI C+ 6.04.*/#include stdl ib.h#include string. htypedef struet nodecharname20;/*进程的名字*/intpr io;/*进程的优先级*/round;/*分配CPU的时间片*/eput ime;/CPU执行时间*/needtime;/*进程执行所需要的时间/char state; /*进程的状态,W 就绪态,R 执行态,F
4、完成态*/i nt count; /*记录执行的次数*/struct node *next; /* 链表指针*/PCB;PCB *ready=NULL, *run=NULL, *f i n i sh=NULL; /*定艾三个队列,就绪队列,执行队列和完成队列*/irrt num;voidGetFi rst ();/*从就绪队列取得第一个节点*/Output ();/*输出队列信息*/1nsertPr i o (PCB*in); /*创建优先级队列,规定优先数越小,优先级越高*/1nsertT ime (PCB /*时间片队列*/lnsertFinish(PCB *in);Pr ioCreate
5、();/*优先级输入函数*/TimeCreateO ;/*时间片输入函数*/Pr ior ityO ;/*按照优先级调度*/RoundRunO ;/*时间片轮转调度*/ma i n (vo i d)char chose;printfC1请输入要创建的进程数目:nR);seanf (Ed, &num);get char ();printfC*输入进程的调度方法:(P/R)nM);seanf &chose);switch (chose)case 1P:case p*:Pr ioCreate ();Prior ity ();break;case R :rT imeCreate ();defauIt:
6、return 0;void GetFi rst () /*取得第一个就绪队列节点*/run = ready;if (ready!=NULL)run -state = R;ready = ready -next;next = NULL;vo i d Output () /*输出队列信息*/PCB *p;p = ready;printf (M进程名t优先级t轮数tcpu时间t需要时间t进程状态t计数器n);whi le(p!二NULL)pr intf(n%st%dt%dt%dt%dtt%ctt%dnM, p-name,p-pr io,p-round, p-cput ime, p-needt ime
7、, p-state,p-count);p 二 p-p = finish;pr intf C%st%dt%dt%dt%dtt%ctt%dnM,p-prio,p-und,*/p-needtime, p-p = p-Ip = run;pr intf (,%st%dt%dt%dt%dtt%ctt%dnM, p-name, p-pr io, p-cputime, p-lnsertPrio(PCB *in) /*创建优先级队列,规定优先数越小,优先级越低PCB *fst,*nxt;fst = nxt = ready;if (ready = NULL) /*如果队列为空,则为第一个元素*/in-next 二
8、 ready;ready = in;else /*查到合适的位置进行插入*/if (in -prio = fst -pr io) /*比第一个还要大,则插入到队头*/e I sewhi le(fst-next != NULL) /*移动指针查找第一个别它小的元素的位置进行插入*/nxt = fst;fst = fst-if(fst -next = NULL) /*已经搜索到队尾,则其优先级数置小,将其插入到队尾即可*/i n -next = fst -fst -next = in;else /*插入到队列中*/nxt = in;in -next 二 fst;void I nsertTi me
9、(PCB * i n) /*将进程插入到就绪队列尾部*/PCB *fst;fstready;if (readyNULL)i n-while (fst-= NULL)void I nsertF inish (PCB * i n) /*将进程插入到完成队列尾部*/fst = finish;if (finish = NULL)next = finish;finish = in;fst-void PrioCreateO /*优先级调度输入函数*/PCB *tmp;irrt i;pr intf (”输入进程名字和进程所需时间:nH);for (i = 0;i name);getchar () ; /*吸
10、收回车符号*/scanf Cd,&(tmp-needtime);tmp -cput i me = 0;state =,Wpr io = 50 - tmp-needt ime; /*设置其优先级,需要的时间越多,优先级越低*/round = 0;/*按照优先级从离到低,插入到就绪队列count = 0;InsertPr io(tmp);void TimeCreateO /*时间片输入函数*/printfC1输入进程名字和进程时间片所需时间:nu);perror(MmallocH);scanf(n%sH, tmp-scanf ,&InsertTime(tmp);whi le(run != NULL
11、) /*当就绪队列不为空时,則调皮进程如执行队列执行*/ /*输出每次调度过程中冬个节点的状态*/whi Ie (f I ag)run-pr io -二3; /*优先级减去三*/cput ime+; /*CPU 时间片加一*/needt i me ;/*进程执行完成的剩余时间减一*/if(run-needtime = 0)/*如果进程执行完毕,将进程状态置为F.将其插入到完成队列*/s tate = F;r un-count+; /*进程执行的次数加一*/InsertFinish (run);flag = 0;else /*将进程状态置为也入就绪队列*/WInsertTime (run);flag = 1;GetFirst (); /*继续取就绪队列队头进程进入执行队列*int flag = 1;whi le (run !whi le (f I ag)needtime;if (run-needt ime = 0) /*进程执行完毕*/state = F;else if (run-count = run-round)/*时间片用完*/W*; /*计数器清零,为下次做准备*1;flag