版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
./__0120910340228課程設(shè)計題目模擬設(shè)計頁式存儲管理的分配與回收學(xué)院計算機(jī)科學(xué)與技術(shù)專業(yè)計算機(jī)科學(xué)與技術(shù)班級XX姓名XX指導(dǎo)教師XXX2011年01月09日課程設(shè)計任務(wù)書學(xué)生__XX專業(yè)__計算機(jī)0902班指導(dǎo)XXX工作單位:計算機(jī)科學(xué)與技術(shù)學(xué)院題目:模擬設(shè)計頁式存儲管理的分配與回收初始條件:1.預(yù)備內(nèi)容:閱讀操作系統(tǒng)的內(nèi)存管理章節(jié)內(nèi)容,了解有關(guān)虛擬存儲器、頁式存儲管理等概念,并體會頁式管理內(nèi)存的分配和回收過程。2.實踐準(zhǔn)備:掌握一種計算機(jī)高級語言的使用。要求完成的主要任務(wù):〔包括課程設(shè)計工作量與其技術(shù)要求,以與說明書撰寫等具體要求〕1.采用頁式管理方案實施內(nèi)存分配和回收。能夠處理以下的情形⑴能夠輸入給定的內(nèi)存頁面數(shù),頁面大小,進(jìn)程的個數(shù)與每個進(jìn)程的頁數(shù)。⑵要求當(dāng)某進(jìn)程提出申請空間的大小后,顯示能否滿足申請,以與為該進(jìn)程分配資源后內(nèi)存空間的使用情況〔被進(jìn)程占用的頁面,空閑的頁面〕。2.設(shè)計報告內(nèi)容應(yīng)說明:⑴課程設(shè)計目的與功能;⑵需求分析,數(shù)據(jù)結(jié)構(gòu)或模塊說明<功能與框圖>;⑶源程序的主要部分;⑷測試用例,運(yùn)行結(jié)果與運(yùn)行情況分析;⑸自我評價與總結(jié):=1\*romani〕你認(rèn)為你完成的設(shè)計哪些地方做得比較好或比較出色;=2\*romanii〕什么地方做得不太好,以后如何改正;=3\*romaniii〕從本設(shè)計得到的收獲〔在編寫,調(diào)試,執(zhí)行過程中的經(jīng)驗和教訓(xùn)〕;=4\*romaniv〕完成本題是否有其他的其他方法〔如果有,簡要說明該方法〕;=5\*romanv〕對實驗題的評價和改進(jìn)意見,請你推薦設(shè)計題目。時間安排:設(shè)計安排一周:周1、周2:完成程序分析與設(shè)計。周2、周3:完成程序調(diào)試與測試。周4、周5:驗收,撰寫課程設(shè)計報告?!沧⒁馐马棧簢?yán)禁抄襲,一旦發(fā)現(xiàn),抄與被抄的一律按0分記〕指導(dǎo)教師簽名:年月日系主任〔或責(zé)任教師〕簽名:年月日模擬設(shè)計頁式存儲管理的分配與回收1需求分析頁式管理是一種內(nèi)存空間存儲管理的技術(shù),頁式管理分為靜態(tài)頁式管理和動態(tài)頁式管理。基本原理是將各進(jìn)程的虛擬空間劃分成若干個長度相等的頁<page>,頁式管理把內(nèi)存空間按頁的大小劃分成片或者頁面〔pageframe〕,然后把頁式虛擬地址與內(nèi)存地址建立一一對應(yīng)頁表,并用相應(yīng)的硬件地址變換機(jī)構(gòu),來解決離散地址變換問題。頁式管理采用請求調(diào)頁或預(yù)調(diào)頁技術(shù)實現(xiàn)了內(nèi)外存存儲器的統(tǒng)一管理。圖1頁的劃分圖2基本頁表示例靜態(tài)分頁管理的第一步是為要求內(nèi)存的作業(yè)或進(jìn)程分配足夠的頁面。系統(tǒng)通過存儲頁面表、請求表以與頁表來完成內(nèi)存的分配工作。頁表指的是內(nèi)存中的一塊固定存儲區(qū)。頁式管理時每個進(jìn)程至少有一個頁表。請求表指的是用來確定作業(yè)或進(jìn)程的虛擬空間的各頁在內(nèi)存中的實際對應(yīng)位置;另外整個系統(tǒng)有一個存儲頁面表,其描述了物理內(nèi)存空間的分配使用狀況。圖3請求表的示例存儲頁面表有兩種構(gòu)成方法:1、位示圖法2、空閑頁面鏈表法模擬設(shè)計頁式存儲管理的分配與回收要求能夠滿足如下的要求:輸入給定的內(nèi)存頁面數(shù),頁面大小,進(jìn)程的個數(shù)與每個進(jìn)程的頁數(shù)。要求當(dāng)某進(jìn)程提出申請空間的大小后,顯示能否滿足申請,以與為該進(jìn)程分配資源后內(nèi)存空間的使用情況〔被進(jìn)程占用的頁面,空閑的頁面〕。2功能設(shè)計2.1算法分析首先,請求表給出進(jìn)程或作業(yè)要求的頁面數(shù)。然后,由存儲頁面表檢查是否有足夠的空閑頁面,如果沒有,則本次無法分配。如果有則首先分配設(shè)置頁表,并請求表中的相應(yīng)表項后,按一定的查找算法搜索出所要求的空閑頁面,并將對應(yīng)的頁好填入頁表中。圖4分配頁面的算法流程2.2數(shù)據(jù)結(jié)構(gòu)頁式管理把內(nèi)存空間按頁的大小劃分成片或者頁面,再按照一定的規(guī)律建立起頁表,并通過請求表將分配內(nèi)容顯示出來.將頁表和請求表的內(nèi)容使用結(jié)構(gòu)體來定義是比較方便的.//頁表項結(jié)構(gòu)typedefstruct_pagetableitem{ pageidpagenum; //頁號 blockidblocknum; //塊號}pgtabitem; //頁表typedefpgtabitem*pagetable;//請求表結(jié)構(gòu)typedefstruct_reqtable{ unsignedpid; //進(jìn)程號 unsignedreqpagenum; //請求頁面數(shù) pagetablepgtabadr;//頁表始址 boolstate; //狀態(tài)}reqtabitem;請求表還引入了支持快速插入和刪除的list順序容器來進(jìn)行相關(guān)操作.list<reqtabitem>reqtable因為模擬設(shè)計的關(guān)系,頁面的起始地址均應(yīng)該為隨機(jī)的數(shù)值,所以程序在設(shè)計過程中加入了隨機(jī)數(shù)類的編寫.classRandomNumber{private:unsignedlongrandseed;public:RandomNumber<unsignedlongs=0>;unsignedshortRandom<unsignedlongn>;doublefRandom<void>;};采用當(dāng)前系統(tǒng)的時間值來生成偽隨機(jī)數(shù)分配地址.定義隨機(jī)數(shù)產(chǎn)生器:RandomNumberrandom定義內(nèi)存頁面數(shù):intpagenum定義頁面大小:intpagesize定義進(jìn)程個數(shù):intpnum用整數(shù)數(shù)組模擬分配的內(nèi)存頁面數(shù)int*mempage=newint[pagenum]2.3模塊說明2.3.1主函數(shù)主函數(shù)依次運(yùn)行了程序中所實現(xiàn)的關(guān)鍵函數(shù).intmain<>{InitSys<>;//初始化系統(tǒng)MainChoice<>;//輸出系統(tǒng)菜單Destroy<>;//釋放申請的動態(tài)內(nèi)存return0;}2.3.2各個功能函數(shù)初始化內(nèi)存頁面:voidInit_Mempage<void>獲取內(nèi)存使用情況:intGet_Mempagenum<void>初始化默認(rèn)的請求表:voidInit_Reqtable<void>為默認(rèn)的進(jìn)程分配內(nèi)存:voidInit_DistMem<void>手動創(chuàng)建進(jìn)程,并分配內(nèi)存:voidDist_Mem<void>釋放申請的動態(tài)內(nèi)存:voidDestroy<void>結(jié)束指定進(jìn)程:voidKill<void>2.3.3打印函數(shù)打印出進(jìn)程請求表:voidPrintReqtable<void>打印出頁表:voidPrintPageTable<void>打印出內(nèi)存使用情況:voidPrintMem<void>打印出物理塊的大小:voidPrintBlockSize<void>2.3.4其他函數(shù)初始化系統(tǒng):voidInitSys<void>輸出主菜單:voidMainMenu<void>選擇運(yùn)行分支:voidMainChoice<>3開發(fā)平臺3.1開發(fā)平臺使用系統(tǒng):Windows7使用語言:C++開發(fā)工具:VisualC++20084測試用例,運(yùn)行結(jié)果與運(yùn)行情況分析4.1測試方法通過輸入正常數(shù)據(jù)以與非正常數(shù)據(jù)對程序進(jìn)行全方位測試4.2測試結(jié)果<1>程序主界面<2>輸入進(jìn)程號和頁面數(shù):<3>顯示進(jìn)程頁表:<4>顯示請求表<5>顯示內(nèi)存使用情況以與物理塊大小<6>錯誤檢驗5源程序的主要部分#include<iostream>#include<cstdlib>#include<iomanip>#include<list>#include"page.h"#include"Random.h"usingnamespacestd;list<reqtabitem>reqtable;RandomNumberrandom;//隨機(jī)數(shù)產(chǎn)生器unsignedpagenum=random.Random<80>+21;//內(nèi)存頁面數(shù)21-100unsignedpagesize=random.Random<16>+5;//頁面大小 5-20unsignedpnum=random.Random<4>+5;//進(jìn)程的個數(shù)5-8int*mempage=newint[pagenum];//用整數(shù)數(shù)組模擬內(nèi)存頁面數(shù)/*初始化內(nèi)存頁面*/voidInit_Mempage<void>{ inti=0; for<i=0;i<int<pagenum>;i++> mempage[i]=0; //數(shù)組全部賦初值}/*獲取內(nèi)存的使用情況*/intGet_Mempagenum<void>{ intsum=0; for<inti=0;i<int<pagenum>;i++> if<mempage[i]==0> sum++; returnsum; //判斷有多少內(nèi)存頁面已經(jīng)被使用}/*初始化默認(rèn)的請求表*/voidInit_Reqtable<void>{ inti; for<i=1;i<=int<pnum>;i++> { reqtabitempreq; preq.pid=i; preq.reqpagenum=random.Random<4>+2;//進(jìn)程請求的頁面大小-5 preq.state=false; preq.pgtabadr=NULL; reqtable.push_back<preq>; //依次壓入容器 }}/*為默認(rèn)的進(jìn)程分配內(nèi)存*/voidInit_DistMem<void>{ intreqpnum; //進(jìn)程請求頁面數(shù) inti; list<reqtabitem>::iteratorpos=reqtable.begin<>; for<;pos!=reqtable.end<>;pos++> { reqpnum=<*pos>.reqpagenum; if<reqpnum>int<Get_Mempagenum<>>> //判斷請求的內(nèi)存頁面數(shù)目是否大于剩余的 { cout<<"沒有足夠的內(nèi)存!"<<endl; cout<<endl; } else { <*pos>.state=true; pagetabletemp=newpgtabitem[reqpnum];//新建臨時頁表項數(shù)組 if<temp==NULL> { cout<<"內(nèi)存分配失敗!"<<endl; exit<0>; } <*pos>.pgtabadr=temp; for<i=0;i<reqpnum;i++> { temp[i].pagenum=i; //頁表的頁號 intrandnum=random.Random<pagenum>+1;//隨機(jī)產(chǎn)生一個塊號 while<mempage[randnum]==1> randnum=random.Random<pagenum>+1; temp[i].blocknum=randnum;//頁表的塊號 mempage[randnum]=1; } } }}/*手動創(chuàng)建進(jìn)程,并分配內(nèi)存*/voidDist_Mem<void>{ inti; reqtabitempreq; //新創(chuàng)建進(jìn)程記錄 intpid; //進(jìn)程號 intreqpnum; //請求頁面數(shù) boolflag=false; do{ cout<<"請輸入進(jìn)程號:"; flag=false; cin>>pid; for<list<reqtabitem>::iteratorpos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.pid==pid> { flag=true; cout<<"該進(jìn)程號已經(jīng)存在,請重新輸入"<<endl; cout<<endl; break; } } }while<flag==true>;//循環(huán)直到輸入的Pid滿足條件 preq.pid=pid; cout<<"請輸入需要的頁面數(shù):"; cin>>reqpnum; preq.reqpagenum=reqpnum; preq.state=false; preq.pgtabadr=NULL; reqpnum=preq.reqpagenum; if<reqpnum>Get_Mempagenum<>> { cout<<"沒有足夠的內(nèi)存,進(jìn)程創(chuàng)建失敗!"<<endl; cout<<endl; } else { preq.state=true; pagetabletemp=newpgtabitem[reqpnum]; if<temp==NULL> { cout<<"內(nèi)存分配失敗!"<<endl; exit<0>; } preq.pgtabadr=temp; for<i=0;i<int<reqpnum>;i++> { temp[i].pagenum=i; //頁表的頁號 intrandnum=random.Random<pagenum>+1;//隨機(jī)產(chǎn)生一個塊號 while<mempage[randnum]==1> randnum=random.Random<pagenum>+1; temp[i].blocknum=randnum;//頁表的塊號 mempage[randnum]=1; } } reqtable.push_back<preq>; //將該進(jìn)程的記錄加入請求表}/*程序結(jié)束時,釋放申請的動態(tài)內(nèi)存*/voidDestroy<void>{ list<reqtabitem>::iteratorpos=reqtable.begin<>; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.state==true> delete[]<*pos>.pgtabadr; } reqtable.clear<>;}/*打印出進(jìn)程請求表*/voidPrintReqtable<void>{ cout<<endl; cout<<"||"<<endl; cout<<"|進(jìn)程請求表|"<<endl; cout<<"||"<<endl; cout<<"|"<<setw<8><<"進(jìn)程號" <<setw<16><<"請求頁面數(shù)" <<setw<16><<"頁表起始地址" <<setw<16><<"頁表長度" <<setw<16><<"狀態(tài)|"<<endl; cout<<"||"<<endl; list<reqtabitem>::iteratorpos=reqtable.begin<>; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { cout<<"|"<<setw<8><<<*pos>.pid <<setw<16><<<*pos>.reqpagenum <<setw<16><<<*pos>.pgtabadr <<setw<16><<<<*pos>.reqpagenum>*pagesize; if<<*pos>.state> cout<<setw<4><<"已分配|"<<endl; else cout<<setw<4><<"未分配|"<<endl; if<<*pos>.pid!=reqtable.back<>.pid> cout<<"||"<<endl; else cout<<"||"<<endl; }}/*打印頁表*/voidPrintPageTable<void>{ unsignedpid; inti; boolflag=false; cout<<"請輸入進(jìn)程號:"; cin>>pid; list<reqtabitem>::iteratorpos=reqtable.begin<>; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.pid==pid&&<*pos>.state==true> { flag=true; cout<<"||"<<endl; cout<<"|此進(jìn)程的頁表|"<<endl; cout<<"||"<<endl; cout<<"|"<<setw<16><<"頁號" <<setw<6><<"塊號|"<<endl; cout<<"||"<<endl; intreqpagenum=<*pos>.reqpagenum; for<i=0;i<reqpagenum;i++> { cout<<"|"<<setw<16><<<*pos>.pgtabadr[i].pagenum <<setw<6><<<*pos>.pgtabadr[i].blocknum<<"|"<<endl; if<i!=reqpagenum-1> cout<<"||"<<endl; else cout<<"||"<<endl; } } } if<flag==false> cout<<"系統(tǒng)中不存在該進(jìn)程或者該進(jìn)程還沒有被分配內(nèi)存!\n"; cout<<endl;}voidPrintMem<void>{ cout<<"內(nèi)存總塊數(shù)為"<<pagenum<<",已經(jīng)使用了"<<pagenum-Get_Mempagenum<><<"塊!"<<endl; cout<<"現(xiàn)在還有"<<Get_Mempagenum<><<"塊內(nèi)存區(qū)域空閑!"<<endl; cout<<endl;}voidPrintBlockSize<void>{ cout<<"物理塊大小為:"<<pagesize<<"KB"<<endl; cout<<endl;}/*結(jié)束指定進(jìn)程*/voidKill<void>{ boolflag; inti; reqtabitemtemp; list<reqtabitem>::iteratorpos=reqtable.begin<>; intpid; do{ cout<<"請輸入進(jìn)程號:"; flag=false; cin>>pid; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.pid==pid> { flag=true; temp=*pos; break; } } if<flag==false> cout<<"系統(tǒng)中不存在該進(jìn)程!"<<endl; cout<<endl; }while<flag==false>; for<i=0;i<int<temp.reqpagenum>;i++> mempage[temp.pgtabadr[i].blocknum]=0; reqtable.remove<temp>; //重新為沒有分配到內(nèi)存的進(jìn)程分配內(nèi)存 for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.state==false> { intreqpnum; reqpnum=<*pos>.reqpagenum; if<reqpnum<=Get_Mempagenum<>> { <*pos>.state=true; pagetabletemp=newpgtabitem[reqpnum]; if<temp==NULL> { cout<<"內(nèi)存分配失敗!"<<endl; cout<<endl; exit<0>; } <*pos>.pgtabadr=temp; for<i=0;i<int<reqpnum>;i++> { temp[i].pagenum=i; //頁表的頁號 intrandnum=random.Random<pagenum>+1;//隨機(jī)產(chǎn)生一個塊號 while<mempage[randnum]==1> randnum=random.Random<pagenum>+1; temp[i].blocknum=randnum;//頁表的塊號 mempage[randnum]=1; } } } }}/*初始化系統(tǒng)*/voidInitSys<void>{ cout.setf<ios::left>;//左對齊 Init_Mempage<>; Init_Reqtable<>; Init_DistMem<>;}/*輸出主菜單*/voidMainMenu<void>{ cout<<"頁式存儲管理的分配與回收"<<endl; cout<<"1.手動創(chuàng)建進(jìn)程"<<endl; cout<<"2.顯示進(jìn)程頁表"<<endl; cout<<"3.顯示請求表"<<endl; cout<<"4.撤銷進(jìn)程"<<endl; cout<<"5.顯示內(nèi)存使用情況"<<endl; cout<<"6.顯示物理塊大小"<<endl; cout<<"7.退出系統(tǒng)"<<endl; cout<<"請輸入您的選擇<0--7>:";}/*選擇函數(shù)*/voidMainChoice<>{ intchoice; do{ MainMenu<>; cin>>choice; switch<choice> { case1: Dist_Mem<>; break; case2: PrintPageTable<>; break; case3: PrintReqtable<>; break; case4: Kill<>; break; case5: PrintMem<>; break; case6: PrintBlockSize<>; break; case7: break; default:cout<<"輸入有誤,請重新輸入.\n"; co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備買賣合同簽訂倉儲保管要求
- 農(nóng)藥行業(yè)購銷合同簽訂要點
- 教育機(jī)構(gòu)飲水機(jī)租賃合同
- 生態(tài)修復(fù)維修保養(yǎng)室外施工合同
- 企業(yè)擴(kuò)張期聘用總經(jīng)理合同模板
- 老街特色民宿租賃合同
- 珠寶設(shè)計加盟協(xié)議
- 戶外演唱會音響租賃協(xié)議
- 醫(yī)療聘用合同醫(yī)院安全保衛(wèi)
- 住宅小區(qū)綠化專業(yè)施工合同范本
- 交工技術(shù)文件表格范本
- 動火作業(yè)許可證(模板)
- 市人大常委會辦公廳關(guān)于人大會議籌備情況報告供借鑒
- 吊籃安裝合同范文
- 【甲乳外科-甲狀腺-課件-幻燈】超聲引導(dǎo)下甲旁亢熱消融治療
- 軟件開發(fā)項目的監(jiān)理規(guī)劃
- 戴煒棟英語語言學(xué)概論Chapter 1
- 2020年廣東省中考數(shù)學(xué)試卷
- 小區(qū)會所經(jīng)營方案(開業(yè)投資分析)
- 加氣混凝土砌塊施工方法
- 銷售冠軍團(tuán)隊銷售職場培訓(xùn)動態(tài)PPT
評論
0/150
提交評論