




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
中南大學操作系統(tǒng)實驗報告姓名:學號:班級:
進程模擬與主存分配回收實驗內(nèi)容1.設計進程管理中數(shù)據(jù)結(jié)構(gòu)的內(nèi)容;2.設計一個優(yōu)先權(quán)調(diào)度算法,實現(xiàn)進程調(diào)度;3.設計至少兩個臨界資源的同步管理模擬。4.主存存儲器空間的分配和回收實驗目的加深對進程概念及進程管理各部分內(nèi)容的理解;熟悉進程管理中主要數(shù)據(jù)結(jié)構(gòu)的設計及進程調(diào)度算法、進程控制機構(gòu)和同步機構(gòu)的實現(xiàn)過程。幫助了解在不同的存儲管理方式下,應怎樣實現(xiàn)主存空間的分配和回收實驗要求1.最好采用圖形界面;2.可隨時增加進程;3.規(guī)定道數(shù),設置后備隊列和阻塞狀態(tài)。若內(nèi)存中進程少于規(guī)定道數(shù),可自動從后備隊4.列中調(diào)度作業(yè)進入。被阻塞進程入阻塞隊列,設置喚醒功能用于將指定阻塞進程喚醒進入就緒隊列;5.每次調(diào)度完成,顯示各進程狀態(tài);6.設置至少兩個臨界資源阻塞隊列和公共變量,模擬同步過程;7.設置時間片中斷操作;8.自行假設主存空間大小,預設操作系統(tǒng)所占大小并構(gòu)造未分分區(qū)表。9.采用最先適應算法分配主存空間10.進程完成后,分配主存,并與相鄰空閑分區(qū)合并。具體實現(xiàn)將實驗一與實驗二結(jié)合在一起。所以整合成了一分實驗報告。在這里統(tǒng)一給出自己實現(xiàn)的思想。流程圖2.關(guān)鍵代碼:利用冒泡法實現(xiàn)優(yōu)先級的排序//優(yōu)先級的排序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ù)冒泡法來優(yōu)先級排序PCBtemp=arraylist.get(i);arraylist.set(i,arraylist.get(j));arraylist.set(j,temp);}}}}自動從后備隊列中往就緒隊列中增加進程//若內(nèi)存中進程少于規(guī)定道數(shù),可從后備隊列中調(diào)度作業(yè)進入publicvoidcheckPCB(ArrayList<PCB>ready,ArrayList<PCB>pool){while(ready.size()<4&&pool.size()>0){ready.add(pool.get(0));System.out.println("從后備隊列往就緒隊列中加入進程");pool.get(0).getAll();pool.remove(0); }}內(nèi)存不夠時,移入外存隊列publicvoidmove(PCBPCB,ArrayListexternStore,ArrayListPCBready){if(PCB.isGetStore()==false){externStore.add(PCB);PCBready.remove(PCB);}}實驗總結(jié)1.通過此次實驗,對于操作系統(tǒng)的模擬有了更深的理解。進程的調(diào)度,在開始做第一個實驗時,由于設計上的漏洞,導致臨界資源一直被占用,結(jié)果造成了死鎖。在實踐中,更加理解了死鎖的涵義。同時,也提醒著自己要不斷的總結(jié),注意數(shù)據(jù)結(jié)構(gòu)方面的設計問題。2.對于實驗內(nèi)容的理解,我在這方面產(chǎn)生了點困難。剛開始,不知道如何來模擬臨界資源。在請教了老師之后,慢慢開始摸索。3.,接觸到第二個實驗,對于主存空間的模擬又產(chǎn)生了困難。不知道該用什么來模擬。最終采用了投機取巧的方式。用了ArrayList.這樣,就不用擔心主存的回收問題了。但是這樣,不太符合實際情況。源代碼packageos_check_1;importjava.util.ArrayList;importjava.util.Scanner;publicclassCPU{staticbooleansource=false;staticArrayList<PCB>PCBready=newArrayList<PCB>();//這里才是真正的就緒隊列staticArrayList<PCB>poolQueue=newArrayList<PCB>();//后備隊列staticArrayList<PCB>blockQueue=newArrayList<PCB>();//阻塞隊列staticArrayList<PCB>endQueue=newArrayList<PCB>();//結(jié)束隊列staticArrayList<PCB>externStore=newArrayList<PCB>();//放入外存的隊列PCBinitpi=newPCBinit();Scannersc=newScanner(System.in);MainStorems=newMainStore();CPU(){ this.PCBready=pi.PCBready;this.poolQueue=pi.poolQueue; while(time()>0){fun();}}//模擬進程的調(diào)度publicvoidfun(){ CPUuse(PCBready);CheckEnd(PCBready);CheckBlock();OutPut();ms.show();pi.checkPCB(PCBready,poolQueue);pi.sort(PCBready);//對可能發(fā)生的就緒隊列進行優(yōu)先級排序 System.out.println("***********longxiao************");}//剩余運行的時間publicinttime(){inttime=0;for(inti=0;i<PCBready.size();i++){//改變時間。time=time+PCBready.get(i).getTime();}returntime;}//從就緒隊列中調(diào)入優(yōu)先級最高的運行。publicvoidCPUuse(ArrayList<PCB>ready){if(ready.size()>0){ready.get(0).setState(1);//將狀態(tài)設置為運行狀態(tài)ms.GetEmpty(ready.get(0));if(ready.get(0).isGetStore()==true){if(ready.get(0).getSource()==true){//當需要使用臨界資源時if(source==false||ready.get(0).getUseSource()==true){//臨界資源沒有被使用 run1(ready); System.out.println("進程"+ready.get(0).getPID()+"執(zhí)行");}else{ blockQueue.add(ready.get(0));//將其加入阻塞隊列ready.remove(0);//將其從就緒隊列中移除}}else{//不需要使用臨界資源的進程run2(ready);//開始執(zhí)行System.out.println("進程"+ready.get(0).getPID()+"執(zhí)行");}}else{//移入外存ms.move(ready.get(0),externStore,PCBready);}} }//設置時間片為3,開始運行。如果在運行過程中,時間一直不為0.則會占用臨界資源publicvoidrun1(ArrayList<PCB>ready){for(intx=0;x<=2;x++){//設置時間片為3ready.get(0).run();//開始執(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()+"占用");}}//不需要臨界資源的進程的運行publicvoidrun2(ArrayList<PCB>ready){for(intx=0;x<=2;x++){//設置時間片為3ready.get(0).run();//開始執(zhí)行if(ready.get(0).getTime()==0){break;}}}//是否應進入結(jié)束隊列,從就緒隊列中移除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("進程"+ready.get(i).getPID()+"釋放臨界資源");source=false;//釋放臨界資源}ready.remove(i);}}}//判斷阻塞隊列中是否能夠進入就緒隊列//前提是占用臨界資源的那個進程已經(jīng)結(jié)束publicvoidCheckBlock(){pi.sort(blockQueue);//對阻塞隊列中的進程進行優(yōu)先級排序if(source==false&&blockQueue.size()>0){System.out.println("test:checkblock");//當臨界資源出現(xiàn)空閑時,可以從阻塞隊列中移除,進入就緒隊列。PCBready.add(blockQueue.get(0));blockQueue.remove(0);}}publicvoidOutPut(){System.out.println("就緒隊列中有:"+PCBready.size());for(inti=0;i<PCBready.size();i++){PCBready.get(i).getAll();}System.out.println("阻塞隊列中有:"+blockQueue.size());for(inti=0;i<blockQueue.size();i++){blockQueue.get(i).getAll();}System.out.println("完成隊列中有:"+endQueue.size());for(inti=0;i<endQueue.size();i++){endQueue.get(i).getAll();}if(blockQueue.size()!=0){System.out.println("是否需要從阻塞隊列中喚醒進程(1.YES/ELSE.NO)");intchoose=sc.nextInt();if(choose==1){wakeUp();}}System.out.println("是否需要增加進程(1.YES/ELSE.NO)");//加入的進程先放入后備隊列。然后由后備隊列自動的添加到就緒隊列中intchoose=sc.nextInt();if(choose==1){pi.PCBadd(poolQueue);}}publicvoidwakeUp(){System.out.println("請輸入需要喚醒進程的ID號");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進程對臨界資源占用。以便讓i進程進入就緒隊列}}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++){//設置主存大小為10.利用mainStore的大小表示主存。mainStore.add(0);//構(gòu)造未分分區(qū)表。即設置所有的值為0。值為1代表該內(nèi)存被占用。}}//得到某一塊空閑分區(qū)的大小,并且占用。將其置1publicvoidGetEmpty(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("進程"+PCB.getPID()+"進入主存");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()+"進程將被移入外存");}}//釋放空閑分區(qū)publicvoidrelease(PCBPCB){inta=PCB.getFirstIndex();intb=PCB.getSize();for(;a<b;a++){mainStore.set(a,0);}System.out.println("進程"+PCB.getPID()+"釋放內(nèi)存"+PCB.getSize());}//內(nèi)存不夠時,移入外存。進入外存隊列publicvoidmove(PCBPCB,ArrayListexternStore,ArrayListPCBready){if(PCB.isGetStore()==false){externStore.add(PCB);PCBready.remove(PCB);}}//內(nèi)存何時夠用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)存時PCBready.add(externStore.get(i));//將其再次加入就緒隊列System.out.println("進程"+PCBready.get(i).getPID()+"從外存進入內(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號privateinttime;//一共所需的運行時間privateintpriority;//優(yōu)先級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("請輸入進程的數(shù)目");intPCBnum=sc.nextInt();for(inti=0;i<PCBnum;i++){PCBadd(PCBready);//在PCB隊列中增加進程}poolQueue();//初始化后備隊列 checkPCB(PCBready,poolQueue);sort(PCBready);}//后備隊列初始化publicvoidpoolQueue(){ System.out.println("請輸入后備隊列的數(shù)目");intpoolnum=sc.nextInt();for(inti=0;i<poolnum;i++){PCBadd(poolQueue);}}//若內(nèi)存中進程少于規(guī)定道數(shù),可從后備隊列中調(diào)度作業(yè)進入publicvoidcheckPCB(ArrayList<PCB>ready,ArrayList<PCB>pool){while(ready.size(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 付款分期合同范本
- 制造師證書掛靠合同范本
- 《童年的秘密》讀書心得體會
- 司機 勞動合同范本
- 縣城兩層樓房出售合同范本
- 《有趣的表情》教案
- 廠區(qū)設備轉(zhuǎn)讓合同范例
- 出租辦公室合同范本
- 廚柜翻新服務合同范例
- 廠房倒塌合同范本
- 中建建筑工程竣工驗收指南
- 2020年同等學力申碩《計算機科學與技術(shù)學科綜合水平考試》歷年真題及答案
- 電廠應急救援培訓
- 智慧能源島解決方案
- 做最好的教師讀書分享
- 眼底疾病課件教學課件
- 二元一次方程組應用題(50題)
- 出生證警示教育培訓
- KYC高客營銷培訓
- 通信工程建設標準強制性條文匯編(2023版)-定額質(zhì)監(jiān)中心
- 《現(xiàn)代家政導論》電子教案 4.2模塊四項目二家政教育發(fā)展認知
評論
0/150
提交評論