操作系統(tǒng)段表課程設(shè)計說明書_第1頁
操作系統(tǒng)段表課程設(shè)計說明書_第2頁
操作系統(tǒng)段表課程設(shè)計說明書_第3頁
操作系統(tǒng)段表課程設(shè)計說明書_第4頁
操作系統(tǒng)段表課程設(shè)計說明書_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、武漢理工大學(xué)操作系統(tǒng)課程設(shè)計說明書課程設(shè)計任務(wù)書學(xué)生姓名: 朱東各 專業(yè)班級: 計算機0604 指導(dǎo)教師: 蔡 菁 工作單位: 計算機科學(xué)與技術(shù)學(xué)院 題 目: 模擬設(shè)計段頁式虛擬存儲管理中地址轉(zhuǎn)換初始條件:1預(yù)備內(nèi)容:閱讀操作系統(tǒng)的內(nèi)存管理章節(jié)內(nèi)容,理解段頁式存儲管理的思想及相應(yīng)的分配主存的過程。2實踐準備:掌握一種計算機高級語言的使用。要求完成的主要任務(wù): (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)1實現(xiàn)段頁式存儲管理中邏輯地址到物理地址的轉(zhuǎn)換。能夠處理以下的情形: 能指定內(nèi)存的大小,內(nèi)存塊的大小,進程的個數(shù),每個進程的段數(shù)及段內(nèi)頁的個數(shù); 能檢查地址的合法性,如果合法進行

2、轉(zhuǎn)換,否則顯示地址非法的原因。2設(shè)計報告內(nèi)容應(yīng)說明: 需求分析; 功能設(shè)計(數(shù)據(jù)結(jié)構(gòu)及模塊說明); 開發(fā)平臺及源程序的主要部分; 測試用例,運行結(jié)果與運行情況分析; 自我評價與總結(jié):i)你認為你完成的設(shè)計哪些地方做得比較好或比較出色;ii)什么地方做得不太好,以后如何改正;iii)從本設(shè)計得到的收獲(在編寫,調(diào)試,執(zhí)行過程中的經(jīng)驗和教訓(xùn));iv)完成本題是否有其他方法(如果有,簡要說明該方法);v)對實驗題的評價和改進意見,請你推薦設(shè)計題目。時間安排:設(shè)計安排一周:周1、周2:完成程序分析及設(shè)計。周2、周3:完成程序調(diào)試及測試。周4、周5:驗收、撰寫課程設(shè)計報告。(注意事項:嚴禁抄襲,一旦發(fā)現(xiàn)

3、,一律按0分記)指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日模擬段頁式虛擬存儲管理中 地址轉(zhuǎn)換1需求分析1.1段頁式管理的基本思想1.1.1基本思想段式和頁式存儲管理各有優(yōu)缺點,段頁式存儲管理系統(tǒng),用分段的方法來分配和管理虛擬存儲器,而用分頁的方法來分配和管理主存。既有段式系統(tǒng)便于實現(xiàn)段的共享,段的保護,動態(tài)鏈接和段的動態(tài)增長等一系列優(yōu)點,又能像頁式系統(tǒng)那樣,很好地解決內(nèi)存的外碎片問題。具體來說,把整個內(nèi)存分成大小相等內(nèi)存塊,內(nèi)存塊從0開始依次編號。把用戶程序分成若干段,每段有個段名。頁面的大小和內(nèi)存塊相同,每段的各個頁面都分別從0開始依次編號。虛空間的最小單位是頁而不是段

4、,內(nèi)存就被分為若干個頁,且每段所擁有的程序和數(shù)據(jù)在內(nèi)存中可以分開存放,分段大小也不再受內(nèi)存可用區(qū)的限制。1.2段頁式存儲的原理1.2.1虛地址的構(gòu)成邏輯地址有三部分構(gòu)成:V=(S,P,d)即段號s,頁號p和頁內(nèi)相對地址d,如下所示:spd內(nèi)存分配:以塊為單位進行內(nèi)存分配,為了實現(xiàn)從邏輯地址到物理地址的轉(zhuǎn)換,為每個作業(yè)或進程建立一張段表:段表中的段長即是頁表長度,段表中的段內(nèi)始址即是頁表地址,每個段擁有一張頁表,段內(nèi)的頁號映射為物理地址中的物理塊號。1.2.2段表和頁表的構(gòu)成 在段頁式存儲管理系統(tǒng)中,段表包含這樣幾個基本項:段號,狀態(tài),該段的頁表長度,頁表始址;頁表包含的基本項是:頁號,狀態(tài),塊

