1、进程调度模拟算法课程名称:计算机操作系统 班级:信501-2实验者姓名:李琛 实验日期:21年5月日评分: 教师签名:一、实验目得进程调度就是处理机管理得核心内容。本实验要求用高级语言编写模拟进程调度程序,以 便加深理解有关进程控制快、进程队列等概念,并体会与了解优先数算法与时间片轮转算法得具体实施办法。二、实验要求1、设计进程控制块CB 得结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用得 CPU时间、进程到完成还需要得时间、进程得状态、当前队列指针等。2、编写两种调度算法程序:优先数调度算法程序循环轮转调度算法程序3、按要求输出结果。三、实验过程分别用两种调度算法
2、对伍个进程进行调度。每个进程可有三种状态;执行状态()、就绪状态(REAY,包括等待状态)与完成状态(NIH),并假定初始状态为就绪状态。 (一)进程控制块结构如下: NAME进程标示符 PIOUND进程优先数/进程每次轮转得时间片数(设为常数 2)PTIE进程累计占用 CPU得时间片数 NEEDIE进程到完成还需要得时间片数 STTE进程状态 NXT链指针 注: 1、为了便于处理,程序中进程得得运行时间以时间片为单位进行计算;2、各进程得优先数或轮转时间片数,以及进程运行时间片数得初值,均由用户在程序运行时给定。(二)进程得就绪态与等待态均为链表结构,共有四个指针如下:RUN当前运行进程指针
3、 READY就需队列头指针AIL 就需队列尾指针 FIISH 完成队列头指针(三)程序说明 、 在优先数算法中,进程优先数得初值设为:0-EETME每执行一次,优先数减 ,CPU 时间片数加 1,进程还需要得时间片数减 1。在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,PU时间片数加 2,进程还需要得时间片数减 2,并退出 CP,排到就绪队列尾,等待下一次调度。 、 程序得模块结构如下:整个程序可由主程序与如下 7 个过程组成: (1)INSER1在优先数算法中,将尚未完成得 C 按优先数顺序插入到就绪队列中;()ISET2在轮转法中,将执行了一个时间片单位(为2),
4、但尚未完成得进程得 B,插到就绪队列得队尾; (3)FIR调度就绪队列得第一个进程投入运行; ()RINT显示每执行一次后所有进程得状态及有关信息。(5)CREATE创建新进程,并将它得 C插入就绪队列;(6)ISCH按优先数算法调度进程; (7)RNDCH按时间片轮转法调度进程。 主程序定义 PCB 结构与其她有关变量。实验代码:Mai、piludencludeusing naepcest;typedef trdecha ae20; /进程名it prio; /进程优先级in rond; /分配CPU得时间片incpuim; /CPU执行时间in nedim; /进程执行所需时间char s
5、tate; 进程状态int count; /记录执行次数srctnoe *nex; /链表指针PCB;int n;/定义三个队列,就绪队列,执行队列,完成队列CB rad= NUL; /就绪队列PB *rn =NULL; /执行队列CB*inish = NULL; /完成队列/取得第一个就绪节点void GetFirs()ru = ready;if (ready !NULL)run-se = R;y = adnet;rnnet NUL;/优先级输出队列oid Otput1()PC *p; = rady;while ( != NLL)ut nm tp-pio t cpti tp-nedtie t
6、 p-state t count ed; t; = finih;while(p! NU)cout nam t pio t cputme ntime t state t cnt next;p = run;wile (p != NL)outame t p-pr tp-cuimt p-edtimestae t p-con endl;p -next;/轮转法输出队列voi Outpt2()CB*p;p = redy;while( != L)cout name round t cputim tneedim t tte t nm t ound pcpte tetme ttet count next;p =
7、ru;wile (p != NUL)ot nae pund p-cpuime p-nedtim t state cunprio = f-pro) /比第一个还要大,则插入到队头n-net= read;rady = in;elewhle (ft-next ! NL) /移动指针查找第一个比它小得元素得位置进行插入 t ft;st= fst-next;if(s-xt UL) /已经搜索到队尾,则其优先级数最小,将其插入到队尾即可n-net fst-ex;fstnt = in;ele /插入到队列中nxt = in;-ext = fs;/将进程插入到就绪队列尾部o nsrtTie(PCB in)PC
8、B *t;fs =ready;i(eady =NULL)in-next = ray;edy i;lewhile (fstnex != NULL)ft= fst-next;inext -next;fst-n =n;/将进程插入到完成队列尾部vd InsetFiih(CB n)PCB *fs;s fsh;if (fish= NU)innext = finish;finih = i;elsewhile (fst-nx!= NULL)fst = fst-nxt;n-nxt = ft-ne;t-next = in;/优先级调度输入函数 voidPrioCrat()PCB t;int ;cot ntert
9、 am n needi: end;fo (i=0; i num;i+)i (tm= (PCB *)aloc(sieof(PB))=NULL)ce allc tm-nm;etcha();cintm-nedime;tmpcpuime= 0;ptate = ;tmprio =5 -tmnedme; /设置其优先级,需要得时间越多,优先级越低mp-round= 0;p-cout = ;InsertPro(tmp); /按照优先级从高到低,插入到就绪队列 c 进程名t优先级tcpu时间需要时间 进程状态 计数器 edl;/时间片输入函数 void Timerate()Ctmp;inti;co 输入进程名
10、字与进程时间片所需时间: endl;fr(i = 0;i num;+)f ((tm =(PCB )malloc(sizeof(PCB) = NU)crr malloc tm-nm;etr();in m-neetme;tmp-cputie = 0;tmptate = W;tmp-pio=0;mp-round;tp-ou = 0;nsertime(tmp);cout 进程名t轮数tCPU时间t需要时间 进程状态 计数器 prio-= 3; /优先级减去三run-cputime+; /CPU时间片加一 ru-netime;/进程执行完成得剩余时间减一if (run-needtie = 0)如果进程执
11、行完毕,将进程状态置为F,将其插入到完成队列run-stte = ;uncount+;Iserinih(u);la =0;else /将进程状态置为W,入就绪队列un-stte=W;-coun+; /进程执行得次数加一nsrtTime(n);flg =0;fa = 1;GetFrs(); /继续取就绪队列队头进程进入执行队列 vid RoundRu() /时间片轮转调度算法int fg= 1;GetFrst();hile (rn != UL)utut();wile (flag)ru-count+;rncputime+;run-eedtime-;i (ru-neetim =0) /进程执行完毕
12、rnsate ;ItFinish(run);flag= ;ese if(r-cout = ru-rond)/时间片用完 ru-t W;run-count= 0; /计数器清零,为下次做准备nsTime(run);fag = 0;la 1;tFirst();nt ain(voi)intn;out 输入进程个数: nm;thar();cut -进程调度算法模拟- ndl;ou 1、优先级调度算法 nl;cou 2、循环轮转调度算法 d;cut - edl;out 输入选择序号:n;swih (n)as 1:cut 优先级调度: endl;roCreate();iity();Otput();brea
13、k;case 2:cout 循环轮转算法: end;TieCeae();RoundR();Otut2();rk;ase 0:xit(1);break;efault:cout Ener error! ndl;beak;cout ndl;eturn 0;四、实验结果优先级调度时间片轮转法五、实验总结通过本次实验,我学到了进程调度算法,了解了进程调度就是CPU管理得核心,不同得调度算法会使得进程运行时间不同,运行得先后顺序也不同,这就会有一个算法选择得问题、掌握了用C语言实现进程调度算法得模拟,提高了编程能力,以及对进程调度算法得理解。在思考上出现得一个问题就是,队列就是先进先出得,在优先级算法中怎么来向链表中插入新得进程,使其能够按优先级排序、第一想到得就是用数组,后来发现不如链表方便,所以换成链表,但就是发现自己用链表有待提高、