操作系统实验报告--实验一--进程管理.doc
实验一 进程管理一、目得进程调度就是处理机管理得核心内容。本实验要求编写与调试一个简单得进程调度程序。通过本实验加深理解有关进程控制块、进程队列得概念,并体会与了解进程调度算法得具体实施办法。二、实验内容及要求1、设计进程控制块PCB得结构(CB结构通常包括以下信息:进程名(进程I)、进程优先数、轮转时间片、进程所占用得CU时间、进程得状态、当前队列指针等.可根据实验得不同,PC结构得内容可以作适当得增删)。为了便于处理,程序中得某进程运行时间以时间片为单位计算。各进程得轮转时间数以及进程需运行得时间片数得初始值均由用户给定。、系统资源(r),共有类,每类数目为r1rw。随机产生进程Pi(id,(j,),),0=in,0=j<=,0=k<=dt为总运行时间,在运行过程中,会随机申请新得资源.3、每个进程可有三个状态(即就绪状态W、运行状态、等待或阻塞状态),并假设初始状态为就绪状态。建立进程就绪队列.4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CU时间片数加,进程还需要得时间片数减。在调度算法中,采用固定时间片(即:每执行一次进程,该进程得执行时间片数为已执行了个单位),这时,CPU时间片数加1,进程还需要得时间片数减1,并排列到就绪队列得尾上。三、实验环境操作系统环境:Windows系统。编程语言:。四、实验思路与设计、程序流程图对进程进行初始化,建立就绪队列、阻塞队列。Input()触发时钟,调用时间片轮转调度算法。runFcfs()取就绪队列得第一个进程,判断其运行得时间片就是否达到所需次数。如果达到,则释放资源如果没达到,则运行一个时间片。running()输出就绪队列与阻塞队列得信息。outputall()就绪队列为空?检查阻塞队列,对于当前资源数目满足阻塞队列得进程,由阻塞转入就绪队列。testblock()检查就是否有新进程产生,如果有,则判断系统资源就是否够用,如果够用,则分配给该进程,插入就绪队列。如果不够用,则插入阻塞队列。testnew()显示三类资源情况。rescore()结束开始就是否2、主要程序代码/CB结构体truct pcb pulic int id; /进程ID public ita; /所需资源得数量 publc int rb; /所需资源B得数量 publi it rc; /所需资源C得数量 public in ntime; /所需得时间片个数 ublic int rime; /已经运行得时间片个数 publicchar sate; /进程状态,(等待)、R(运行)、B(阻塞) /pli int et; rrList hready= new ryst();ArraLis hbloc e Arraist(); Random rom = new Ranom(); /rrayLst p = new Arrayist();int m,n, r, a,, b,1,c,c1,h = 0, i = 1,time1Intval;/为要模拟得进程个数,n为初始化进程个数 /r为可随机产生得进程数(=m-n) /a,b,分别为A,B,C三类资源得总量 /i为进城计数,i1n /h为运行得时间片次数,tme1Invl为时间片大小(毫秒)/对进程进行初始化,建立就绪数组、阻塞数组.pubc void inut()/对进程进行初始化,建立就绪队列、阻塞队列 m=it、Parse(exBx4、Text); n= in、Parse(texBx5、Text); a = int、are(xtBox6、Tet); b t、Parse(texox、Tet);c=int、se(texBo8、Txt); 1 a; 1 = ; c1 = c; r = n; tme1neval = int、Pse(textBo、Text); me、Intrval me1ta; fo (i = ;i = n; i+) pb icen = new pc(); jinchng、id =i; icheng、ra (random、Nex(a) + 1); jiheng、rb= (rad、Nxt() + 1); iche、rc = (andom、Next(c)+ 1); jincheng、ntime (random、Next(1, )); jincheg、rte ; stBox1、Items、Add(产生进程ID:” + jinceng、d); itBo、Items、Ad("所需A资源数目:" jnheng、); litBox1、Ites、d(”所需B资源数目:” jnchng、); lsBx1、Items、(所需C资源数目:" + ncng、rc); lBox、tems、Add(”所需时间片数:" + jincheng、ntie); f ((a -jincen、r)> 0 (b jncng、r) 0(c- jincheng、c) > 0) a = a- jiheng、ra; =b jinhng、rb; c= incheng、rc; incn、state 'W; hready、Ad(jincen);/加入就绪队列 lse jinceg、state ''; blo、Ad(ichen);/加入阻塞队列 listBx1、Ies、Add(”当前进程状态:” + incheng、sae); /从数组起始地址开始输出该数组得内容publc void dis(ArayLi list) ArayList lit= newArryList(); ist1 = list; (lis1、Cou 0) for (intj0; it1、Count; +) pcb p= (pc)t1; isBox1、Ies、Ad( " p、id、oSting()+ " "+p、state、ToStin() + " ” + p、r、ToString() + "+、b、otring()+ ” p、rc、ToStrg()+” ” p、time、String() " ” 、rtim、oString()+ " rn”); ls isBox1、Itms、(”rn 该队列中没有进程!r"); /输出就绪数组与阻塞数组得信息publi vidutpal() lisox1、tem、Add(”rn=PU运行了:”+ h、Totrng()+ "次=r); lisBox、Iem、Add("*当前就绪队列得信息!*"); lisBox1、Items、Ad(进程ID进程状态A资源数 B资源数 C资源数所需时间片 已运行时间片”); disp(hreay); lisBo、Its、A("*当前就阻塞列得信息!*); ltBox1、Ites、Add(”进程D进程状态 A资源数B资源数C资源 所需时间片 已运行时间片"); dip(hbl); /运行就绪数组得头进程,运行一个时间片,轮转一个时间片,时间片轮转调度算法pulid rnni() Arrayist eady1 =nw Arrist(); hredy = hread; p p1 =new pcb(); 1=(cb)hrady10; p1、sate' p、rte= p、me + ; h=+1; lisBox1、tem、Add(”rn当前正在运行进程D就是:" +p、id + "rn"); lisBo1、Ims、Ad(rn进程ID进程状态 A资源数 资源数 C资源数所需时间片 已运行时间片rn”); lisB1、Items、Ad(p、d +” " p1、stat+ " p1、a+ " " + p1、r+ ” +p、rc+ + p1、ntie + " + p1、rtme); i (p、ntime=1、rte) listBox1、Iems、Add(p、d、ToString()+”得进程已经完成!rn”); a=a + p、ra; b= +1、rb; c + 1、rc; hready、oeAt(0); s 1、stae=W; hready、dd(p1); red、Removet(0); /检测当前资源数目就是否满足阻塞数组里进程得需求publi void tstblck() Arrayt hck=ne Arait(); hblk1 hblo; for (t = 0; hblock1、Cunt;m+) p p1 = new pcb(); p1 = (pcb)hblok; f (a p1、ra = 0) && (b- 1、r >=0) & (c - p、rc >= 0)) p1、tae''; hed、Ad(1); a =a - 1、ra; b = b - p1、b; c - p1、r; listBox、Items、Add(”ID号为:"+p1、d + 得进程由阻塞队列转入就绪队列r"); hbloc、eoveAt(m); m-; /检测就是否有新得进程产生,随机产生新进程ublic voidestnew() int ; if (r>0)/为随机产生得进程数目 t = radom、Next()+ 1; if(t = 7) lstBx1、e、d("n有新得进程申请加入:); pcbjinceng ewcb(); incheng、id = i+; inchen、r (radom、ext(a) + 1); jinhng、rb= (ranm、Next(b)+1); jnheg、c (rndm、Next(c) ); jinchen、nime = (radom、Next(1, 5)); iceng、tm ; istox1、Items、dd(”产生进程I: +jinchng、id); listx1、ems、(所需资源数目:" + jinch、ra); isBox1、Ies、Ad(”所需B资源数目:” +iheng、b); listox1、tms、d(”所需C资源数目:" cng、rc); listBx1、tes、Add(”所需时间片数:" + jincheng、time); f((a- jicheng、ra)> 0 &(b jnchen、rb) = (c -jincn、rc) >= 0) a =a jinchg、a; b = jinheg、rb; c c - incheg、r; incheg、state = ; Box1、Items、d("进程状态为:” +cheg、stae); hreay、Add(jheng);/加入就绪队列 isBox1、Iems、Add(”资源满足新进程请求,该进程进入就绪队列rn); else incheng、sate = ; hblok、Ad(inceng);/加入阻塞队列 lisBox1、Item、Add(进程状态为: + inchn、stae); listBo1、tem、dd(”资源不满足新进程请求,该进程进入阻塞队列r"); r 1; /系统三类资源变化情况得显示ubic voidrescor()/系统三类资源变化情况得显示 f (a a1) textBo1、Txt = a1、ToStri(); if (a 0) etox1、Text ”; i( = 0 &a 1) texB1、et = 、ToStrin(); if (b > b1)textx2、Tex = 1、ToStrin(); i (b 0) textB2、Txt =”"; f (b 0 & = b1) extox、ext b、Ttrig(); i(c > c) extBox、Tet c1、oSrin(); if(c0) textox3、ext = ”0”; if (c 0 & c c1) txtBox3、Text = 、otrg(); /时间片轮转调度算法(先来先服务FCFS算法)ublic vo unFcs() if (hrady、Cut0) otputall(); ing(); tesblok(); esnew(); rescore(); ese tier1、Ealed = flse; extBo、Text = a1、oStrin(); extBo2、t b、oStri(); textBox3、e = c1、oStrig(); litBox1、Iems、d("rn<<<所有进程都已经运行结束!>>>>r”); /计时器触发时间片轮转调度算法piate vi timer1_Tc(objet seder, EventAr e) ncfs();/开始模拟按钮单击执行函数rivat o buton1_Cic(ojectsener, EventArge) ai(); btton1、Eabe = false; texBox、Enabed =ale; xBox2、Enl false; textBox3、Eabled fle; teox4、ble false; textBx、be = flse; texox6、nabled = le; ttBox7、Enabled as; etBox8、Enabld =fale; tetBox9、Enabled= flse; 清除屏幕按钮单击执行函数pivat vd btton2_lic(object sender,vens e) exBox1、Text =; txtBox2、ext= "”; extx3、ext =”; textx4、Txt " ttBox5、Text ”; tetBx6、Txt =”; txtx7、Tex "”; exBx8、et =; tex9、Te = " listox1、Items、lar(); txBox4、Eble = tru; tetBox5、Enable= true; xtBx6、Eabled = tr; textx7、Eabl = tru; texBox8、Enabd te; xBox9、abedrue; buto1、Enabled =true; /运行得主函数pulic oid unman() in();mer1、Enabled = tue;3、运行界面与运行结果界面中,可以任意设定需要模拟得进程总数(如),初始化进程个数(如),还有、B、C三类资源得总数(如1、10、1)。为了方便显示,还可以设定时间片得长度(如500毫秒)。除此之外,在运行过程中,所有得资源都就是随机生成得,并且其中新进程得产生也就是随机得,但就是产生得进程总数不会多于开始设定得模拟得进程总数,以防止不断产生新进程,程序不断运行。在显示窗口得上方,还会实时显示资源得变化情况,方便对运行得观察。当运行结束后,可以通过工具栏中得显示选项中得保存结果按钮,将结果保存成txt文件格式,方便运行后得结果分析。五、心得体会本次实验,我得任务就是设计一个允许n个进程并发运行得进程管理模拟系统。该系统包括有简单得进程控制、同步与通讯机构,系统在运行过程中能显示各进程得状态及有关参数得变化情况,从而观察诸进程得运行过程及系统得管理过程,我就是用C写得,在我得电脑能够运行通过,虽不能尽善尽美,但也基本能实现老师得要求。两个星期得实验,虽然时间有点短,但我也收获不少,这次实验,加深了我对进程概念及进程管理得理解;比较熟悉进程管理中主要数据结构得设计及进程调度算法、进程控制机构、同步机构及通讯机构得实施.也让我认识到自己得不足,操作系统得有些知识,我知道得还不多,没有掌握好,还需要多多学学,不断提升自己得能力。实验中,我们小组分工合作,共同学习,虽然在实验中遇到了一些问题,但在老师与同学得细心指导与热心帮助下解决了。同时,了解到团队精神得重要性,也为以后得学习与工作打下了坚实得基础,同时积累了宝贵得经验。