5、號。段頁式管理中段表,頁表以及內(nèi)存的關(guān)系如下圖:1.2.3 動態(tài)地址變換過程在段頁式存儲管理系統(tǒng)中,要對內(nèi)存中的指令或數(shù)據(jù)進行一次存取操作至少需要訪問3次內(nèi)存。第一次是由段表寄存器得到段表始址去訪問段表,然后取出對應(yīng)段的頁表地址。第二次則是訪問頁表得到所要訪問的物理地址。只有在訪問了段表和頁表之后,第三次才能訪問真正要訪問的物理單元。段頁式存儲管理系統(tǒng)地址變換如下所示:2 功能設(shè)計(數(shù)據(jù)結(jié)構(gòu)及模塊說明)2.1 存儲結(jié)構(gòu)說明在此段頁式存儲管理系統(tǒng)中,我們采用以下數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù),存儲結(jié)構(gòu)用結(jié)構(gòu)體和結(jié)構(gòu)體數(shù)組來實現(xiàn):2.1.1段表段號s狀態(tài)flag頁表長度plen頁表始址psta/段表typed

6、ef struct Stackint num;/段號int flag;/段狀態(tài)int plen;/頁表長度int psta;/頁表始址Stack;其中狀態(tài)為1代表在內(nèi)存,為0代表不在內(nèi)存。2.1.2 頁表頁號pnum狀態(tài)位(是否在內(nèi)存中)塊號block/頁表typedef struct Pageint num;/頁號int flag;/頁狀態(tài),即是否在內(nèi)存。int block;/該頁對應(yīng)的塊號Page;2.1.3 數(shù)據(jù)區(qū)塊號block作業(yè)內(nèi)容 簡單起見,我們沒有把內(nèi)容初始化到每一個內(nèi)存地址,只給出每個作業(yè)塊的內(nèi)容,并且用一串字符代替。typedef struct Dataint num;/內(nèi)存

7、的塊數(shù)string str;/對應(yīng)數(shù)據(jù)塊的作業(yè)內(nèi)容,簡化起見說明內(nèi)容為一串字符。Data;2.1.4 快表段號段內(nèi)頁號塊號/快表typedef struct Quickint qs;/快表段號int qp;/快表頁號int qb;/快表段號Quick;2.1.5 段表寄存器段表始址段表長度/段表寄存器typedef struct Stareint ssta;/段表始址int slen;/段表長度Stare;2.2程序流程圖3 程序設(shè)計3.1 本程序平臺本實驗使用VC+ 6.0平臺,使用基本的控制臺應(yīng)用程序,單文檔結(jié)構(gòu),主要數(shù)據(jù)結(jié)構(gòu)是結(jié)構(gòu)體間的關(guān)系。打開VC+6.0建立一個空工程,然后簡歷C+源

8、文件,根據(jù)數(shù)據(jù)結(jié)構(gòu)編寫代碼。3.2變量和函數(shù)說明3.2.1 變量說明 Stack ss10;/全局變量,用來存放所有進程的段,數(shù)組下標就是段號。 Stare st;/全局變量,用來存放段表寄存器表。 Data work20;/全局變量,主存每一塊的內(nèi)容,下標是塊號。Quick qu;/全局變量,存放快表。Page page55;/存放每個塊對應(yīng)的頁表。bool menuflag=0;/菜單函數(shù)標志位,首次使用初始化表。int bbs;/內(nèi)存塊大小int bs;/內(nèi)存大小3.2.2函數(shù)說明void menu();/為用戶提供菜單,詳情見第四部分截圖。void start();/初始化表項。詳情見

9、第四部分截圖。函數(shù)實現(xiàn)部分見附錄。void change();/地址轉(zhuǎn)換函數(shù)。詳情見第四部分截圖。函數(shù)實現(xiàn)部分見附錄。3.2.3 菜單設(shè)計進入界面必須先對段表數(shù)據(jù)進行初始化,然后可以多次進行地址轉(zhuǎn)換。4 結(jié)果與運行情況分析運行程序,測試程序運行情況:本次程序設(shè)計中,進入界面必須先對段表數(shù)據(jù)進行初始化,然后可以多次進行地址轉(zhuǎn)換,其中會出現(xiàn)段頁越界,缺(段)頁。其中有一點和實際并不相同:由于C+里面單限制,不能實現(xiàn)快表和段表的同時查詢,故模擬時采用先查詢快表然后再查詢段表的模式,另外,為每一段創(chuàng)建的頁表,直接有頁表二維數(shù)組組成,第一緯代表段號,第二維代表段內(nèi)頁號。 整體數(shù)據(jù)和用例見下圖:4.1 段

