段頁式虛擬存儲管理_第1頁
段頁式虛擬存儲管理_第2頁
段頁式虛擬存儲管理_第3頁
段頁式虛擬存儲管理_第4頁
段頁式虛擬存儲管理_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、wordword專業(yè)資料wordword專業(yè)資料學(xué)號:課程設(shè)計段頁式虛擬存儲管理學(xué)院計算機科學(xué)與技術(shù)專業(yè)班級姓名吳利軍指導(dǎo)教師吳利軍2013年1月16日課程設(shè)計任務(wù)書學(xué)生姓名:指導(dǎo)教師:吳利軍工作單位:計算機科學(xué)與技術(shù)學(xué)院初始條件:1預(yù)備容:閱讀操作系統(tǒng)的存管理章節(jié)容,理解段頁式存儲管理的思想及相應(yīng)的分配主存的過程。2實踐準(zhǔn)備:掌握一種計算機高級語言的使用。包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)1實現(xiàn)段頁式存儲管理中邏輯地址到物理地址的轉(zhuǎn)換。能夠處理以下的情形:能指定存的大小,存塊的大小,進程的個數(shù),每個進程的段數(shù)及段頁的個數(shù);

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

3、一旦發(fā)現(xiàn),一律按0分記)指導(dǎo)教師簽名:系主任(或責(zé)任教師)簽名:一、需求分析:頁式管理基本原理:各個進程的虛擬空間被劃分成若干個長度相等的頁。頁長的劃分和存與外存之間的數(shù)據(jù)傳輸速度及存大小等有關(guān)。一般每個頁長大約為14K,經(jīng)過頁劃分之后,進程的虛擬地址變?yōu)轫撎杙與頁地址w所組成。除了將進程的虛擬空間劃分為大小相等的頁之外,頁式管理還把存空間也按頁的大小劃分為片或者頁面。這些頁面為系統(tǒng)中的任一進程所共享。從而與分區(qū)管理不一樣,分頁管理時,用戶進程在存空間除了在每個頁面地址連續(xù)之外,每個頁面之間不再連續(xù)。第一是實現(xiàn)了存中碎片的減少,因為任意碎片都會小于一個頁面。第二是實現(xiàn)了由連續(xù)存儲到非連續(xù)存儲的

4、這個飛躍,為在存中局部地、動態(tài)地存儲那些反復(fù)執(zhí)行或即將執(zhí)行的程序和數(shù)據(jù)段打下了基礎(chǔ)。怎樣由頁式虛擬地址轉(zhuǎn)變?yōu)榇骓撁嫖锢淼刂罚宽撌焦芾戆秧撌教摂M地址與存頁面物理地址建立一一對應(yīng)頁表,并用相應(yīng)的硬件地址變換機構(gòu),來解決離散地址變換問題。靜態(tài)頁面管理:靜態(tài)頁面管理方法是在作業(yè)或進程開始執(zhí)行之前,把該作業(yè)或進程的程序段和數(shù)據(jù)全部裝入存的各個頁面,并通過頁表和硬件地址變換機構(gòu)實現(xiàn)虛擬地址到存物理地址的地址映射。1、存頁面的分配與回收靜態(tài)分頁管理的第一步是為要求存的作業(yè)或進程分配足夠的頁面。系統(tǒng)依靠存儲頁面表、請求頁面表以及頁表來完成存的分配。(1)頁表最簡單的頁表由頁號與頁面號組成,頁表在存中占有一塊固

5、定的存儲區(qū)。頁表的大小有進程或作業(yè)的長度決定。每個進程至少要擁有一個頁表。(2)請求表用來確定作業(yè)或進程的虛擬空間的各頁在存中的實際對應(yīng)位置。系統(tǒng)必須知道每個作業(yè)或進程的頁表起始地址和長度,以進行存的分配和地址變換,另外請求表中還應(yīng)包括每個作業(yè)或進程所要求的頁面數(shù)。(3)存儲頁面存儲頁面表也是整個系統(tǒng)一,存儲頁面表指出存各個頁面是否已被分配出去,以及未被分配頁面總數(shù)。存儲頁面表也有兩種構(gòu)成方法,一種是在存中劃分一塊固定區(qū)域,每個單元的每個比特代表一個頁面,如果該頁面已被分配,則對應(yīng)比特位置置1,否則置0。另一種方法空閑頁面鏈,不占存空間。2、分配算法3、地址變換在程序執(zhí)行過程中,執(zhí)行的是虛擬空

