时间片轮转算法和优先级调度算法-C语言模拟实现.doc
时间片轮转算法与优先级调度算法语言模拟实现 收藏 一、目得与要求进程调度就是处理机管理得核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会与了解优先数算法与时间片轮转算法得具体实施办法。二、实验内容1、设计进程控制块PCB得结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用得CP时间、进程到完成还需要得时间、进程得状态、当前队列指针等。 2、编写两种调度算法程序:优先数调度算法程序循环轮转调度算法程序3、按要求输出结果。三、提示与说明分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执行状态(UN)、就绪状态(EDY,包括等待状态)与完成状态(SH),并假定初始状态为就绪状态。(一)进程控制块结构如下: AE进程标示符 RION进程优先数进程每次轮转得时间片数(设为常数2) CPUTIME进程累计占用CPU得时间片数 NEEDTME进程到完成还需要得时间片数 STE进程状态 EXT链指针注: 、为了便于处理,程序中进程得得运行时间以时间片为单位进行计算; 2、各进程得优先数或轮转时间片数,以及进程运行时间片数得初值,均由用户在程序运行时给定。(二)进程得就绪态与等待态均为链表结构,共有四个指针如下: RU当前运行进程指针 RADY就需队列头指针 TAI就需队列尾指针 FINIS完成队列头指针(三)程序说明 1、 在优先数算法中,进程优先数得初值设为: 50NEEDIME每执行一次,优先数减1,CU时间片数加,进程还需要得时间片数减1。在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加2,进程还需要得时间片数减2,并退出CPU,排到就绪队列尾,等待下一次调度。 2、 程序得模块结构提示如下:整个程序可由主程序与如下个过程组成:(1)INSERT1在优先数算法中,将尚未完成得PB按优先数顺序插入到就绪队列中;(2)INSR2在轮转法中,将执行了一个时间片单位(为),但尚未完成得进程得PB,插到就绪队列得队尾;()FIRSTIN调度就绪队列得第一个进程投入运行;()PINT显示每执行一次后所有进程得状态及有关信息。(5)CREAE创建新进程,并将它得PCB插入就绪队列;()PRICH按优先数算法调度进程;(7)RUDSCH按时间片轮转法调度进程。主程序定义CB结构与其她有关变量。(四)运行与显示程序开始运行后,首先提示:请用户选择算法,输入进程名与相应得NEEDTI值。每次显示结果均为如下5个字段: name cpime eeime ririt tate注: 1.在stat字段中,"R"代表执行态,W"代表就绪(等待)态,"F"代表完成态。2.应先显示"R"态得,再显示"W"态得,再显示"F"态得。 .在W"态中,以优先数高低或轮转顺序排队;在""态中,以完成先后顺序排队。iew picopy to cipbordprint?1. /* 2. 操作系统实验之时间片轮转算法与优先级调度算法 3. By Viual C+ 6、0 4. */ #nclue <tdi、h> iclude tdlib、h> #iclude <trng、h> typedef stuct node char ame0; /*进程得名字* int pio; /进程得优先级*/ it round; /*分配C得时间片*/ int cputme; /*PU执行时间*/ nt needtime; /*进程执行所需要得时间* char state; /*进程得状态,W就绪态,执行态,完成态*/ i count; /*记录执行得次数*/ truct node *next; /*链表指针*/ CB; PC *adyNULL,*runNULL,*finih=NLL; /*定义三个队列,就绪队列,执行队列与完成队列*/ int n; voi GeFist(); /*从就绪队列取得第一个节点*/ vid Opu(); /*输出队列信息*/ void Insetrio(PCB in); /创建优先级队列,规定优先数越小,优先级越高*/ o Iertm(C in); /*时间片队列*/ void Insertis(CB *in); /*时间片队列*/ od PrioCrate(); /*优先级输入函数*/ voi TimeCrate(); /时间片输入函数*/ vid riori(); /*按照优先级调度*/ void RoundRu(); /*时间片轮转调度*/ n main(void) car choe; prit(请输入要创建得进程数目:n); saf(",&n); getchar(); prntf(输入进程得调度方法:(P/R)n"); af(%c,hose); sich(cose) c '': case '': ProCreate(); Prioriy(); bek; case 'R: se '': TmeCreate(); RouRun(); beak; faul:break; utpu(); etr ; vod GtFrt() /*取得第一个就绪队列节点* run = red; i(ea!NULL) ru ->stae = 'R; ray = rdy ->ext; ru ->next ULL; vid Outpu() *输出队列信息* *p; ady; prit("进程名t优先级t轮数tpu时间t需要时间t进程状态计数器n"); wile(p!=NULL) prit("%st%dt%dtdt%t%cdn,p->ame,->prio,->rund,>cutime,p>needte,p->sate,p->count); p = p-nxt; p inis; hie(p!=ULL) pritf("%sdtt%dt%dt%t%dn,p>ame,p->pio,p-round,>cputme,p->netime,p->st,p->out); p p->nxt; p rn; wie(!NUL) rtf(st%dt%dtdt%dt%ctt%dn",p-name,p->prio,-rnd,p>cptime,->eedtime,p->sate,p->cunt); = p>next; id InsetPrio(PB *) *创建优先级队列,规定优先数越小,优先级越低/ PCB *st,nxt; fst = xt = ready; if(ad = ULL) /如果队列为空,则为第一个元素 in->net = ready; edy = in; ls /*查到合适得位置进行插入* i(in -pri > t ->po) /比第一个还要大,则插入到队头*/ i-nxt ead; ready = in; lse whie(ft->nex != NUL) /*移动指针查找第一个别它小得元素得位置进行插入*/ n fst; fs ->next; f(st ->nex = NULL) /已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/ i ex fs -x; f ->next = n; ee /*插入到队列中*/ nxt = in; in >next = fst; vo Iertime(PCB *n) *将进程插入到就绪队列尾部/ PCB *fst; fst ready; i(ady = NULL) in->nt = rdy; ead in; lse il(st->next != NUL) st = fst-next; i -nex = fst -nxt; fst ->nxt = in; id Insertnih(CB *in) /*将进程插入到完成队列尾部*/ PCB *fst; ft = finsh; f(fiish = NULL) ->nxt finish; inish = in; ele whil(fst->next != LL) = fs->nxt; n ->xt st ->next; ft ->net = in; void rioCreate() /优先级调度输入函数* PCB *tp; int ; prit("输入进程名字与进程所需时间:n); f(i 0;i < nu; i+) f(tmp = (PC )malloc(izf(PCB)))NLL) perror("mallo"); exi(1); scan("%s,tmpna); getcha(); 吸收回车符号*/ scanf(%d",&(mp->nedtime); tm ->cputime = ; p ->stte W'; tmp ->po = 50 tp-eedme; /*设置其优先级,需要得时间越多,优先级越低*/ tmp ->rud = tmp >coun = 0; InsrtPrio(p); /*按照优先级从高到低,插入到就绪队列*/ voi Timeat() 时间片输入函数/ C *mp; nt i; prn("输入进程名字与进程时间片所需时间:"); for( = i < nu; +) if(mp = (PCB *)mlloc(izof(PCB)=NLL) perror("malloc"); exit(1); canf(",m->ame); echar(); scan(%d",&(tp->nedime); tmp -cutime = 0; tmp >stae 'W' tmp ->ri = 0; p -rod = 2; *假设每个进程所分配得时间片就是2* tmp -coun = 0; IsrtTm(tp); void riory() /*按照优先级调度,每次执行一个时间片*/ nt flag = 1; Get(); whle(rn != NUL) /当就绪队列不为空时,则调度进程如执行队列执行*/ Ouput(); /*输出每次调度过程中各个节点得状态*/ whie(la) run>i -= 3; /*优先级减去三*/ run->puime+; /*CPU时间片加一 run->eetme-;*进程执行完成得剩余时间减一 if(n->needtime = 0)/*如果进程执行完毕,将进程状态置为F,将其插入到完成队列*/ un ->tte = 'F' rnount+; /进程执行得次数加一*/ InertFih(un); g = 0; s 将进程状态置为,入就绪队列* rn->state = ' run-count+; /*进程执行得次数加一 IsertTme(rn); flg = 0; fl Getirt(); /继续取就绪队列队头进程进入执行队列* vod onRun() /时间片轮转调度算法* int fag = 1; GtFirt(); ie(ru != NUL) utput(); we(fla) uount; rn->cputm+; run->nedime-; if(runeedtme = 0) /*进程执行完毕*/ run ->tae = 'F'; nsetFinish(un); flag = 0; e if(u->count = run>rud)/时间片用完 rn->ste = 'W' run->ount 0; /*计数器清零,为下次做准备*/ InserTim(rn); lag = ; ag = 1; GetFrst();