10、表初始化按照上圖,進入程序后進行段表初始化4.2 段號越界中斷測試從上圖中可以看到段號只有5個,0-4,所以越界中斷。邏輯地址不合法。4.3 缺段中斷測試第二段不在內(nèi)存,邏輯地址無法轉(zhuǎn)化,需要把該段調(diào)入主存。4.4 缺頁中斷測試第三段第0頁不在內(nèi)存,邏輯地址無法轉(zhuǎn)化,需要調(diào)入頁面。4.5 頁表越界測試第三段沒有第五頁,頁表越界,訪問非法。4.6 在段表中成功訪問數(shù)據(jù)測試成功測試數(shù)據(jù),第四段第0頁對應(yīng)塊號為10,故物理地址是10*1024+500=10740第十塊作業(yè)數(shù)據(jù)是:k5 自我評價與總結(jié)本次系統(tǒng)中,主要是利用簡單的數(shù)據(jù)結(jié)構(gòu)和VC的簡單的控制臺程序,采用自己定義數(shù)據(jù)模擬段頁式存儲管理的方式

11、,簡單明快的是給用戶一個功能菜單,進入菜單必須進行段表數(shù)據(jù)初始化,然后只要不退出就可以進行各種地址轉(zhuǎn)化測試,也可以重新初始化段表。而數(shù)據(jù)結(jié)構(gòu)部分,采用結(jié)構(gòu)體數(shù)組比較容易掌握的格式,是的查詢過程簡單化。總的來說,利用簡單的思想較為完整的模擬了段頁式存儲的各個步驟,甚至把快表也考慮了進去。對于各種非法訪問非常直觀的指出非法原因。為了體現(xiàn)數(shù)據(jù)訪問的真實性,我還簡單的為內(nèi)存中每一個作業(yè)快初始化了作業(yè)數(shù)據(jù),找到物理塊號后可以直接讀出塊的作業(yè)內(nèi)容。體現(xiàn)的本程序的根本目的。當(dāng)然,程序也有很多不足,例如可以考慮采用MFC窗口應(yīng)用程序,結(jié)合C+自帶的內(nèi)部模板函數(shù)MAP函數(shù),這樣也可以較好的模擬段頁式系統(tǒng),本程序

12、中對于段表的初始化過于繁瑣,可以采取文本數(shù)據(jù)庫的形式,利用讀取TXT的方式給段表鏈表結(jié)構(gòu)進行初始化,會增加程序的可視性,和簡便性。本次實驗中,總體還算比較順利,但是測試過程中還是出現(xiàn)了一些問題,主要是對段頁式存儲的理解不夠深入照成的,每一個段都有一個頁表,而這些段和自己的頁表是要靠段表里的頁表始址定位的,這個在程序中沒有完整的表現(xiàn)出來,另外第一次程序中沒有考慮頁表越界中斷,這是沒有完整的把握模擬系統(tǒng)中的各個環(huán)節(jié)造成的,為此要以自己寫好的程序流程圖為基礎(chǔ),考慮到每一步分支程序,盡量用簡單的方式把系統(tǒng)的各種功能模擬出來。上圖就是錯把3 5 521當(dāng)成缺頁中斷,應(yīng)該是頁表越界,這個在第四部分已經(jīng)改正

13、。 當(dāng)然,完成本題還有其他的方式,可以借用VC的內(nèi)置數(shù)據(jù)結(jié)構(gòu)和模板,可以使用結(jié)構(gòu)體指針來存取段表,可以吧段表存到文本文件里,這些都是可行的。 通過本次課程設(shè)計,加深了自己對書本知識的理解,通過親自把模擬系統(tǒng)做成數(shù)據(jù)結(jié)構(gòu),更加直觀真切的體會到段頁式存儲的基本思想,當(dāng)然同時也對其他的存儲知識加深了理解,同時鍛煉了自己把所學(xué)知識應(yīng)用的實際視圖里面的能力,做到學(xué)以致用,對計算機硬件里面的微觀世界有了進一步的剖析。7附錄完整的程序代碼:#include<iostream>#include<string>using namespace std;/數(shù)據(jù)結(jié)構(gòu)/快表typedef str

14、uct Quickint qs;/快表段號int qp;/快表頁號int qb;/快表段號Quick;/數(shù)據(jù)區(qū),簡單起見,只為每一個內(nèi)儲塊寫入內(nèi)容,不具體到每一物理地址。typedef struct Dataint num;/內(nèi)存的塊數(shù)string str;/對應(yīng)數(shù)據(jù)塊的作業(yè)內(nèi)容,簡化起見說明內(nèi)容為一串字符。Data;/頁表typedef struct Pageint num;/頁號int flag;/頁狀態(tài),即是否在內(nèi)存。int block;/該頁對應(yīng)的塊號Page;/段表typedef struct Stackint num;/段號int flag;/段狀態(tài)int plen;/頁表長度in