6、間中的代碼,代碼中的指令是相對于虛擬空間的,需要到存的實際空間中尋找對應(yīng)的要執(zhí)行的指令。靜態(tài)頁式管理的缺陷:雖然解決了分區(qū)管理時的碎片問題,但是由于靜態(tài)頁式管理要求進程或作業(yè)在執(zhí)行前全部裝入存,如果可用頁面數(shù)小于用戶要求時,改作業(yè)或進程只好等待。而且,作業(yè)或進程的大小仍受存可用空間的限制。動態(tài)頁式管理:動態(tài)頁式管理是在靜態(tài)頁式管理的基礎(chǔ)上發(fā)展起來的。它分為請求頁式管理和與調(diào)入頁式管理(調(diào)入方式上)。請求頁式管理和預(yù)調(diào)入頁式管理在作業(yè)或進程開始執(zhí)行之前都不把作業(yè)或進程的程序段和數(shù)據(jù)段一次性的調(diào)入存,而是只裝入被認為是經(jīng)常反復(fù)執(zhí)行和調(diào)用的工作區(qū)部分。其他部分都在執(zhí)行過程中動態(tài)的裝入。請求式頁式管理

7、:當(dāng)需要執(zhí)行某條指令或某些數(shù)據(jù)時而又發(fā)現(xiàn)他不在存中時,從而發(fā)生缺頁中斷,系統(tǒng)將相應(yīng)的頁面調(diào)入存。預(yù)調(diào)入:系統(tǒng)對于那些在外存中的頁進行調(diào)入順序計算,估計出這些頁中指令和數(shù)據(jù)的執(zhí)行和被訪問的順序,并按此順序?qū)⑺麄冺槾握{(diào)入和調(diào)出存。請求頁式管理的地址變換與靜態(tài)頁式相同,也是通過頁表查出相應(yīng)的頁面號,由頁面號與頁相對地址相加而得到實際物理地址。由于只有進程或程序的部分存在存中因此怎樣發(fā)現(xiàn)這些不在存中的虛頁以及怎樣處理這種情況是必須解決的兩個基本問題。怎樣發(fā)現(xiàn)這些不在存中的虛頁:擴充頁表的方法。即與每個虛頁號相對應(yīng),除了頁面號之外,再增設(shè)該頁是否在存中的中斷位以及該頁在外存中的副本起始地址。(1)采用何

8、種方法將所缺的頁調(diào)入存。(2)如果存中沒有空閑頁面時,把調(diào)進來的頁面放在什么地方。即采用什么策略淘汰已占據(jù)存的頁。還有就是如果存中的也被淘汰,但該頁被修改過,顯然該頁應(yīng)當(dāng)被重新寫到外存加以保存。所以還要增加一項記錄是否該頁已經(jīng)被改變。常見的置換算法:(1)隨機淘汰(2)輪轉(zhuǎn)法和先進先出法(3)最近最久未使用存保護:頁式管理提供兩種方式的存保護:一是:地址越界保護。二是:通過頁表控制對存信息的存取操作方式以提供保護。地址越界保護:由地址變換機構(gòu)中的控制存儲器的值頁表長度和所要訪問的虛地址相比較來完成。存取控制保護的實現(xiàn)則是在頁表中增加相應(yīng)的保護位即可。段式管理:分區(qū)式管理和頁式管理時的進程的地址

9、空間結(jié)構(gòu)都是線性的,這要求對源程序進行編譯連接時,把源程序中的主程序、子程序、數(shù)據(jù)區(qū)等按線性空間的一維地址順序排列起來。共享子程序和數(shù)據(jù)變得很困難,再者從的角度來看,分區(qū)管理和頁式管理只能采用靜態(tài)。段式存儲管理是基于為用戶提供一個方便的靈活的程序設(shè)計環(huán)境而提出來的。段式管理的基本思想是:把程序按容或過程(函數(shù))關(guān)系分成段,每段都有自己的名字。一個用戶進程或作業(yè)所包含的段對應(yīng)于一個二維線性虛擬空間,也就是二維虛擬存儲器。段式管理程序以段為單位分配存,然后通過地址映射機構(gòu)把段式虛擬地址轉(zhuǎn)換成實際的存物理地址。和頁式管理一樣,段式管理也采用只把那些經(jīng)常訪問的段駐留存,而把那些在將來一段時間不被訪問的

10、段放在外存,待需要時自動調(diào)入的方法實現(xiàn)二維虛擬存儲器。段式管理把一個進程的虛擬空間設(shè)計成二維結(jié)構(gòu),即段號s與段相對地址w。與頁式管理不一樣的是,頁式管理中,被劃分的頁號按順序編號遞增排列,屬一維空間,而段式管理中段號與段號之間無順序關(guān)系。另外段的劃分也不像頁的劃分那樣具有相同的頁長,段的長度是不固定的。每個段定義一組邏輯上完整的程序或數(shù)據(jù)。例如,一個進程中的程序和數(shù)據(jù)可劃分為主程序段、子程序段、數(shù)據(jù)段與工作區(qū)段。每個段是一個首地址為零的、連續(xù)的一維線性空間。根據(jù)需要段長可以動態(tài)的增長。對端式虛擬空間地址的訪問包括兩個部分:段名和段地址。段式管理中以端為單位分配存,每段分配一個連續(xù)的存區(qū),由于各

11、段長度不等,所以這些存儲區(qū)的大小不一,而且統(tǒng)一進程所包含的各段之間不要求連續(xù)。段式管理的存分配與釋放在作業(yè)或進程的執(zhí)行過程中動態(tài)進行。首先,段式管理程序為一個準(zhǔn)備進入存準(zhǔn)備執(zhí)行的進程或作業(yè)分配部分存,以作為該進程的工作區(qū)和放置即將執(zhí)行的程序段。隨著進程的執(zhí)行,進程根據(jù)需要隨時申請調(diào)入新段和釋放老段。進程對于存區(qū)的申請和釋放可分為兩種情況。一種是當(dāng)進程要求調(diào)入某一段時,存中有足夠的空閑區(qū)滿足該段的存要求。另一種是存中沒有足夠的空閑區(qū)。對于第一種情況,系統(tǒng)要用相應(yīng)的表格或數(shù)據(jù)結(jié)構(gòu)來管理存空閑區(qū),以便對用戶進程或作業(yè)的有關(guān)程序段進行存分配和回收。事實上,可以采用和動態(tài)分區(qū)式管理相同的空閑區(qū)管理方式。

12、即把存各空閑區(qū)按物理地址從低到高排列或按空閑區(qū)的大小從小到大或從大到小排列。與這幾種空閑區(qū)自由鏈相對應(yīng),分區(qū)式管理時所用的幾種分配算法:最先適應(yīng)算法、最佳適應(yīng)算法、最壞適應(yīng)法都可以用來進行空閑區(qū)分配。當(dāng)然分區(qū)式存管理時用到的存回收方法也可以用在段式管理中。另一種存管理的分配與回收方法是在存中沒有足夠的空閑區(qū)滿足調(diào)入段的存時使用的。這時段式管理程序根據(jù)給定的置換算法淘汰存中在今后一段時間不再被CPU訪問的段,也就是淘汰那些訪問率最低的段。不過任何一個段的長度都不允許超過存的可用區(qū)長度。除了段的初始分配之外,段的動態(tài)分配是在CPU所要訪問的指令和數(shù)據(jù)不在存時產(chǎn)生缺頁中斷的情況下發(fā)生的。因此段的淘汰

13、或置換算法實際上是缺頁中斷處理過程的一部分。段式管理的地址變換:由于段式管理只存放部分用戶信息副本在存,而大部分信息在外存中,這必然引起CPU訪問存時發(fā)成所訪問的段不在存中的情況,CPU如何感知所要訪問的段不在存中而啟動中斷處理程序呢?還有,段式虛擬地址屬于一個二維的虛擬空間。一個二維空間虛擬地址怎樣變?yōu)橐粋€一維的線性物理地址呢。(1)段表(2)段式管理程序在進行初始存分配之前,首先根據(jù)用戶要求的存大小為一個作業(yè)或一個進程建立一個段表,以實現(xiàn)動態(tài)地址變換和缺頁中斷處理及存儲保護等。段式管理是通過段表來進行存管理的。(3)段號與用戶指定的段名一一對應(yīng),始址和長度分別表示該段在存或外存的物理地址和

