2023年实验报告一进程调度算法.docx
江西师范大学计算机信息工程学院学生实验报告专业12级物联网班 姓名 严超 学号日期2 0 23/0 5 /8课程名称操作系统教程实验室名称W43 1 3实验名称进程调度算法指导教师张练兴成绩1、实验目的用代码实现模拟操作系统的进程调度,以加深对进程的概念及进程调度算法 的理解2、实验原理和内容(1)先来先服务(FCFS)调度算法:从“就绪队列”中选择一个最先进入队列的 进程,为它分派解决器,使之开始运营。(2)优先数调度算法:根据进程的情况或规定赋予进程一个优先级,进程运营过 程中优先级不再改变。每次调度时,就绪队列中优先级最高的进程被率先调度, 同级的采用先来先服务(FCF S ) o3、实验环节进程调度算法:(1)编写进程控制块数据结构(2)统一按照FCFS调度算法创建队列(3)在FCFS调度算法中,将就绪队列队首进程调入执行,假如在队列中存在到 达时间小于等于当前时间的结点,将该结点的状态设为就绪状态。假如当前进程 执行完了,就将其状态改为完毕状态,并将其插入到队尾。(4)在优先级调度算法中,将就绪队列队首进程调入执行,假如在队列中存在到 达时间小于等于当前时间的结点,将该结点的状态设为就绪状态,并对队列中的 结点按优先级数的大小进行排序(队首除外)。假如当前进程执行完了,就将其状 态改为完毕状态,并将其插入到队尾。(5)输出运营后的结果,如周转时间和带权周转时间。4、程序及运营结果(或实验数据记录及分析)进程调度算法:本次实验让我更加明白进程调度的概念,更加了解进程调度的工作原理。 在前期,我是直接将结果显示出来,后来,我又在原有的基础上加了显示每一时 刻队列的信息。在编写此代码过程中碰到很多问题,例如指针问题,指针指来指 去,总是指错地址。<>n o de* p,* q > * f 1 ag;flag =p=h e a d;c 1 oc k =p->arr i ve_ti m e ;®all_time=st a rt_time= h e a d->ar r ive_time;w h i i e( p )。(。 a 1 l_timc+= p > s e r v c_t i me;gp=p-> n ext;p=hcad;while (done)do n e= 0 ;pri n tf( " nn t|- 第 2d 时亥!-I " , clock);。 w h il e (p)° if( p -> a rrive_timc<=cloc k &&p->st a te=-w'|p->s t ate=' r')° 。 p->state='r' d one= 1;° 0 op=p->n e xt;I。 Sor t BySu p er(head);wh i 1 e (fl a g-> n ext)flag=fl a g>n e xt;gpr i nt( h cad);o p r i nt f ("t|-第 2 d 时刻-1 n n ock);i f (clock=all_t i m e ) break;clock+;f i nish_time= s tart_time+he a d->serve_time;»if(fin i s h_time=clock)00 。® h ead->s t a te='f;。 fl a g->n e x t= h e ad;oah e ad=he a d-> n ext;qfla g =flag->nex t ;。 fl a g->n e x t= N U L L;。s tart_ t ime=f i n is h _time;8 。 p=head;»p=he a d;finish, t iine=p->arrive_tinie;» P ri n tf(nn 11-优先数调度算法-);op rintf("nt|进程名 倒达时间|服务时间I开始时间|完毕时间|周转时间|带权周转I ”); whi 1 e( p )(if(p->ar r i v e_t i me<= f i n i sh_time)oas t arl_ti m e = f inish_ t im e ; e Ise。 st a rt_time=p-> a rrive_tim e ;fin i sh_tim e =sta r t_ t im e +p->serv e _time;around _tiine=finish_time-p>arr i v e_tim e ;r i g h t_round_time= ( f loat) ro u nd_tim e /p> s er v e_time;p rin t f(" nt I %8d|%8d|% 8 d|%8d|%8d|%8d I %8.2ff, p ->ID, gp->arriv e _time,p->serve_ t i me,st a rt_tim e ,fin i sh_time, round_t i m e ,r i gh t _roun d _t i me); ° p= p ->n e xt; )op r int f ( " n t|-优先数调度算法-I ");oprintf ( " n "); )int main() char choice;0node *head; 0do p r i ntf("n t t |-MUN E- I n");«pri n t f (" t t |-l.FCFS 调度算法-|nM);® P ri n - 2 .优先数调度算法-|n ");。 prindTttt 你的选择是:< >bb");。 while(scan f (" %c " c hoic e ) !=EOF&&choic e ! =' r&&choice!='2');»h ea d = c re a tc(); aswitch (choice)g c ase 'I':pri n t( h ead);。 FCFS (head); b reak:&<>case ' 2 ':print (head);。叩 r iorit y ( h ead); b reak;运营结果截图:一法 法算 算度1>先来先服务调度算法运营结果1.FCFS调 X曲镯 你的选择7E: 31 0于于 左尖 者不必结数翳 务到服 前m ira 程务 进优到服 入入入入 ZHTTtn于于:n>者不必结数目 T先达务 人优到服 输ttt 程先达务 进优到服 入入入入 A j 本月佳目在DE住HE于于 生尖 >r不如结数翳 T先达务 人优到服 输ttt 程先达务 进优到服 人入 在R本月注目江信请输入进程名(输入T结束):T请输入进程名(输入T结束):T状态WV/W.砾赢调送输福露丽I1 :1:1:2:2:2:3!3:3!结点信息情况进程名123第一个节点 “为当前正在 执行的进程第一个节点 “为当前正在 执行的进程寸间;服务时间;状态进程名;优先级数1:1:2:2:2:进程名;优先级数 2:23!3:3:3:1: 1: 1: 1:状态;:.状态为俵示f! f该进程已结束第7唯°结点信息;进程名 城先级数国达百间;服务时间;状态;:1:1!1:1:£!2:2:2:2!f!SFCFS调度算法!进程名;到达时间;服务时间;开始高M;荒成时间;周转时间;带权周转;1 :1!1:1 :2!1 !1.00!2:2:2:2:4:2:1.00:!3 :3!3:4:7!4:1.33:;FCFS调度算法优先级调度算法运营结果1.FCFS调度舁法一 二二-2:优警调度算法 你的选择是:<2 >1 44 13 22 20 00 0 0 0于于干于I于于I干干里更务4先尖>者不必3先尖>者不必>者不必1先尖 I者不必结数T先达务到服 输m 1 程先达务 进优到服 入入入入 请请请请结数翳 T先达务 入优到服 输m 翳 程先达务 进优到服 入 请请请请入优到服 刖m 程务 进优到服 入 请请请请结数解 T先达务 人优到服 输m 程先达务 进优到服 入入入入 4747101 请请请请状态WWWW时间;4:2:2:1 ;.砾丽圈墟简蠹爵3:1:4:25:3:6 :4:结点信息、情况况J 主即在 自5间1 23:4:鼠小18613 2 4名 程进处于就队列 的进程进程名;优先级教1 i3二间4 51 一焉 B泮 日息间1 靠点达n4!b:4!1!r!2:5:3:2:r iLL_3:4:2:2:r i4 0-11-0S当前正隹执 行的进程进程名;到达时间;服务时间;开始时间;完成时间;周转时间;带权周转1: 1:4:1;5!4;1.004:4:1 ;5 ;6 :2 ;2.002!3!2:6:8 ;5:2.503:2:2 !8 !10:8:4.00意键继续.优先数调度算法具体代码:# i nc 1 u d e <stdio. h>#in c lude<s t dlib.h>#defin e MAX 100 0t ypede f str u ct pr o g r e s s 。i nt ID;进程名ch a r s t at e ;。进程状态®int super; o / /优先数int a rriv e _time;/ / 到达时间i n t se r v e _t i me;。服务时间s t ruct prog r e s s *next; n ode;n o de* sortFCFS(nodc * he a d, n o de* q)(o de * p ,*pr e ;aint done =0;f ( h e a d =NULL) |(q->arriv e _time)<(he a d>arrive_time) ) /*到达时间最先者,插入队首*/(q->nex t =h e ad;。 h e a d=q;e Ise /水进程比较到达时间,插入适当的位置中*/。叩二 h ead;。p re=p-> next;awhile (pr e !=N U LL) f ( q - >arri v e_time)<(pre>a r riv c _t i me) /*若插入进程比当前进程到达时间小,*/ /*插入到当前进程前面*/。»<»q->ne x t=pre;2»p-> n e xt=q;。p re=NULL;。 。 d o nc= 1;»»elsed|3 p=p->nex t ;op r e= p re-> next;2)A f (done=0) p ->n e xt=q;)r e tum head;)/*函数功能:创建单链表参数:空返回值:指向节点的指针he a d*/n od e * cr e ate()。n o d e *head; node * p,* q ;int x, c ount=0; ohcad=N ULL;叩rinlf("nN请输入进程名【输入-1结束】:");owhi 1 e(scanf ("%d " ,& x )!=EOF&& x ! =- 1 )g p =(no de*) malloc(sizeof ( n ode);print f ( " tt请输入优先级数【优先数高者优先】:");gs c a n f(" %d",& p ->s u p e r );P rint f (" tt请输入到达时间【到达时间不得小于0 : *,);。 sc a nf(" %d”,& p ->a r rive_ t i me);print f("t t请输入服务时间【服务时间必须大于0】:");o scanf(" %d”,&p->serv e _ t i m e );p->ID= x;。 p->s(at e - w* ;®p->ne x t=NULL:。 hcad= sortFCFS(h e ad,p);-prin t请输入进程名(输入结束):”);)r cturn head;)/小函数功能:输出单链表参数:指向节点的指针he ad返回值:空*/v oi d pri n t(n o de *head)。n od e * p ;pi-in t f( n t |"-结点信息情况"-"-);它血(”ntt|进程名|优先级数倒达时间|服务时间|状态 |");°p=h e ad;while(p)(。 printf("n tt I %8d|%8d|% 8 d I %8d|%8cl " , p > I D,p->s u pc r ,p->ar r ive_t i mc,p-> s e rve_ti m e , p ->s t a t e);op=p->next;)°pri ntf("nt |-一结点信息情况-一 -|n");函数功能:运用先来先服务调度算法参数:指向节点的指针head返回值:空存在问题:*/vo i d F CFS( node* h e ad)(int s t a r t _ t i me,finis h _ t i in e =0, r o und_t i me, a 1 1 _ t im e =0;i n t don e =1 ;i nl cl o c k = 0 ;afloatr ight_ro und _time:flag=p=h c ad;clock = p ->a r ri v e_ t i me;0a 1 l_time=start_ti m e=head->arrive_ti m e ;whi 1 e (p)。(al 1 _timc+=p->sc r vc_timc:p=p->n ext;)p=h e ad;whil e ( d o n e)|。 done=0;, p r intf(" n nt|-第2d 时亥U-|",c 1 ock);while (p)。if(p->arri v e_time<=cl o ck&&p->stat e =' w'|p-> s t ate='r')02 。叩> s tale=' r 'done= 1;。° P =P-> n ext;° ®whi 1 e(f 1 a g ->ne x t )tl a g=fl a g -> n ext;® p ri n t(h e a d );Sprint f (" t I -第2 d时亥“一一一-1 nn"»c 1 ock);对 f (clo c k =al 1 _t i mc)br e a k ;。c 1 ock+;。 f i nish_tim e =start_timc+h e ad->serv e _t i me;。i f(fi n ish_tim e = c 1 oc k )°a h ead->s t ate=,f;ogfla g -> n ext=hea d ;a h e ad=hcad->nc x t;f lag= f lag-> n ex t ;»®flag->ne x t=NULL;。 ®starl_lime=fin i sh_time;° Io p= h e ad?»p= head;f i nis h _t i me=p->ar r ive_t i me;prin t f(" t |-FCFS 调度算法-1");oprint f (" n t |进程名|到达时间|服务时间|开始时间|完毕时间I周转时间|带权周转);wh i le(p)if(p->arrive_time<= f inis h _t i me)®<»s t art_t i me=finis h _tim e ;。 elsea s t a rt_ t im e =p->arr i ve_ t im e ;o®fini s h_time=s t a r t _ t i me+ p ->s e rve_t i m e ;r o und_time=fi n is h _ t ime-p->arr i v e_ t ime;r i g h t_round_ t imc=(flo a t) r o u nd_time / p -> s erve_time;。叩 r intf("nt I %8 d |%8 d |%8d|%8d|%8d|%8 d |%8. 2ff,p>ID,p-> a rrive_ t im e , p >s e rve_time,s t a rt_timc,fin i s h_t i me,round_ t i m e , ri g h t _round t im e );叩=p -> n e xt; )p r intf(" nt I -FCFS 调度算法- I");pr i nt f ("n");)void Sort B y S u p e r (nod e *h e ad) (。n ode * p 1,* q 1, *temp:o t emp=(nod e *)m a 1 loc(s i zeof(nod e );for(p 1 =head->nex t ;pl !=NULL&&pl >st a t e ="r';pl=p 1 ->next)fo r (q 1 = p 1 ->ncxt;ql ! =NULL &&q 1 ->statc=-r'q 1 = q l->ncxt) (。 if (pl->s u pcr<ql-> s u per)oootc m p- > ID =p 1 ->ID;a »pl->ID= q l-> I D;®ql->ID=t e mp->ID;»temp->supe r =pl >super;*pl->su p er=ql > s up e r;q I -> s up e r = t e mp-> s up e r;。 temp->a r rive_tim e =p 1 >arriv e _t i me;o p l->a r r i ve_timc=q 1 ->arr i v e_t i me;叫 1 -> a r r iv e _t i me= t emp->arr i ve_ t ime;»ootemp->serve_tim e =pl > s er v e_time;。 a p 1 ->se r v e_tim e =ql->ser v e_time;*q 1 ->scrvc_timc=tcm p ->s e r vc_t i m e ;temp->state=pl >sta t e;pl->st a te=q 1 -> s tat e ;。q 1 ->st a te=temp-> s ta t e;00 )g I°/*函数功能:运用优先数调度算法参数:指向节点的指针head返回值:空存在问题:*/vo i d priority(node* h e a d )(®int sta r t_ t im e ,f i nis h _t i me=0, r ou n d_ t i m e , a 1 1 _tim e =0;®i n t done= 1 ;»int cloc k =0; afloat ri g h t_ r o u n d _time;