15、t psta;/頁表始址Stack;/段表寄存器typedef struct Stareint ssta;/段表始址int slen;/段表長度Stare;Stack ss10;/全局變量 Stare st;/全局變量 Data work20;/全局變量Quick qu;/全局變量Page page55;bool menuflag=0;int bbs;/內(nèi)存塊大小int bs;/內(nèi)存大小void menu();void start();void change();int main()menu();return 0;void menu() cout<<"*請選擇*"

16、;<<endl;cout<<endl;cout<<"* 1、初始化表 *"<<endl;cout<<"* 2、物理地址轉(zhuǎn)換 *"<<endl;cout<<"* 3、退出 *"<<endl;int menu1;cin>>menu1;if(menu1!=1&&menu1!=2&&menu1!=3)cout<<"請輸入正確的選項"<<endl;menu();s

17、witch(menu1)case 1: menuflag=1; start(); break;case 2:if(menuflag=0) cout<<"請初始化表"<<endl;menu();change();break;case 3:return;/switch void start() cout<<"請輸入內(nèi)存大小(K)"<<endl; cin>>bs; cout<<"請輸入內(nèi)存塊的大小(k)"<<endl; cin>>bbs; int

18、 blocknum; blocknum=bs/bbs; cout<<"內(nèi)存一共被分為"<<blocknum<<"塊,每塊"<<bbs<<"k"<<"一共"<<bs<<"k"<<endl; cout<<"請輸入進程個數(shù)"<<endl; int pn;cin>>pn; /下面求所有進程的總段數(shù)和段表,并為每段創(chuàng)建頁表 int sums=0

19、; for (int pn1=0;pn1<pn;pn1+) cout<<"請輸入第"<<pn1<<"個進程的段數(shù)"<<endl; int ppn;cin>>ppn; sums+=ppn; for(int ss1=0;ss1<sums;ss1+) cout<<"請輸入第"<<ss1<<"個段表數(shù)據(jù):段號,狀態(tài),頁表長度,頁表始址"<<endl; cin>>ssss1.num>>

20、;ssss1.flag>>ssss1.plen>>ssss1.psta; cout<<"請初始化第"<<ss1<<"段的頁表,輸入兩個數(shù)據(jù)頁表狀態(tài)和對應(yīng)塊號"<<endl; for(int sss1=0;sss1<ssss1.plen;sss1+) pagess1sss1.num=sss1; cout<<"請輸入該段第"<<sss1<<"個頁表的頁表狀態(tài)和對應(yīng)塊號"<<endl; cin&g

21、t;>pagess1sss1.flag>>pagess1sss1.block; /初始化段表寄存器 cout<<"初始化段表寄存器的段表始址"<<endl; cin>>st.ssta; st.slen=sums; /初始化內(nèi)存中物理地址每一塊的數(shù)據(jù)區(qū) cout<<"簡單起見,我們對物理地址的每一塊用字符串進行簡單的初始化,沒有具體到每一物理地址"<<endl; for (int bn=0;bn<blocknum;bn+) workbn.num=bn; cout<&l

22、t;"請輸入第"<<bn<<"個內(nèi)存塊里的作業(yè)內(nèi)容"<<endl; cin>>workbn.str; /初始化快表cout<<"簡單起見,我們初始化快表只有一個"<<endl;cout<<"請輸入要作為快表的段號和頁號"<<endl;cin>>qu.qb>>qu.qp;while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1)cout<<"該頁

23、不在內(nèi)存請輸入一頁在內(nèi)存中的作為快表,請輸入要作為快表的段號和頁號"<<endl; cin>>qu.qb>>qu.qp;qu.qs=pagequ.qbqu.qp.block;menu();void change() cout<<"請輸入要轉(zhuǎn)化的邏輯地址,段號s,段內(nèi)頁號p,頁內(nèi)偏移地址d(B)"<<endl; int snum,pnum,dnum; cin>>snum>>pnum>>dnum; /首先查快表 if(snum=qu.qb&&pnum=qu.

24、qp) cout<<"快表命中"<<"對應(yīng)塊號是"<<qu.qs<<endl; cout<<"該塊中作業(yè)數(shù)據(jù)是"<<workpagequ.qbqu.qp.block.str<<endl; cout<<"物理地址是"<<qu.qs*bbs*1024+dnum<<endl; menu(); /訪問段表寄存器 else cout<<"快表沒有命中,訪問段表寄存器,段號等于段表始址加上偏移地址"<<endl; int ssnum; ss

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論