14、實際長度。存取方式是用來對該段進行存取保護的。只有處理機狀態(tài)字中的存取控制位與段表中的存取方式一致時才能訪問該段。外欄是指該段現(xiàn)在存儲在外存還是存中。如果如果該欄目指出所訪問段在外存的話,則發(fā)生缺頁中斷。而訪問位則是根據(jù)淘汰算法的需要而設(shè)的。(4)(5)動態(tài)地址變換一般在存中給出一塊固定的區(qū)域放置段表。當(dāng)某進程開始執(zhí)行的時候,管理程序首先把該進程的段表始址放入段表地址寄存器。通過訪問段表寄存器,管理程序得到該進程段表始址從而可以開始訪問段表。然后由虛擬地址中的段號s為索引,查段表。若該段在存中,則判斷其存取方式是否有錯。如果存取方式正確,則從段表相應(yīng)表目中查出該段在存中的起始地址,并將其和段相

15、對地址w相加,從而得到實際存地址。如果該段不在存,則產(chǎn)生缺頁中斷將CPU控制權(quán)交給存分配程序。存分配程序首先檢查空閑區(qū)鏈,以找到足夠長度的空閑區(qū)來裝入所需要的段。如果可用的空閑區(qū)總數(shù)小于所要求的段長,檢查段表中的訪問位,以淘汰那些訪問概率低的段并將所需要的段調(diào)入。段頁式:頁式管理和段式管理各有特長。段式管理為用戶提供了一個二維的虛擬空間地址,反映了程序的邏輯結(jié)構(gòu)有利于段的動態(tài)增長以及共享和存保護,方便了用戶,而分頁式管理則有效地克服了碎片問題,提高了存儲器的利用率。段頁式則是將段式管理與頁式管理相結(jié)合,取長補短。段頁式管理一般只用在大型系統(tǒng)中。段頁式管理的實現(xiàn)原理:一個進程任然擁有一個自己的二

