本質(zhì)上是一種內(nèi)存的劃分方法
分頁(yè)存儲(chǔ)管理
這種方式中牡整,將用戶程序的地址空間,注意疼约,是用戶程序的地址空間分為若干個(gè)固定大小的區(qū)域卤档,成為“頁(yè)”或“頁(yè)面”。我們可以知道程剥,這也頁(yè)其實(shí)是不存在的劝枣,只是一種劃分內(nèi)存空間的方法。也就是說织鲸,這種方式將用戶的程序“肢解”了舔腾,分成很多個(gè)小的部分,每個(gè)部分稱為一個(gè)“頁(yè)”搂擦。
邏輯地址
將邏輯地址的前n位作為頁(yè)號(hào)稳诚,后面32-n位作為頁(yè)內(nèi)偏移量。
頁(yè)內(nèi)碎片
由于進(jìn)程的最后一頁(yè)經(jīng)常裝不滿一個(gè)塊瀑踢,從而形成了不可利用的碎片扳还,稱之為“頁(yè)內(nèi)碎片”。
頁(yè)表
作用:實(shí)現(xiàn)頁(yè)號(hào)到物理號(hào)的地址映射橱夭。
頁(yè)表是記錄邏輯空間(虛擬內(nèi)存)中每一頁(yè)在內(nèi)存中對(duì)應(yīng)的物理塊號(hào)氨距。但并非每一頁(yè)邏輯空間都會(huì)實(shí)際對(duì)應(yīng)著一個(gè)物理塊,只有實(shí)際駐留在物理內(nèi)存空間中的頁(yè)才會(huì)對(duì)應(yīng)著物理塊棘劣。
系統(tǒng)會(huì)為每一個(gè)進(jìn)程建立一張頁(yè)表俏让,頁(yè)表是需要一直駐留在物理內(nèi)存中的(多級(jí)頁(yè)表除外),另外頁(yè)表的起址和長(zhǎng)度存放在 PCB(Process Control Block)進(jìn)程控制結(jié)構(gòu)體中茬暇。
可以在頁(yè)表的表項(xiàng)中設(shè)置相關(guān)的權(quán)限控制字段首昔,例如設(shè)置存取控制字段,用于保護(hù)該存儲(chǔ)塊的讀寫糙俗;若存取控制字段為2位沙廉,則可以設(shè)置讀/寫、只讀和只執(zhí)行等存取方式臼节。
物理塊
物理塊是實(shí)實(shí)在在存在于內(nèi)存中的:
地址變換機(jī)構(gòu)
由于執(zhí)行頻率高,要求效率比較高,需要使用硬件實(shí)現(xiàn)网缝。
在系統(tǒng)中設(shè)置一個(gè)頁(yè)表寄存器(PTR),其中存放頁(yè)表在內(nèi)存的起始地址和頁(yè)表的長(zhǎng)度巨税。平時(shí)進(jìn)程未執(zhí)行的時(shí)候,頁(yè)表的起始地址和頁(yè)表長(zhǎng)度放在本進(jìn)程的PCB中粉臊。當(dāng)調(diào)度程序調(diào)度到某個(gè)進(jìn)程的時(shí)候草添,才將這兩個(gè)數(shù)據(jù)裝入頁(yè)表寄存器。
注意扼仲,當(dāng)創(chuàng)建一個(gè)進(jìn)程的時(shí)候远寸,它的頁(yè)表也同時(shí)創(chuàng)建了,只不過只在PCB存儲(chǔ)了頁(yè)表的起始地址和長(zhǎng)度屠凶。
變換過程:
- 進(jìn)程訪問某個(gè)邏輯地址時(shí)驰后,分頁(yè)地址機(jī)構(gòu)自動(dòng)將邏輯地址分為頁(yè)號(hào)和頁(yè)內(nèi)地址
- 頁(yè)號(hào)大于頁(yè)表長(zhǎng)度,越界錯(cuò)誤;否則繼續(xù)下面的步驟
- 頁(yè)表項(xiàng)的地址 p = 頁(yè)表起始地址 F + 頁(yè)號(hào) P * 表項(xiàng)大小 S矗愧,從而得到對(duì)應(yīng)的物理塊號(hào) B
- 頁(yè)和物理塊的大小是一致的灶芝,所以 頁(yè)內(nèi)地址=塊內(nèi)地址
- 然后 物理地址 = 物理塊號(hào) B * 頁(yè)大小 L + 頁(yè)內(nèi)地址
- 根據(jù)物理地址讀取數(shù)據(jù)
快表的變換機(jī)構(gòu)
基礎(chǔ)的地址變換機(jī)構(gòu)的缺點(diǎn):
由于頁(yè)表是存放在內(nèi)存中的,這使得CPU在每存取一個(gè)數(shù)據(jù)時(shí)唉韭,都需要兩次訪問內(nèi)存夜涕。第一次時(shí)訪問內(nèi)存中的頁(yè)表,獲取物理塊號(hào)属愤,于偏移值拼接得到物理地址女器,第二次是從第一次所得物理地址獲取所需數(shù)據(jù)(或者向該地址寫入數(shù)據(jù))。這樣計(jì)算機(jī)的處理速度幾乎降低了1/2住诸;
為了提高地址變換速度驾胆,可在地址變換機(jī)構(gòu)中增設(shè)一個(gè)具有并行查詢能力的特殊高速緩沖寄存器,又稱為"聯(lián)想寄存器"或者“快表”只壳。俗稱TLB俏拱。
快表與頁(yè)表的功能類似,其實(shí)就是將一部分頁(yè)表存到 CPU 內(nèi)部的高速緩沖存儲(chǔ)器 Cache吼句。CPU 尋址時(shí)先到快表查詢相應(yīng)的頁(yè)表項(xiàng)形成物理地址锅必,如果查詢不到,則到內(nèi)存中查詢惕艳,并將對(duì)應(yīng)頁(yè)表項(xiàng)調(diào)入到快表中搞隐。但,如果快表的存儲(chǔ)空間已滿远搪,則需要通過算法找到一個(gè)暫時(shí)不再需要的頁(yè)表項(xiàng),將它換出內(nèi)存谁鳍。
由于成本的關(guān)系癞季,快表不可能做得很大劫瞳,通常只存放 16~512 個(gè)頁(yè)表項(xiàng),這對(duì)中绷柒、小型作業(yè)來說志于,已有可能把全部頁(yè)表項(xiàng)放在快表中;但對(duì)于大型作業(yè)而言废睦,則只能將其一部分頁(yè)表項(xiàng)放入其中伺绽。由于對(duì)程序和數(shù)據(jù)的訪問往往帶有局限性,因此嗜湃,據(jù)統(tǒng)計(jì)奈应,從快表中能找到所需頁(yè)表項(xiàng)的概率可達(dá) 90% 以上。這樣购披,由于增加了地址變換機(jī)構(gòu)而造成的速度損失可減少到 10% 以下杖挣,達(dá)到了可接受的程度。
兩級(jí)頁(yè)表
一級(jí)頁(yè)表的缺陷:由于頁(yè)表必須連續(xù)存放今瀑,并且需要常駐物理內(nèi)存程梦,當(dāng)邏輯地址空間很大時(shí),導(dǎo)致頁(yè)表占用內(nèi)存空間很大橘荠。
我們可以采用這樣兩個(gè)方法來解決這一問題:
① 對(duì)于頁(yè)表所需的內(nèi)存空間屿附,可采用離散分配方式,以解決難以找到一塊連續(xù)的大內(nèi)存空間的問題哥童;
② 只將當(dāng)前需要的部分頁(yè)表項(xiàng)調(diào)入內(nèi)存挺份,其余的頁(yè)表項(xiàng)仍駐留在磁盤上贮懈,需要時(shí)再調(diào)入。
二級(jí)頁(yè)表的頁(yè)表項(xiàng):
過程:
- 外層頁(yè)表寄存器中保存了外層頁(yè)表的始址朵你,根據(jù)外層頁(yè)號(hào)查找到內(nèi)層頁(yè)號(hào)。
- 找到指定頁(yè)表分頁(yè)的始址躲因,根據(jù)內(nèi)層頁(yè)號(hào)找到物理塊號(hào)。
- 物理塊號(hào)P和頁(yè)內(nèi)地址d組裝成一個(gè)實(shí)際的物理地址大脉。
在采用兩級(jí)頁(yè)表結(jié)構(gòu)的情況下水孩,對(duì)于正在運(yùn)行的進(jìn)程,必須將其外層頁(yè)表調(diào)入內(nèi)存俘种,而對(duì)于內(nèi)頁(yè)表則只需調(diào)入一頁(yè)或幾頁(yè)绝淡。為了表征某頁(yè)的頁(yè)表是否已經(jīng)調(diào)入內(nèi)存抛杨,還應(yīng)在外層頁(yè)表項(xiàng)中增設(shè)一個(gè)狀態(tài)位 S,其值若為 0怖现,表示該頁(yè)表分頁(yè)不在內(nèi)存中,否則說明其分頁(yè)已調(diào)入內(nèi)存玉罐。進(jìn)程運(yùn)行時(shí)屈嗤,地址變換機(jī)構(gòu)根據(jù)邏輯地址中的 P1去查找外層頁(yè)表;若所找到的頁(yè)表項(xiàng)中的狀態(tài)位為 0吊输,則產(chǎn)生一個(gè)中斷信號(hào)饶号,請(qǐng)求 OS 將該頁(yè)表分頁(yè)調(diào)入內(nèi)存。
多級(jí)頁(yè)表
多級(jí)頁(yè)表和二級(jí)頁(yè)表類似季蚂。多級(jí)頁(yè)表和二級(jí)頁(yè)表是為了節(jié)省物理內(nèi)存空間茫船。使得頁(yè)表可以在內(nèi)存中離散存儲(chǔ)。(單級(jí)頁(yè)表為了隨機(jī)訪問必須連續(xù)存儲(chǔ)扭屁,如果虛擬內(nèi)存空間很大算谈,就需要很多頁(yè)表項(xiàng),就需要很大的連續(xù)內(nèi)存空間料滥,但是多級(jí)頁(yè)表不需要然眼。)
分頁(yè)式管理很好的避免了外部碎片,但是還是存在內(nèi)部碎片葵腹,因?yàn)槌绦虼笮〔豢赡芸偸?的n次冪高每。多級(jí)頁(yè)表使得頁(yè)表數(shù)據(jù)可以不需要連續(xù)存儲(chǔ),即實(shí)現(xiàn)了頁(yè)表的離散式存儲(chǔ)践宴。并且在當(dāng)對(duì)應(yīng)程序運(yùn)行才將內(nèi)頁(yè)表數(shù)據(jù)調(diào)入內(nèi)存也減少了頁(yè)表所占用的內(nèi)存空間鲸匿。本質(zhì)上是提高內(nèi)存利用率。
分段存儲(chǔ)管理
為了滿足用戶要求的一種存儲(chǔ)管理的方式
為什么引入分段存儲(chǔ)管理阻肩?
- 通常的程序都可以分為若干個(gè)段带欢,如主程序段、子程序段A磺浙、子程序段B洪囤、...、數(shù)據(jù)段和棧段等等撕氧。
- 實(shí)現(xiàn)和滿足信息共享瘤缩、信息保護(hù)、動(dòng)態(tài)鏈接以及信息的動(dòng)態(tài)增長(zhǎng)
引入效果:
-
方便編程
使用符號(hào)作為段地址進(jìn)行使用伦泥。(每個(gè)段都是從 0 開始的獨(dú)立邏輯地址空間剥啤;)
-
信息共享
在實(shí)現(xiàn)對(duì)程序和數(shù)據(jù)的共享時(shí)府怯,是以信息的邏輯單位為基礎(chǔ)的。比如则涯,為了共享某個(gè)過程粟判、函數(shù)或文件档礁。分頁(yè)系統(tǒng)中的“頁(yè)”只是存放信息的物理單位(塊)呻澜,并無完整的邏輯意義羹幸,這樣睹欲,一個(gè)可被共享的過程往往可能需要占用數(shù)十個(gè)頁(yè)面窘疮,這為實(shí)現(xiàn)共享增加了困難闸衫。段可以是信息的邏輯單位蔚出,因此骄酗,我們可以為該被共享過程建立一個(gè)獨(dú)立的段趋翻,這就極大地簡(jiǎn)化了共享的實(shí)現(xiàn)踏烙。
-
信息保護(hù)
信息保護(hù)同樣是以信息的邏輯單位為基礎(chǔ)的,而且經(jīng)常是以一個(gè)過程辟癌、函數(shù)或文件為基本單位進(jìn)行保護(hù)的黍少。例如仍侥,我們希望函數(shù) A 僅允許進(jìn)程執(zhí)行,而不允許讀或颊,更不允許寫囱挑,那么平挑,我們只須在包含了函數(shù) A 的這個(gè)段上標(biāo)上只執(zhí)行標(biāo)志即可。但是在分頁(yè)系統(tǒng)中找都,函數(shù) A 可能要占用若干個(gè)頁(yè)面能耻,而且其中的第一個(gè)和最后一個(gè)頁(yè)面還會(huì)裝有其它程序段的數(shù)據(jù)饿幅,它們可能有著不同的保護(hù)屬性栗恩,如可以允許進(jìn)程讀寫摄凡,這樣就很難對(duì)這些頁(yè)面實(shí)施統(tǒng)一的保護(hù),因此钦扭,分段管理方式能更有效和方便地實(shí)現(xiàn)對(duì)信息的保護(hù)功能客情。
-
動(dòng)態(tài)增長(zhǎng)
在實(shí)際應(yīng)用中膀斋,往往存在著一些段仰担,尤其是數(shù)據(jù)段,在它們的使用過程中愉耙,由于數(shù)據(jù)量的不斷增加朴沿,而使數(shù)據(jù)段動(dòng)態(tài)增長(zhǎng)魏铅,相應(yīng)地它所需要的存儲(chǔ)空間也會(huì)動(dòng)態(tài)增加沦零。然而路操,對(duì)于數(shù)據(jù)段究竟會(huì)增長(zhǎng)到多大屯仗,事先又很難確切地知道魁袜。對(duì)此峰弹,很難采取預(yù)先多分配的方法進(jìn)行解決融师。前述的其它幾種存儲(chǔ)管理方式都難以應(yīng)付這種動(dòng)態(tài)增長(zhǎng)的情況旱爆,而分段存儲(chǔ)管理方式卻能較好地解決這一問題怀伦。
-
動(dòng)態(tài)鏈接
動(dòng)態(tài)鏈接在作業(yè)運(yùn)行之前房待,并不是把所有的目標(biāo)程序段都鏈接起來吴攒。當(dāng)程序要運(yùn)行時(shí),首先將主程序和它立即需要用到的目標(biāo)程序裝入內(nèi)存左驾,即啟動(dòng)運(yùn)行诡右。而在程序運(yùn)行過程中帆吻,當(dāng)需要調(diào)用某個(gè)目標(biāo)程序時(shí)猜煮,才將該段(目標(biāo)程序)調(diào)入內(nèi)存并進(jìn)行鏈接∈幸螅可見搞挣,動(dòng)態(tài)鏈接要求的是以目標(biāo)程序(即段)作為鏈接的基本單位,因此囱桨,分段存儲(chǔ)管理方式非常適合于動(dòng)態(tài)鏈接蝇摸。
它將用戶程序的地址空間分為若干個(gè)大小不同的的段貌夕,每個(gè)段可以定義一組完整的信息啡专。
分段地址
段號(hào)表示段名们童,每個(gè)段都從0開始編址慧库,并且采用一段連續(xù)的地址空間。
在該地址結(jié)構(gòu)中,允許一個(gè)作業(yè)最長(zhǎng)有64K個(gè)段橡羞,每個(gè)段的最大長(zhǎng)度為64KB济舆。
在分段式存儲(chǔ)管理系統(tǒng)中滋觉,為每一個(gè)分段分配一個(gè)連續(xù)的分區(qū)覆致。進(jìn)程的各個(gè)段肺蔚,可以離散地裝入內(nèi)存中不同的分區(qū)中。
段表
作用:實(shí)現(xiàn)從邏輯地址到物理內(nèi)存區(qū)的映射汰蜘。
為了保證程序能夠正常運(yùn)行族操,就必須能夠從物理內(nèi)存中找出每個(gè)邏輯段所對(duì)應(yīng)的位置色难。為此在系統(tǒng)中會(huì)為每一個(gè)進(jìn)程建立一張段表枷莉。每個(gè)段在表中有一個(gè)表項(xiàng)笤妙,其中記錄了該段在內(nèi)存中的起始地址和段的長(zhǎng)度蹲盘。一般將段表保存在內(nèi)存中召衔。
在配置了段表之后薄嫡,執(zhí)行的過程可以通過查找段表吩坝,找到每一個(gè)段所對(duì)應(yīng)的內(nèi)存區(qū)弧呐。
地址變換機(jī)構(gòu)
為了實(shí)現(xiàn)進(jìn)程從邏輯地址到物理地址的變換功能嵌纲,在系統(tǒng)設(shè)置了段表寄存器逮走,用于存放段表的起始地址和段表長(zhǎng)度TL。
在進(jìn)行地址變換時(shí)盾舌,系統(tǒng)將邏輯地址中的段號(hào)與段表長(zhǎng)度TL 進(jìn)行比較妖谴。若 S > TL膝舅,表示段號(hào)太大仍稀,是訪問越界琳轿,于是產(chǎn)生越界中斷信號(hào)。若未越界吧秕,則根據(jù)段表的始址和該段的段號(hào)颠毙,計(jì)算出該段對(duì)應(yīng)段表項(xiàng)的位置蛀蜜,從中讀出該段在內(nèi)存的起始地址滴某。然后霎奢,再檢查段內(nèi)地址 d 是否超過該段的段長(zhǎng) SL幕侠。若超過悼潭,即 d>SL女责,同樣發(fā)出越界中斷信號(hào)抵知。若未越界刷喜,則將該段的基址 d 與段內(nèi)地址相加掖疮,即可得到要訪問的內(nèi)存浊闪。
像分頁(yè)系統(tǒng)一樣,當(dāng)段表放在內(nèi)存中時(shí)螺戳,每要訪問一個(gè)數(shù)據(jù)搁宾,都須訪問兩次內(nèi)存,從而成倍地降低了計(jì)算機(jī)的速率倔幼。解決的方法和分頁(yè)系統(tǒng)類似盖腿,也增設(shè)一個(gè)聯(lián)相存儲(chǔ)器,用于保存最近常用的段表項(xiàng)损同。一般情況下翩腐,由于是段比頁(yè)大,因而段表項(xiàng)的數(shù)目比頁(yè)表項(xiàng)的數(shù)目少膏燃,其所需的聯(lián)想存儲(chǔ)器也相對(duì)較小,所以可以顯著地減少存取數(shù)據(jù)的時(shí)間,與沒有地址變換的常規(guī)存儲(chǔ)器相比而言霍比,其存取速度約慢 10%~15%。
段頁(yè)式存儲(chǔ)管理
分頁(yè)和分段的區(qū)別
分頁(yè)和分段系統(tǒng)相似之處:兩者都采用離散分配方式,且都是通過地址映射機(jī)構(gòu)實(shí)現(xiàn)地址變換摄欲。
但在概念上兩者完全不同,主要表現(xiàn)在下述三個(gè)方面:
- 頁(yè)是信息的物理單位,段是信息的邏輯單位补履。
- 頁(yè)的大小確定且又系統(tǒng)決定谚攒;段的長(zhǎng)度不固定括儒,決定于用戶所編寫的程序固逗。
- 分頁(yè)的用戶程序地址空間是一維的,只需要一個(gè)記憶符就能夠表示一個(gè)地址;分段的用戶程序地址空間是二維的,既需要段名,又需要段內(nèi)地址。
段頁(yè)式
分頁(yè)系統(tǒng)以頁(yè)面作為內(nèi)存分配的基本單位弥奸,能有效地提高內(nèi)存利用率期揪,而分段系統(tǒng)以段作為內(nèi)存分配的基本單位缤苫,它能夠更好地滿足用戶多方面的需要。
段頁(yè)式地址結(jié)構(gòu)
段頁(yè)式地址結(jié)構(gòu)由段號(hào)死陆、段內(nèi)頁(yè)號(hào)及頁(yè)內(nèi)地址三部分所組成
段頁(yè)式系統(tǒng)的基本原理是分段和分頁(yè)原理的結(jié)合塌衰,即先將用戶程序分成若干個(gè)段获诈,再把每個(gè)段分成若干個(gè)頁(yè),并為每一個(gè)段賦予一個(gè)段名价涝。如下圖展示了一個(gè)作業(yè)地址空間的結(jié)構(gòu)。該作業(yè)有三個(gè)段:主程序段魏割、子程序段和數(shù)據(jù)段耻卡;頁(yè)面大小為 4 KB:
在段頁(yè)式系統(tǒng)中搓茬,為了實(shí)現(xiàn)從邏輯地址到物理地址的變換张肾,系統(tǒng)中需要同時(shí)配置段表和頁(yè)表。段表的內(nèi)容與分段系統(tǒng)略有不同俭缓,它不再是內(nèi)存始址和段長(zhǎng)坷衍,而是頁(yè)表始址和頁(yè)表長(zhǎng)度。下圖展示出了利用段表和頁(yè)表進(jìn)行從用戶地址空間到物理(內(nèi)存)空間的映射侈玄。
地址變換過程
在段頁(yè)式系統(tǒng)中,為了便于實(shí)現(xiàn)地址變換缕陕,須配置一個(gè)段表寄存器铐然,其中存放段表始址和段長(zhǎng) TL险掀。進(jìn)行地址變換時(shí)死宣,首先利用段號(hào) S挡育,將它與段長(zhǎng) TL 進(jìn)行比較。若 S < TL抖单,表示未越界,于是利用段表始址和段號(hào)來求出該段所對(duì)應(yīng)的段表項(xiàng)在段表中的位置矛绘,從中得到該段的頁(yè)表始址耍休,并利用邏輯地址中的段內(nèi)頁(yè)號(hào) P 來獲得對(duì)應(yīng)頁(yè)的頁(yè)表項(xiàng)位置,從中讀出該貝所在的物理塊號(hào) b货矮,再利用塊號(hào) b 和頁(yè)內(nèi)地址來構(gòu)成物理地址羊精。
在段頁(yè)式系統(tǒng)中,為了獲得一條指令或數(shù)據(jù)囚玫,須三次訪問內(nèi)存喧锦。第一次訪問是訪問內(nèi)存中的段表,從中取得頁(yè)表始址抓督;第二次訪問是訪問內(nèi)存中的頁(yè)表燃少,從中取出該頁(yè)所在的物理塊號(hào),并將該塊號(hào)與頁(yè)內(nèi)地址一起形成指令或數(shù)據(jù)的物理地址铃在;第三次訪問才是真正從第二次訪問所得的地址中取出指令或數(shù)據(jù)阵具。
顯然碍遍,這使訪問內(nèi)存的次數(shù)增加了近兩倍。為了提高執(zhí)行速度怔昨,在地址變換機(jī)構(gòu)中增設(shè)一個(gè)高速緩沖寄存器雀久。每次訪問它時(shí),都須同時(shí)利用段號(hào)和頁(yè)號(hào)去檢索高速緩存趁舀,若找到匹配的表項(xiàng)赖捌,便可從中得到相應(yīng)頁(yè)的物理塊號(hào),用來與頁(yè)內(nèi)地址一起形成物理地址:若未找到匹配表項(xiàng)矮烹,則仍需第三次訪問內(nèi)存越庇。
參考鏈接:
- 【操作系統(tǒng) - 4】動(dòng)態(tài)分區(qū)分配算法
- 程序的鏈接的三種方式
- 連續(xù)分配管理方式
- 深入理解操作系統(tǒng)之——分頁(yè)式存儲(chǔ)管理
- 《計(jì)算機(jī)操作系統(tǒng)》(第四版)