1、实验一 进程调度实验报告广东技术师范学院实验报告学院:计算机科学学院专业:计算机科学与技术(师范)班级:成绩:姓名:学号:组别:组员:实验地点:实验日期:指导教师签名:预习情况操作情况考勤情况数据处理情况实验名称: 实验一、进程调度实验 一、实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解二、实验类别综合性实验。综合高级语言编程、进程调度模型、进程调度算法及数据结构等多方面的知识三、实验内容和步骤 1。编写并调试一个模拟的进程调度程序,采纳“最高优先数优先”调度算法对五个进程进行调度、 “最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高
2、的进程。 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时能够给定一个初始值,同时能够按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少。或者,进程等待的时间超过某一时限时增加其优先数的值,等等该题依照老师给的代码用Viul C+运行,结果以及分析如下:结果分析:依照上述输入的三个进程的信息能够得到:优先级最高的是进程c最先调度进程cc的状态为运行态,需要执行的时间为当前就绪队列状态为:进程a先级比较高,处于就绪队列前面,而进程bb先级是三者中最低的,因此处于就绪队列的最后。而此时这两个进程的状态都为就绪态。结果分析:当进程
3、cc了一个时间片之后而它已占用CP时间已达到所需要的运行时间,则将它的优先级减之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程aa依照这种方式一直运行下去:直到:结果分析:当进程bb的PU占用时间等于它需要的执行时间时,进程bb度完成。则这时进程调度中还有两个进程:进程a进程c结果分析:当调度进程中只剩下进程aa程cc这时依照进程优先级的大小,进程aa入运行态。当进程aa调度时,进程调度程序中直剩下进程cc这时进程cc进入运行态,而当前就绪队列将为空。直到:结果分析:当进程i的CP占用时间等于所需要的执行时间时,进程c调度完成,则这时进程调度中
4、差不多没有需要调度的进程了,则整个进程调度完成、编写并调试一个模拟的进程调度程序,采纳“轮转法调度算法对五个进程进行调度。 轮转法能够是简单轮转法、可变时间片轮转法,或多队列轮转法、 简单轮转法的基本思想是:所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。假如运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕、将老师给的源程序修改成简单的时间片轮转法流程图如下:时间片轮转法icuesio。hnludesb、#icludeconio、hdneec(tpe) (yp)maloc(sief
5、(ype)die NUL 0#define IM 2/时间片长度/typed struct pcb /进程管理块 char nme10;/进程名字 caate; /进程状态 it qeue; /进程所在的队列 int nime; /进程需要运行的时间 int tme; /进程差不多运行的时间 nt etime; /进程在本队列可运行的时间片 truct pb *nk;C;PCB*ready NULL, pinsert NLL, pend = NL,NULL; /*就绪队列,进程插入位置的变量/it gei() /使用户仅能输入整数 char ;in i =; ffush(stdn);ch ge
6、tar(); hle(ch= ) pif(”tf输入不能为空。请重新输入n); fflush(stdi); c= char(); whie(ch != ) if(ch 9|h 0) printf(t输入有误!输入只能为正整数,请重新输入、。n); fflus(stdn); i 0; h= gcar();elei = i10 (ch- );ch =gehar(); retrni;voidfnps()/更新状态量PC *p pfen; if(!ps | !ps link|(s-link-queue- sqee) 1) inert ps;ele whe (slink & ikueue ! (pfen
7、d quee +) pslink; pinsert = ps; o nset()/插入进程i(!redy ) ead = ; pe =p; pinsert = p; ese if(ready quee= 1) /第一队列存在 plink = pfendlink; pfend-link = ; pfend = p; finpo();Els link redy;rady=; findo(); voi inp()/建立进程控制块函数*/ int i,u;prinf(”请输入进程的个数:); num = gti(); for(i=; iame); print(n输入进程运行时间:); p -ntim
8、geti(); prit(n); prime=0;p-state=w; pqueue =1; eti = TIM; p-link=NULL; iset();/调用inert函数*/ oid dis(PCB pr)/建立进程现实函数,用于显示当前进程/prnt(namet staet quuntimet tme在队列可停留时间 n); rnt(”|s”,pname); pintf(”|%”,ste); pif( |%t”,rueue);prinf( |dt”,p-ntime); pinf( |dt”,prtime);prit(%t,retm);rit(”n);vod chc()/建立进程查看函数
9、/ PCB *pr; prin(n *当前正在运行的进程是:s,eadynme);/显示当前运行的进程/ isp(rady); pr=eay -ik; prinf(”n*当前就绪队列状态为:n”);/显示就绪队列状态hile(pr!=NLL) ds(r); pr=prlnk; voi st()/调整进程队列 if(!radylnkready-queureadyinkquee) eturn; p = y -link;ready lnk = pinsert ln; pnser lk = ready; pinsert = edy; reay = p;if (eady & ready -queu =
10、pisrt ue) findpo(); void addnew()/添加新的进程f(ready -qeue != )(eay qeue)+;ad-ete 2; redy - te=w; sort();/调用sort函数/inpu(); ele t(); void destry()/建立进程撤销函数(进程运行结束,撤销进程)/ prntf(n进程%s已完成、n,rady-name);p = ready;ready= ry-lik; free();f (rad & ady - qeu = insert -queue) findps();voruni()建立进程就绪函数(进程运行时间到,置就绪状态)
11、/ (redy-rime)+;radetime-;i(reayrte =eyntie) destro(); retun;se f(ready eme =0)int tme 2; (dy quee)+; for(int i = 2;i!=redyqueue; +i) time *= 2; re-tme = tme;y stte=w; sort();调用sot函数/void min() char c; inu();whl(read !=NLL) ptf(The exeute name:%sn,rady name); ready -te =R; ceck();rig(); pritf(”n按i键添加
12、新进程、。、按其他任意键接着运行、。、”);flush(stdin); ch= gethar(); if(c = | h=)addew(); prf(nn 进程差不多完成n); getchar();运行结果如下:依照题意输入五个进程按任意键接着四、实验问题及原因(1)本次试验,思路设计不难在这个多级反馈的实验中,我采取了用一条实际上的链表队列来模拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还有一个标志位Fnd用来表明新插入的队列的位置。(2)在建立优先数就绪队列时主要运用,链表插入模型、然而由于本题是从建立、到完成一个就绪对列,因此必须分多种情况讨论。五、实验体会和收获(1)本次试验后对优先数调度算法和时间片轮转调度算法实现的过程,有了特别清楚的认识、理解。设计计数器来对进程执行状态的时间分析,使得进程调度这一抽象模型得到具体化。之后,便是对进程的插入(执行完,插入到完成队列,否则插入到就绪)和再次调度(当改进程再次满足条件时,从就绪队列调度到执行队列)重复过程。(2)通过设计PCB结构,模拟进程调度,加深了对进程的理解。(3)提高了C语言编程动手能力