16、維空間地址,這與段式管理相同。首先一個進程中所包含的具有獨立邏輯功能的程序或數(shù)據(jù)仍被劃分為段,并有各自段號S。這反映了段式管理的特征。其次,對于段S中的程序或數(shù)據(jù),則按照一定的大小將其劃分為不同的頁。和頁式系統(tǒng)一樣最后不足一頁的部分仍然占一頁。這反映了頁式特征。從而段頁式管理時的進程的虛擬空間中的虛擬地址由三部分組成即段號S,頁號p和頁相對地址d,如圖1所示:WSPd圖1程序員可見的仍是段號S和段相對地址wP和d是由地址變換機構(gòu)把w高幾位解釋成頁號P,以及把剩下的低位解釋成頁地址d。由于虛擬空間的最小單位是頁而不是段,從而存可用區(qū)也就被劃分為若干個大小相等的頁面,且每段所擁有的程序和數(shù)據(jù)在存中

17、可以分開存放。分段的大小也不受存可用區(qū)的限制。段表和頁表:為了實現(xiàn)段頁式管理,系統(tǒng)必須為每個作業(yè)或進程建立一段表,管理存分配與釋放、缺段處理、存儲保護和地址變換等。另外,由于一個段又被劃分成了若干頁,每個段又必須建立一頁表,把段中虛頁轉(zhuǎn)變成存中的實際頁面。顯然與頁式管理相同,頁表中也要有實現(xiàn)缺頁中斷處理和頁面保護等功能的表項。另外由于在段頁式管理中,頁表不再是屬于進程而是屬于某個段,因此段表中應(yīng)該有指出該段所對應(yīng)的頁表始址和頁表長度。動態(tài)地址變換過程:在一般使用段頁式存儲管理的計算機系統(tǒng)中,都在存中辟出一塊固定的區(qū)域存放進程的段表和頁表。因此,在段頁式管理系統(tǒng)中,要對存中指令或數(shù)據(jù)進行一次存取

