版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-------------精選文檔------------------------------精選文檔-----------------可編輯可編輯-------------精選文檔-----------------可編輯中南大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名:學(xué)號(hào):班級(jí):
進(jìn)程模擬與主存分配回收實(shí)驗(yàn)內(nèi)容1.設(shè)計(jì)進(jìn)程管理中數(shù)據(jù)結(jié)構(gòu)的內(nèi)容;2.設(shè)計(jì)一個(gè)優(yōu)先權(quán)調(diào)度算法,實(shí)現(xiàn)進(jìn)程調(diào)度;3.設(shè)計(jì)至少兩個(gè)臨界資源的同步管理模擬。4.主存存儲(chǔ)器空間的分配和回收實(shí)驗(yàn)?zāi)康募由顚?duì)進(jìn)程概念及進(jìn)程管理各部分內(nèi)容的理解;熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)和同步機(jī)構(gòu)的實(shí)現(xiàn)過(guò)程。幫助了解在不同的存儲(chǔ)管理方式下,應(yīng)怎樣實(shí)現(xiàn)主存空間的分配和回收實(shí)驗(yàn)要求1.最好采用圖形界面;2.可隨時(shí)增加進(jìn)程;3.規(guī)定道數(shù),設(shè)置后備隊(duì)列和阻塞狀態(tài)。若內(nèi)存中進(jìn)程少于規(guī)定道數(shù),可自動(dòng)從后備隊(duì)4.列中調(diào)度作業(yè)進(jìn)入。被阻塞進(jìn)程入阻塞隊(duì)列,設(shè)置喚醒功能用于將指定阻塞進(jìn)程喚醒進(jìn)入就緒隊(duì)列;5.每次調(diào)度完成,顯示各進(jìn)程狀態(tài);6.設(shè)置至少兩個(gè)臨界資源阻塞隊(duì)列和公共變量,模擬同步過(guò)程;7.設(shè)置時(shí)間片中斷操作;8.自行假設(shè)主存空間大小,預(yù)設(shè)操作系統(tǒng)所占大小并構(gòu)造未分分區(qū)表。9.采用最先適應(yīng)算法分配主存空間10.進(jìn)程完成后,分配主存,并與相鄰空閑分區(qū)合并。具體實(shí)現(xiàn)將實(shí)驗(yàn)一與實(shí)驗(yàn)二結(jié)合在一起。所以整合成了一分實(shí)驗(yàn)報(bào)告。在這里統(tǒng)一給出自己實(shí)現(xiàn)的思想。流程圖2.關(guān)鍵代碼:利用冒泡法實(shí)現(xiàn)優(yōu)先級(jí)的排序//優(yōu)先級(jí)的排序 publicvoidsort(ArrayList<PCB>arraylist){ for(inti=0;i<arraylist.size();i++){ for(intj=i+1;j<arraylist.size();j++){ if(arraylist.get(i).getPriority()<arraylist.get(j).getPriority()){ //根據(jù)冒泡法來(lái)優(yōu)先級(jí)排序 PCBtemp=arraylist.get(i); arraylist.set(i,arraylist.get(j)); arraylist.set(j,temp); } } } }自動(dòng)從后備隊(duì)列中往就緒隊(duì)列中增加進(jìn)程//若內(nèi)存中進(jìn)程少于規(guī)定道數(shù),可從后備隊(duì)列中調(diào)度作業(yè)進(jìn)入 publicvoidcheckPCB(ArrayList<PCB>ready,ArrayList<PCB>pool){ while(ready.size()<4&&pool.size()>0){ ready.add(pool.get(0)); System.out.println("從后備隊(duì)列往就緒隊(duì)列中加入進(jìn)程"); pool.get(0).getAll(); pool.remove(0); } }內(nèi)存不夠時(shí),移入外存隊(duì)列publicvoidmove(PCBPCB,ArrayListexternStore,ArrayListPCBready){ if(PCB.isGetStore()==false){ externStore.add(PCB); PCBready.remove(PCB); } }實(shí)驗(yàn)總結(jié)1.通過(guò)此次實(shí)驗(yàn),對(duì)于操作系統(tǒng)的模擬有了更深的理解。進(jìn)程的調(diào)度,在開(kāi)始做第一個(gè)實(shí)驗(yàn)時(shí),由于設(shè)計(jì)上的漏洞,導(dǎo)致臨界資源一直被占用,結(jié)果造成了死鎖。在實(shí)踐中,更加理解了死鎖的涵義。同時(shí),也提醒著自己要不斷的總結(jié),注意數(shù)據(jù)結(jié)構(gòu)方面的設(shè)計(jì)問(wèn)題。2.對(duì)于實(shí)驗(yàn)內(nèi)容的理解,我在這方面產(chǎn)生了點(diǎn)困難。剛開(kāi)始,不知道如何來(lái)模擬臨界資源。在請(qǐng)教了老師之后,慢慢開(kāi)始摸索。3.,接觸到第二個(gè)實(shí)驗(yàn),對(duì)于主存空間的模擬又產(chǎn)生了困難。不知道該用什么來(lái)模擬。最終采用了投機(jī)取巧的方式。用了ArrayList.這樣,就不用擔(dān)心主存的回收問(wèn)題了。但是這樣,不太符合實(shí)際情況。源代碼packageos_check_1;importjava.util.ArrayList;importjava.util.Scanner;publicclassCPU{ staticbooleansource=false; staticArrayList<PCB>PCBready=newArrayList<PCB>();//這里才是真正的就緒隊(duì)列 staticArrayList<PCB>poolQueue=newArrayList<PCB>();//后備隊(duì)列 staticArrayList<PCB>blockQueue=newArrayList<PCB>();//阻塞隊(duì)列 staticArrayList<PCB>endQueue=newArrayList<PCB>();//結(jié)束隊(duì)列 staticArrayList<PCB>externStore=newArrayList<PCB>();//放入外存的隊(duì)列 PCBinitpi=newPCBinit(); Scannersc=newScanner(System.in); MainStorems=newMainStore(); CPU(){ this.PCBready=pi.PCBready; this.poolQueue=pi.poolQueue; while(time()>0){ fun(); } } //模擬進(jìn)程的調(diào)度 publicvoidfun(){ CPUuse(PCBready); CheckEnd(PCBready); CheckBlock(); OutPut(); ms.show(); pi.checkPCB(PCBready,poolQueue); pi.sort(PCBready);//對(duì)可能發(fā)生的就緒隊(duì)列進(jìn)行優(yōu)先級(jí)排序 System.out.println("***********longxiao************"); } //剩余運(yùn)行的時(shí)間 publicinttime(){ inttime=0; for(inti=0;i<PCBready.size();i++){//改變時(shí)間。 time=time+PCBready.get(i).getTime(); } returntime; } //從就緒隊(duì)列中調(diào)入優(yōu)先級(jí)最高的運(yùn)行。 publicvoidCPUuse(ArrayList<PCB>ready){ if(ready.size()>0){ ready.get(0).setState(1);//將狀態(tài)設(shè)置為運(yùn)行狀態(tài) ms.GetEmpty(ready.get(0)); if(ready.get(0).isGetStore()==true){ if(ready.get(0).getSource()==true){//當(dāng)需要使用臨界資源時(shí) if(source==false||ready.get(0).getUseSource()==true){//臨界資源沒(méi)有被使用 run1(ready); System.out.println("進(jìn)程"+ready.get(0).getPID()+"執(zhí)行"); }else{ blockQueue.add(ready.get(0));//將其加入阻塞隊(duì)列 ready.remove(0);//將其從就緒隊(duì)列中移除 } }else{//不需要使用臨界資源的進(jìn)程 run2(ready);//開(kāi)始執(zhí)行 System.out.println("進(jìn)程"+ready.get(0).getPID()+"執(zhí)行"); } } else{//移入外存 ms.move(ready.get(0),externStore,PCBready); } } } //設(shè)置時(shí)間片為3,開(kāi)始運(yùn)行。如果在運(yùn)行過(guò)程中,時(shí)間一直不為0.則會(huì)占用臨界資源 publicvoidrun1(ArrayList<PCB>ready){ for(intx=0;x<=2;x++){//設(shè)置時(shí)間片為3 ready.get(0).run();//開(kāi)始執(zhí)行 if(ready.get(0).getTime()==0){ break; }else{ source=true;//從此,臨界資源被使用 ready.get(0).setUseSource(true); } } if(ready.get(0).getUseSource()==true){ System.out.println("臨界資源被"+ready.get(0).getPID()+"占用"); } } //不需要臨界資源的進(jìn)程的運(yùn)行 publicvoidrun2(ArrayList<PCB>ready){ for(intx=0;x<=2;x++){//設(shè)置時(shí)間片為3 ready.get(0).run();//開(kāi)始執(zhí)行 if(ready.get(0).getTime()==0){ break; } } } //是否應(yīng)進(jìn)入結(jié)束隊(duì)列,從就緒隊(duì)列中移除 publicvoidCheckEnd(ArrayList<PCB>ready){ for(inti=0;i<ready.size();i++){ if(ready.get(i).getTime()==0){ ms.release(ready.get(i));//釋放所正在使用的內(nèi)存 ms.check(externStore,PCBready); System.out.println("test:checkEnd"); endQueue.add(ready.get(i)); if(ready.get(i).getUseSource()==true){//如果正在使用臨界資源 System.out.println("進(jìn)程"+ready.get(i).getPID()+"釋放臨界資源"); source=false;//釋放臨界資源 } ready.remove(i); } } } //判斷阻塞隊(duì)列中是否能夠進(jìn)入就緒隊(duì)列 //前提是占用臨界資源的那個(gè)進(jìn)程已經(jīng)結(jié)束 publicvoidCheckBlock(){ pi.sort(blockQueue);//對(duì)阻塞隊(duì)列中的進(jìn)程進(jìn)行優(yōu)先級(jí)排序 if(source==false&&blockQueue.size()>0){ System.out.println("test:checkblock"); //當(dāng)臨界資源出現(xiàn)空閑時(shí),可以從阻塞隊(duì)列中移除,進(jìn)入就緒隊(duì)列。 PCBready.add(blockQueue.get(0)); blockQueue.remove(0); } } publicvoidOutPut(){ System.out.println("就緒隊(duì)列中有:"+PCBready.size()); for(inti=0;i<PCBready.size();i++){ PCBready.get(i).getAll(); } System.out.println("阻塞隊(duì)列中有:"+blockQueue.size()); for(inti=0;i<blockQueue.size();i++){ blockQueue.get(i).getAll(); } System.out.println("完成隊(duì)列中有:"+endQueue.size()); for(inti=0;i<endQueue.size();i++){ endQueue.get(i).getAll(); } if(blockQueue.size()!=0){ System.out.println("是否需要從阻塞隊(duì)列中喚醒進(jìn)程(1.YES/ELSE.NO)"); intchoose=sc.nextInt(); if(choose==1){ wakeUp(); } } System.out.println("是否需要增加進(jìn)程(1.YES/ELSE.NO)");//加入的進(jìn)程先放入后備隊(duì)列。然后由后備隊(duì)列自動(dòng)的添加到就緒隊(duì)列中 intchoose=sc.nextInt(); if(choose==1){ pi.PCBadd(poolQueue); } } publicvoidwakeUp(){ System.out.println("請(qǐng)輸入需要喚醒進(jìn)程的ID號(hào)"); intid=sc.nextInt(); for(inti=0;i<blockQueue.size();i++){ if(blockQueue.get(i).getPID()==id){ for(intj=0;j<PCBready.size();j++){ if(PCBready.get(j).getUseSource()==true){ PCBready.get(j).setUseSource(false);//解除j進(jìn)程對(duì)臨界資源占用。以便讓i進(jìn)程進(jìn)入就緒隊(duì)列 } } PCBready.add(blockQueue.get(i)); blockQueue.remove(i); } } } }packageos_check_1;importjava.util.ArrayList;publicclassMainStore{ staticArrayList<Integer>mainStore=newArrayList<Integer>(); MainStore(){ for(inti=0;i<10;i++){//設(shè)置主存大小為10.利用mainStore的大小表示主存。 mainStore.add(0);//構(gòu)造未分分區(qū)表。即設(shè)置所有的值為0。值為1代表該內(nèi)存被占用。 } } //得到某一塊空閑分區(qū)的大小,并且占用。將其置1 publicvoidGetEmpty(PCBPCB){ intfirst=0; intlast=0; for(inti=0;i<mainStore.size();i++){ last++; if(mainStore.get(i)==1||i==mainStore.size()-1){ if(last-first>=PCB.getSize()){ PCB.setFirstIndex(first); System.out.println("進(jìn)程"+PCB.getPID()+"進(jìn)入主存"); PCB.setGetStore(true); }else{ first=i; } } } if(PCB.isGetStore()==true){ inta=PCB.getFirstIndex(); intb=PCB.getSize(); for(;a<b;a++){ mainStore.set(a,1);//將被使用的主存置1 } } if(PCB.isGetStore()==false){ System.out.println("內(nèi)存不足"+PCB.getPID()+"進(jìn)程將被移入外存"); }} //釋放空閑分區(qū) publicvoidrelease(PCBPCB){ inta=PCB.getFirstIndex(); intb=PCB.getSize(); for(;a<b;a++){ mainStore.set(a,0); } System.out.println("進(jìn)程"+PCB.getPID()+"釋放內(nèi)存"+PCB.getSize()); } //內(nèi)存不夠時(shí),移入外存。進(jìn)入外存隊(duì)列 publicvoidmove(PCBPCB,ArrayListexternStore,ArrayListPCBready){ if(PCB.isGetStore()==false){ externStore.add(PCB); PCBready.remove(PCB); } } //內(nèi)存何時(shí)夠用 publicvoidcheck(ArrayList<PCB>externStore,ArrayList<PCB>PCBready){ for(inti=0;i<externStore.size();i++){ GetEmpty(externStore.get(i));//檢查是否能夠得到內(nèi)存 if(externStore.get(i).isGetStore()==true){//得到內(nèi)存時(shí) PCBready.add(externStore.get(i));//將其再次加入就緒隊(duì)列 System.out.println("進(jìn)程"+PCBready.get(i).getPID()+"從外存進(jìn)入內(nèi)存"); } } } publicvoidshow(){ System.out.println("主存使用情況為:"); for(inti=0;i<mainStore.size();i++){ System.out.print(mainStore.get(i)); } System.out.println(); }}packageos_check_1;publicclassPCB{ privateintPID;//ID號(hào) privateinttime;//一共所需的運(yùn)行時(shí)間 privateintpriority;//優(yōu)先級(jí) privateintstate=0;//狀態(tài) //0-就緒1-執(zhí)行 privatebooleansource=false;//占用的臨界資源 privatebooleanuseSource=false; //主存空間的分配和回收部分 privateintSize; privateintfirstIndex; privatebooleangetStore=false; publicbooleanisGetStore(){ returngetStore; } publicvoidsetGetStore(booleangetStore){ this.getStore=getStore; } publicintgetSize(){ returnSize; } publicvoidsetSize(intsize){ Size=size; } publicintgetFirstIndex(){ returnfirstIndex; } publicvoidsetFirstIndex(intfirstIndex){ this.firstIndex=firstIndex; } publicintgetPID(){ returnPID; } publicvoidsetPID(intpID){ PID=pID; } publicintgetTime(){ returntime; } publicvoidsetTime(inttime){ this.time=time; } publicintgetPriority(){ returnpriority; } publicvoidsetPriority(intpriority){ this.priority=priority; } publicintgetState(){ returnstate; } publicvoidsetState(intstate){ this.state=state; } publicbooleangetSource(){ returnsource; } publicvoidsetSource(booleansource){ this.source=source; } publicbooleangetUseSource(){ returnuseSource; } publicvoidsetUseSource(booleanuseSource){ this.useSource=useSource; } publicvoidrun(){ if(priority>0){ this.priority--; } if(time>0){ this.time=time-1; } //System.out.println(PID+":執(zhí)行"); } publicvoidgetAll(){ System.out.println("PID:"+PID+"-"+time+"-"+priority+"-"+source); } }packageos_check_1;importjava.util.ArrayList;importjava.util.Scanner;publicclassPCBinit{ staticArrayList<PCB>PCBready=newArrayList<PCB>(); staticArrayList<PCB>poolQueue=newArrayList<PCB>(); Scannersc=newScanner(System.in); //初始化 PCBinit(){ System.out.println("請(qǐng)輸入進(jìn)程的數(shù)目"); intPCBnum=sc.nextInt(); for(inti=0;i<PCBnum;i++){ PCBadd(PCBready);//在PCB隊(duì)列中增加進(jìn)程 } poolQueue();//初始化后備隊(duì)列 checkPCB(PCBready,poolQueue); sort(PCBready); } //后備隊(duì)列初始化 publicvoidpoolQueue(){ System.out.println("請(qǐng)輸入后備隊(duì)列的數(shù)目"); intpoolnum=sc.nextInt(); for(inti=0;i<poolnum;i++){ PCBadd(poolQueue); } } //若內(nèi)存中進(jìn)程少于規(guī)定道數(shù),可從后備隊(duì)列中調(diào)度作業(yè)進(jìn)入 publicvoidcheckPCB(ArrayList<PCB>ready,ArrayList<PCB>pool){ while(ready.size()<4&&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育創(chuàng)新實(shí)訓(xùn)室安全教育與校園活動(dòng)結(jié)合的實(shí)踐
- 數(shù)學(xué)游戲在課堂教學(xué)中的應(yīng)用與建議
- 2025至2031年中國(guó)個(gè)人型碎紙機(jī)行業(yè)投資前景及策略咨詢研究報(bào)告
- 娛樂(lè)場(chǎng)所裝修油漆施工合同
- 2025至2030年中國(guó)歐洲式自閉型抽屜滑軌數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 戶外廣告居間合作批文
- 2025至2030年中國(guó)葉輪給料機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 農(nóng)業(yè)科技融資居間合同范例
- 2025至2030年中國(guó)半鋁半塑包裝袋數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年中國(guó)MTR專業(yè)總線報(bào)警接收機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(kù)(全真題庫(kù))
- 護(hù)理安全用氧培訓(xùn)課件
- 《三國(guó)演義》中人物性格探析研究性課題報(bào)告
- 注冊(cè)電氣工程師公共基礎(chǔ)高數(shù)輔導(dǎo)課件
- 土方勞務(wù)分包合同中鐵十一局
- 乳腺導(dǎo)管原位癌
- 冷庫(kù)管道應(yīng)急預(yù)案
- 司法考試必背大全(涵蓋所有法律考點(diǎn))
- 公共部分裝修工程 施工組織設(shè)計(jì)
- 《學(xué)習(xí)教育重要論述》考試復(fù)習(xí)題庫(kù)(共250余題)
- 裝飾裝修施工及擔(dān)保合同
評(píng)論
0/150
提交評(píng)論