操作系統(tǒng)課程設計-模擬設計頁式存儲管理的分配與回收_第1頁
操作系統(tǒng)課程設計-模擬設計頁式存儲管理的分配與回收_第2頁
操作系統(tǒng)課程設計-模擬設計頁式存儲管理的分配與回收_第3頁
操作系統(tǒng)課程設計-模擬設計頁式存儲管理的分配與回收_第4頁
操作系統(tǒng)課程設計-模擬設計頁式存儲管理的分配與回收_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

./__0120910340228課程設計題目模擬設計頁式存儲管理的分配與回收學院計算機科學與技術專業(yè)計算機科學與技術班級XX姓名XX指導教師XXX2011年01月09日課程設計任務書學生__XX專業(yè)__計算機0902班指導XXX工作單位:計算機科學與技術學院題目:模擬設計頁式存儲管理的分配與回收初始條件:1.預備內(nèi)容:閱讀操作系統(tǒng)的內(nèi)存管理章節(jié)內(nèi)容,了解有關虛擬存儲器、頁式存儲管理等概念,并體會頁式管理內(nèi)存的分配和回收過程。2.實踐準備:掌握一種計算機高級語言的使用。要求完成的主要任務:〔包括課程設計工作量與其技術要求,以與說明書撰寫等具體要求〕1.采用頁式管理方案實施內(nèi)存分配和回收。能夠處理以下的情形⑴能夠輸入給定的內(nèi)存頁面數(shù),頁面大小,進程的個數(shù)與每個進程的頁數(shù)。⑵要求當某進程提出申請空間的大小后,顯示能否滿足申請,以與為該進程分配資源后內(nèi)存空間的使用情況〔被進程占用的頁面,空閑的頁面〕。2.設計報告內(nèi)容應說明:⑴課程設計目的與功能;⑵需求分析,數(shù)據(jù)結構或模塊說明<功能與框圖>;⑶源程序的主要部分;⑷測試用例,運行結果與運行情況分析;⑸自我評價與總結:=1\*romani〕你認為你完成的設計哪些地方做得比較好或比較出色;=2\*romanii〕什么地方做得不太好,以后如何改正;=3\*romaniii〕從本設計得到的收獲〔在編寫,調(diào)試,執(zhí)行過程中的經(jīng)驗和教訓〕;=4\*romaniv〕完成本題是否有其他的其他方法〔如果有,簡要說明該方法〕;=5\*romanv〕對實驗題的評價和改進意見,請你推薦設計題目。時間安排:設計安排一周:周1、周2:完成程序分析與設計。周2、周3:完成程序調(diào)試與測試。周4、周5:驗收,撰寫課程設計報告?!沧⒁馐马棧簢澜u,一旦發(fā)現(xiàn),抄與被抄的一律按0分記〕指導教師簽名:年月日系主任〔或責任教師〕簽名:年月日模擬設計頁式存儲管理的分配與回收1需求分析頁式管理是一種內(nèi)存空間存儲管理的技術,頁式管理分為靜態(tài)頁式管理和動態(tài)頁式管理?;驹硎菍⒏鬟M程的虛擬空間劃分成若干個長度相等的頁<page>,頁式管理把內(nèi)存空間按頁的大小劃分成片或者頁面〔pageframe〕,然后把頁式虛擬地址與內(nèi)存地址建立一一對應頁表,并用相應的硬件地址變換機構,來解決離散地址變換問題。頁式管理采用請求調(diào)頁或預調(diào)頁技術實現(xiàn)了內(nèi)外存存儲器的統(tǒng)一管理。圖1頁的劃分圖2基本頁表示例靜態(tài)分頁管理的第一步是為要求內(nèi)存的作業(yè)或進程分配足夠的頁面。系統(tǒng)通過存儲頁面表、請求表以與頁表來完成內(nèi)存的分配工作。頁表指的是內(nèi)存中的一塊固定存儲區(qū)。頁式管理時每個進程至少有一個頁表。請求表指的是用來確定作業(yè)或進程的虛擬空間的各頁在內(nèi)存中的實際對應位置;另外整個系統(tǒng)有一個存儲頁面表,其描述了物理內(nèi)存空間的分配使用狀況。圖3請求表的示例存儲頁面表有兩種構成方法:1、位示圖法2、空閑頁面鏈表法模擬設計頁式存儲管理的分配與回收要求能夠滿足如下的要求:輸入給定的內(nèi)存頁面數(shù),頁面大小,進程的個數(shù)與每個進程的頁數(shù)。要求當某進程提出申請空間的大小后,顯示能否滿足申請,以與為該進程分配資源后內(nèi)存空間的使用情況〔被進程占用的頁面,空閑的頁面〕。2功能設計2.1算法分析首先,請求表給出進程或作業(yè)要求的頁面數(shù)。然后,由存儲頁面表檢查是否有足夠的空閑頁面,如果沒有,則本次無法分配。如果有則首先分配設置頁表,并請求表中的相應表項后,按一定的查找算法搜索出所要求的空閑頁面,并將對應的頁好填入頁表中。圖4分配頁面的算法流程2.2數(shù)據(jù)結構頁式管理把內(nèi)存空間按頁的大小劃分成片或者頁面,再按照一定的規(guī)律建立起頁表,并通過請求表將分配內(nèi)容顯示出來.將頁表和請求表的內(nèi)容使用結構體來定義是比較方便的.//頁表項結構typedefstruct_pagetableitem{ pageidpagenum; //頁號 blockidblocknum; //塊號}pgtabitem; //頁表typedefpgtabitem*pagetable;//請求表結構typedefstruct_reqtable{ unsignedpid; //進程號 unsignedreqpagenum; //請求頁面數(shù) pagetablepgtabadr;//頁表始址 boolstate; //狀態(tài)}reqtabitem;請求表還引入了支持快速插入和刪除的list順序容器來進行相關操作.list<reqtabitem>reqtable因為模擬設計的關系,頁面的起始地址均應該為隨機的數(shù)值,所以程序在設計過程中加入了隨機數(shù)類的編寫.classRandomNumber{private:unsignedlongrandseed;public:RandomNumber<unsignedlongs=0>;unsignedshortRandom<unsignedlongn>;doublefRandom<void>;};采用當前系統(tǒng)的時間值來生成偽隨機數(shù)分配地址.定義隨機數(shù)產(chǎn)生器:RandomNumberrandom定義內(nèi)存頁面數(shù):intpagenum定義頁面大小:intpagesize定義進程個數(shù):intpnum用整數(shù)數(shù)組模擬分配的內(nèi)存頁面數(shù)int*mempage=newint[pagenum]2.3模塊說明2.3.1主函數(shù)主函數(shù)依次運行了程序中所實現(xià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>初始化默認的請求表:voidInit_Reqtable<void>為默認的進程分配內(nèi)存:voidInit_DistMem<void>手動創(chuàng)建進程,并分配內(nèi)存:voidDist_Mem<void>釋放申請的動態(tài)內(nèi)存:voidDestroy<void>結束指定進程:voidKill<void>2.3.3打印函數(shù)打印出進程請求表:voidPrintReqtable<void>打印出頁表:voidPrintPageTable<void>打印出內(nèi)存使用情況:voidPrintMem<void>打印出物理塊的大小:voidPrintBlockSize<void>2.3.4其他函數(shù)初始化系統(tǒng):voidInitSys<void>輸出主菜單:voidMainMenu<void>選擇運行分支:voidMainChoice<>3開發(fā)平臺3.1開發(fā)平臺使用系統(tǒng):Windows7使用語言:C++開發(fā)工具:VisualC++20084測試用例,運行結果與運行情況分析4.1測試方法通過輸入正常數(shù)據(jù)以與非正常數(shù)據(jù)對程序進行全方位測試4.2測試結果<1>程序主界面<2>輸入進程號和頁面數(shù):<3>顯示進程頁表:<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;//隨機數(shù)產(chǎn)生器unsignedpagenum=random.Random<80>+21;//內(nèi)存頁面數(shù)21-100unsignedpagesize=random.Random<16>+5;//頁面大小 5-20unsignedpnum=random.Random<4>+5;//進程的個數(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)被使用}/*初始化默認的請求表*/voidInit_Reqtable<void>{ inti; for<i=1;i<=int<pnum>;i++> { reqtabitempreq; preq.pid=i; preq.reqpagenum=random.Random<4>+2;//進程請求的頁面大小-5 preq.state=false; preq.pgtabadr=NULL; reqtable.push_back<preq>; //依次壓入容器 }}/*為默認的進程分配內(nèi)存*/voidInit_DistMem<void>{ intreqpnum; //進程請求頁面數(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;//隨機產(chǎn)生一個塊號 while<mempage[randnum]==1> randnum=random.Random<pagenum>+1; temp[i].blocknum=randnum;//頁表的塊號 mempage[randnum]=1; } } }}/*手動創(chuàng)建進程,并分配內(nèi)存*/voidDist_Mem<void>{ inti; reqtabitempreq; //新創(chuàng)建進程記錄 intpid; //進程號 intreqpnum; //請求頁面數(shù) boolflag=false; do{ cout<<"請輸入進程號:"; flag=false; cin>>pid; for<list<reqtabitem>::iteratorpos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.pid==pid> { flag=true; cout<<"該進程號已經(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)存,進程創(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;//隨機產(chǎn)生一個塊號 while<mempage[randnum]==1> randnum=random.Random<pagenum>+1; temp[i].blocknum=randnum;//頁表的塊號 mempage[randnum]=1; } } reqtable.push_back<preq>; //將該進程的記錄加入請求表}/*程序結束時,釋放申請的動態(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<>;}/*打印出進程請求表*/voidPrintReqtable<void>{ cout<<endl; cout<<"||"<<endl; cout<<"|進程請求表|"<<endl; cout<<"||"<<endl; cout<<"|"<<setw<8><<"進程號" <<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<<"請輸入進程號:"; 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<<"|此進程的頁表|"<<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)中不存在該進程或者該進程還沒有被分配內(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;}/*結束指定進程*/voidKill<void>{ boolflag; inti; reqtabitemtemp; list<reqtabitem>::iteratorpos=reqtable.begin<>; intpid; do{ cout<<"請輸入進程號:"; 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)中不存在該進程!"<<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)存的進程分配內(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;//隨機產(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)建進程"<<endl; cout<<"2.顯示進程頁表"<<endl; cout<<"3.顯示請求表"<<endl; cout<<"4.撤銷進程"<<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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論