18、的話,至少需要訪問3次以上的存。二、功能設(shè)計定義一個數(shù)組來表示一個存空間。只做一個數(shù)組來管理存空間,應(yīng)當(dāng)能夠顯示當(dāng)前可用的存,管理存的表應(yīng)當(dāng)占據(jù)空間最小,由于是段頁式管理,所以將存劃分為頁,最理想的方式是用一位來表示存的一個頁面,當(dāng)存頁面在使用時,將其置為1,不使用時,將其置為0,這樣存管理所占用的空間才是最小。由于使用位來管理存空間頁面在程序的處理方面比較麻煩,所以采用char類型來表示存空間的一個頁面,char類型只占一個字節(jié),并且存空間的大小是定長的。所以可用存表即為:charmmemMax;/memMax表示最大的存空間設(shè)計一段表結(jié)構(gòu)體數(shù)組,由于在存空間中段表通常都是存放在存的一塊固定

19、的區(qū)域,所以段表很適合用結(jié)構(gòu)體數(shù)組來表示段式管理的段表:段號始址長度存取方式外訪問位所以將段頁是管理中的段表也這樣類似設(shè)計,只不過要再加一個字段表示該段所管理的頁表的起始地址,設(shè)計如下:段號始址頁表長度存取方式外訪問位頁表始址tsegmentL/段表intsegNum;/段號intlength;/段長,即多少頁intrw;/訪存控制intioflg;/外標(biāo)識符intcount;/訪問位pageL*startAddr;頁表起始位置,pageL*:頁表類型的指針intsegmentFlag;設(shè)計頁表(結(jié)構(gòu)體數(shù)組)在設(shè)計段頁式管理的頁表的時候,他跟頁式管理的頁表很相近,頁表也是在存空間中劃分一塊固定

20、的區(qū)域,所以頁表的設(shè)計和段表有些類似,但是要簡單許多,只要顯示頁號和頁面號即可。但是有一點區(qū)別就是,段表在存中的存放順序是非連續(xù)的、隨機的,但是頁表不同,每一個段所對應(yīng)的頁表,在存中應(yīng)當(dāng)是連續(xù)的,任意兩段所對應(yīng)的頁表的順序是非連續(xù)的。頁式管理的頁表:頁號頁面號段頁式管理的頁表:頁號頁面號頁面使用標(biāo)識符typedefstructtypedefstructpageL/頁表typedefstructtypedefstructpageL/頁表wordword專業(yè)資料wordword專業(yè)資料intpageNum;/頁號intMemPgnum;/頁面號intpageFlag;/頁表標(biāo)識符用來標(biāo)識該存是否在

21、使用中pageL;段表和頁表之間通過段表中的一個叫startAddr的指針進行聯(lián)系,每個段的這個指針指向該段所建立的頁表,而頁表由通過它的頁面號與存聯(lián)系。他們之間相互關(guān)聯(lián)。段表和頁表在存中都是線性結(jié)構(gòu),他們的大小有固定的限制,所以在段表或者頁表被填滿的時候,要調(diào)度一定的算法進行對頁表和者段表和存頁的置換。頁表的控制要稍微復(fù)雜一些,因為每一個段都對應(yīng)這一頁表,并且頁表的每一項都是連續(xù)的,還有就是頁表的長度是由程序的長度來決定的,而且所有的頁表在一起組成了一大頁表。段表、頁表、存之間的關(guān)系圖,如圖2:段表地址寄社:器段表長度起始地址段號苴他頁表荃度段表、頁表、存之間的關(guān)系圖,如圖2:段表地址寄社:

22、器段表長度起始地址段號苴他頁表荃度起鵡地址051024171029291036段表頁號苴他頁面11221932148510頁號其他蟲面1293第2段蟲表圖2三、開發(fā)平臺及源程序的主要部分:本次設(shè)計采用C+混合C語言編程,采用VisualStudio2010作為開發(fā)平臺。intlength;intlength;/段長,即多少頁wordword專業(yè)資料wordword專業(yè)資料源碼如下:#include#include#include#definememMax10240;最大存,10Musingnamespacestd;voidprspm();/*一般在存中給出一塊固定的區(qū)域放置段表*/intmem

23、Len;/存大小intpageLen;頁的大小typedefstructpageL/頁表intpageNum;/頁號intMemPgnum;/頁面號(存頁面號)intpageFlag;pageL;structpageLHintlength;pageLpageList1024;pageLH;structsegmentL/段的大小與劃分不歸我管,而且段表的大小是一開始就建立好的,頁表在存中有一塊固定的存儲區(qū)。頁表的大小由進程或作業(yè)的長度決定intsegNum;/段號/訪存控制intrw;/訪存控制intioflg;/外標(biāo)識intioflg;/外標(biāo)識intcount;/訪問位intcount;/訪問

24、位pageL*startAddr;/起始位置pageL*startAddr;/起始位置;intsegmentFlag;/段表,因為段表是固定的存區(qū),所以直接設(shè)為數(shù)組。segPagList100;structsegmentLHintlength;segmentLsegPagList200;段表,因為段表是固定的存區(qū),所以直接設(shè)為數(shù)組。200差不多了1024頁,每段5頁segmentLH;charm10240;無法使用鏈表法,char類型是一個字節(jié),節(jié)省空間,值表示頁是否被使用。intfindIdlePage()/返回找到空閑存頁的第一個位置intj=1;for(inti=0;imemLen*10

25、24/pageLen;i+)if(mi=0)mi=1;returni;j+;if(j=memLen*1024/pageLen)printf(所有的存已經(jīng)使用完了!請輸入數(shù)字已選擇相應(yīng)的置換算法!);inttotalIdlePage()intn=0;for(inti=0;imemLen*1024/pageLen;i+)if(mi=0)n+;returnn;intfindIdleSegAndWrite(intsegNum,intsegLen)inti;for(i=0;i200;i+)if(segmentLH.segPagListi.segmentFlag=0)segmentLH.segPagLis

26、ti.segNum=segNum;segmentLH.segPagListi.length=segLen;/段長,即分多少頁segmentLH.segPagListi.segmentFlag=1;wordword專業(yè)資料wordword專業(yè)資料returni;printf(段表沒有可以填寫的段!);return-1;/沒有可以填寫的段就返回-1intfindSeriesIdlePageList(intq)參數(shù)q表示需要連續(xù)空間的頁數(shù)返回值為分配數(shù)組起始標(biāo)號。intt,n=0;L1:for(t=0;tq;t+)if(pageLH.pageListn+t.pageFlag!=0)n+;if(n10

27、24-q)gotoL1;printf(沒有可用的連續(xù)頁表空間!”);for(t=0;tq;t+)/將已分配到的頁表,標(biāo)記為正在使用pageLH.pageListt+n.pageFlag=1;returnn;voidsingle()/怎樣判斷存區(qū)有沒有空閑intflag=1;intq=0;intN=0;intp;intsegNum,length;printf(請輸入要輸入的段的個數(shù):n);scanf(%d,&N);printf(請依次輸入段長:n);for(intz=1;z=q)/存夠分inti=findIdleSegAndWrite(z,q);/找到可以填寫的段,填寫段長,段號intn二fin

28、dSeriesIdlePageList(q);查找頁表尋找連續(xù)q個頁表空間,返回首地址p=p-q;在上面的函數(shù)中已經(jīng)將頁面數(shù)減過了,只是沒有反映到p中segmentLH.segPagListi.startAddr=&pageLH.pageListn;/填寫段的頁的開始地址,頁表的第n項for(intj=n;jq+n;j+)/填寫頁表的時候,頁表的填寫是連for(intj=n;j=q)/存夠分/inti=findIdleSegAndWrite(segNum,q);/找到可以填寫的段,填寫段長,段號/intn二findSeriesIdlePageList(q);查找頁表尋找連續(xù)q個頁表空間,返回首

29、地址/p=p-q;在上面的函數(shù)中已經(jīng)將頁面數(shù)減過了,只是沒有反映到p中/segmentLH.segPagListi.startAddr=&pageLH.pageListn;/填寫段的頁的開始地址,頁表的第n項/for(intj=n;jq+n;j+)/填寫頁表的時候,頁表的填寫是連續(xù)的/pageLH.pageListj.pageNum=j-n+1;/pageLH.pageListj.MemPgnum二findIdlePage();返回找到空閑存頁的第一個位置,并將使用位置1/printf(程序要分頁:dn,q);/printf(存可用頁:%dn,p);/printf(是否退出(1-繼續(xù)0-退出)

30、;/getchar();/scanf(%d,&flag);/*for(inti=0;ipageLH.length;i+)printf(%dprintf(%d-%dn,pageLH.pageListi.pageNum,pageLH.pageListi.MemPgnuprintf(%dprintf(%d-%dn,pageLH.pageListi.pageNum,pageLH.pageListi.MemPgnuwordword專業(yè)資料wordword專業(yè)資料m);*/voidmapping()ints,p,d;inti;printf(請輸入段號,頁號,頁地址:s,p,dn);scanf(%d,%d,

31、%d,&s,&p,&d);for(i=0;ip)if(d=100)printf(沒有該段!n);voidswch()intflag=1,f=0;while(flag)intn;printf(0退出0n);printf(1程序段處理1n);printf(2地址轉(zhuǎn)換2n);printf(3-顯示段頁存映射表3n);getchar();scanf(%d,&n);switch(n)case0:flag=0;break;wordword專業(yè)資料wordword專業(yè)資料case1:single();f=1;break;case2:if(f!=0)mapping();elseprintf(請先輸入程序段!n

32、);break;case3:if(f!=0)prspm();elseprintf(請先輸入程序段!n);break;default:printf(輸入有誤!n);voidprspm()printf(段頁存映射表n);printf(n);for(inti=0;i200;i+)if(segmentLH.segPagListi.segmentFlag!=0)printf(%d,segmentLH.segPagListi.segNum);/段號printf(dnsegmentLH.segPagListi.length);/段長for(intj=0;jsegmentLH.segPagListi.leng

33、th;j+)/*頁號*頁面號*/printf(|%d%dn,segmentLH.segPagListi.startAddrj.pageNum,segmentLH.segPagListi.startAddrj.MemPgnum);printf(n);wordword專業(yè)資料wordword專業(yè)資料printf(n);intmain()printf(現(xiàn)在進行初始化設(shè)置。n);printf(請指定存的大小(MB):);scanf(%d,&memLen);printf(請設(shè)置頁的大小(KB):);一般來講1-4KBscanf(%d,&pageLen);for(inti=O;imemLen;i+)/初始

34、化存列表mi=0;pageLH.length=0;for(inti=0;i200;i+)segmentLH.segPagListi.segmentFlag=0;for(inti=0;i1024;i+)pageLH.pageListi.pageFlag=0;swch();/*for(inti=0;i1024;i+)if(pageLH.pageListi.pageFlag!=0)wordword專業(yè)資料wordword專業(yè)資料printf(%d,i);printf(頁號:%d”,pageLH.pageListi.pageNum);printf(頁面號:%dn,pageLH.pageListi.Me

35、mPgnum);*/*for(inti=0;imemMax;i+)if(mi!=0)printf(存:%d:%dn,i,mi);*/system(pause);return0;初始界面如下圖:1、可以指定存大小,頁面大小一般頁面大小為1-4KB左右,然后根據(jù)需要輸入選項。選擇選項1,就會提示需要輸入的段數(shù),然后依次輸入段長。輸入完成之后就會再次提示所需的操作。但是一開始只能選擇0,或者1。因為沒有程序段就沒有地址轉(zhuǎn)換,同樣也沒有段頁存映射表。如果一開始就輸入了2或者3,就會提示重新輸入。2、選擇選項2,就會提示要轉(zhuǎn)換的段頁表,按要求輸入之后,就會計算出存實際地址,如果出錯就會提示相應(yīng)的出錯原因

36、。當(dāng)輸入不存在的段時,程序就會提示不存在該段。并重新返回菜單頁面,如上圖。當(dāng)輸入段不存在的頁時,就會有提示說沒有該頁,再次轉(zhuǎn)入菜單頁面,如上圖。當(dāng)輸入某一段某頁的偏移地址超出了頁的圍時,就會有提示說偏移地址偏出該頁,并重新返回菜單頁面,如上圖。3、當(dāng)選擇選項3時,該程序就會打印段頁存映射表,這個段頁存映射是采用樹結(jié)構(gòu)來顯示的,如下圖?;?0.7BE:VisualStudi顯示的,如下圖。回.0.7BE:VisualStudio2010Win32ConsoIeAppsegpagMDebugsegpagM.exe段頁內(nèi)存日庶寸羔J靈II一材程序段處理1第一列的數(shù)字代表段號,段號后面的數(shù)字表示該段有

37、多少頁。段的下面的第一列數(shù)字表示該段的頁表的頁號,而頁號后面的數(shù)字代表存的頁面號??傮w來說我覺得比較優(yōu)秀出彩的地方是段表和頁表的設(shè)計方面,我覺得段表和頁表的設(shè)計是在給定條件下最完美的實現(xiàn)。采用劃分固定的區(qū)域來設(shè)置段頁表,是一個很好的方法,因為如果設(shè)置鏈表的話,雖然會節(jié)省一部分的存空間,但是采用鏈表的話,就會產(chǎn)生一個很明顯的鏈表的固有缺陷,就是不能夠隨機存取,存取速度就會大打折扣,對于操作系統(tǒng)來說是致命的缺陷。但是采用結(jié)構(gòu)體數(shù)組的話,這個問題就不會存在了,但是會有數(shù)組上的固有缺陷,就是數(shù)組的大小固定,沒有辦法動態(tài)的增加,這樣就可能會浪費一定的存空間。在權(quán)衡取舍的時候,還是決定使用結(jié)構(gòu)體數(shù)組來表示

38、段表和頁表還有存空間,這樣可以獲得較高的訪問速度,這對操作系統(tǒng)來說是相當(dāng)重要的。所以選擇了固定長度的段表和頁表。還有一點就是在頁表的設(shè)計時候采用的一種方法,段頁式管理中的頁表要求每一個段都有一個長度由段表指定的順序存儲的頁表,再設(shè)計的時候需要認真考慮,由于每個頁表的長度可變,一開始想到的是采用鏈表,但是鏈表不是順序存儲的,所以不行。但是數(shù)組長度又不可變。最終方案還是采用數(shù)組,只要活用指針就能夠達到像是變長數(shù)組的效果,并且方法相當(dāng)?shù)暮唵?。首先先設(shè)置一個總的頁表,用來裝載每一段的頁表,在對每段進行頁表的設(shè)計的時候,在總頁表中尋找連續(xù)的空閑的頁表空間,將這個頁表分配之后,返回這個頁表的數(shù)組的首地址,保存在段表的始址這個變量中。這樣就相當(dāng)于每個頁表都是變長的,只是總頁表是定長的,正好符合要求,我覺得這樣是一個很好的設(shè)計。最后在最后的輸出上,我覺得我的設(shè)計方案很不錯,就是有一個樹狀結(jié)構(gòu)的段頁存映射圖。最后的結(jié)果清晰直觀,效果很不錯。不好的地方:存管理方面不夠節(jié)約,在存管理的時候我采用的是使用char數(shù)組,使用個字符來管理一個頁面是否是在使用中,即用8bit來表示一個頁面

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論