qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          內(nèi)功修煉之操作系統(tǒng)學(xué)習(xí)(存儲(chǔ)管理)

            存儲(chǔ)器管理負(fù)責(zé)管理計(jì)算機(jī)系統(tǒng)中重要的資源---主存儲(chǔ)器。任何程序和數(shù)據(jù)必須載入到主存中才得以執(zhí)行和處理,因此存儲(chǔ)器管理的優(yōu)劣直接影響系統(tǒng)的性能。

            主存分為兩部分:一部分是系統(tǒng)區(qū),用于存放操作系統(tǒng)內(nèi)核程序和數(shù)據(jù)結(jié)構(gòu)等。另一部分是用戶區(qū),用于存放應(yīng)用程序和數(shù)據(jù)。

            計(jì)算機(jī)系統(tǒng)采用層次結(jié)構(gòu)的存儲(chǔ)系統(tǒng)。以便在容量大小、速度快慢、價(jià)格高低等諸多因素中取得平衡。它分為五個(gè)層次:寄存器,高速緩存,主存儲(chǔ)器,磁盤(pán),磁帶等五層。寄存器,高速緩存和主存儲(chǔ)器屬于操作系統(tǒng)存儲(chǔ)管理管轄范疇。磁盤(pán)和磁帶屬于設(shè)備管理的管轄對(duì)象。

            由于程序在執(zhí)行和處理數(shù)據(jù)時(shí)往往存在順序性和局部性,因此在執(zhí)行時(shí)并不需要將其全部調(diào)入主存,而僅調(diào)用當(dāng)前使用的一部分,其他部分待需要時(shí)再逐步調(diào)入。基于這個(gè)原理操作系統(tǒng)可以向用戶提供比實(shí)際主存大得多的存儲(chǔ)空間,可以設(shè)計(jì)出多級(jí)層次式體系結(jié)構(gòu)的存儲(chǔ)子系統(tǒng)。

            源程序經(jīng)過(guò)編譯,鏈接,裝入三個(gè)階段后才能裝入主存執(zhí)行。一個(gè)程序可由獨(dú)立編寫(xiě)且具有不同功能的多個(gè)源程序模塊組成。由于模塊包含外部引用:指向其他模塊中的數(shù)據(jù)或函數(shù)的地址或包含對(duì)庫(kù)函數(shù)的引用。編譯程序負(fù)責(zé)記錄引用的發(fā)生位置,編譯或匯編的結(jié)果將產(chǎn)生相應(yīng)的多個(gè)目標(biāo)模塊,每個(gè)模塊都附有供引用使用的內(nèi)部符號(hào)表和外部符號(hào)表。符號(hào)表中依次給出個(gè)符號(hào)名及在本目標(biāo)模塊中的名字地址,在模塊被鏈接時(shí)進(jìn)行轉(zhuǎn)換。

            鏈接程序的作用是把多個(gè)目標(biāo)模塊鏈接成一個(gè)完整的可重定位程序,這需要解析內(nèi)部和外部符號(hào)表,把對(duì)符號(hào)的引用轉(zhuǎn)換為數(shù)值引用,將對(duì)符號(hào)引用的程序入口點(diǎn)和數(shù)據(jù)引用點(diǎn)轉(zhuǎn)換為數(shù)值地址。Linker首先將主程序調(diào)入工作區(qū),然后掃描外部符號(hào)表,獲得外部符號(hào)。用取得的符號(hào)名從標(biāo)準(zhǔn)函數(shù)庫(kù)或其他庫(kù)中找出此符號(hào)對(duì)應(yīng)的.o文件,裝入工作區(qū)并拼接到主程序之后作為程序的一部分。

            磁盤(pán)中存儲(chǔ)的代碼模塊使用的是邏輯地址。邏輯地址空間可以是一維的,從0開(kāi)始線形排列。也可以是二維的,此時(shí)整個(gè)程序被分為多個(gè)段,每段都有不同的段號(hào),段內(nèi)地址從0開(kāi)始編址。

            進(jìn)程運(yùn)行時(shí),數(shù)據(jù)和代碼模塊被裝入物理地址空間,程序和數(shù)據(jù)的實(shí)際地址通常不可能同原來(lái)的邏輯地址一致。把邏輯地址轉(zhuǎn)換為物理地址的過(guò)程稱為地址重定位(與基址重定位相區(qū)別)。有兩種方式:

            1:靜態(tài)地址重定位:由載入程序?qū)崿F(xiàn)地址轉(zhuǎn)換,將所有的邏輯地址修改成主存物理地址。地址轉(zhuǎn)換工作在進(jìn)程執(zhí)行前一次完成,無(wú)須硬件支持,易于實(shí)現(xiàn),但是不允許程序在進(jìn)程中移動(dòng)位置。早期的計(jì)算機(jī)系統(tǒng)使用此方法。

            2:動(dòng)態(tài)地址重定位:加載程序?qū)⒊绦虻臄?shù)據(jù)和代碼加載到指定的主存區(qū)域后,并不對(duì)鏈接器處理過(guò)的應(yīng)用程序的邏輯地址進(jìn)行修改,但程序在主存的起始地址被置入硬件專用寄存器---重定位寄存器。程序執(zhí)行過(guò)程中,每當(dāng)cpu訪問(wèn)數(shù)據(jù)和代碼時(shí),由硬件截取此邏輯地址,并在它被發(fā)送到主存儲(chǔ)器之前加上重定位寄存器的值以便實(shí)現(xiàn)地址轉(zhuǎn)換。這被稱為動(dòng)態(tài)重定位,地址轉(zhuǎn)換被推遲到最后的可能時(shí)刻--執(zhí)行時(shí)才完成。這允許程序在主存中移動(dòng),便于程序共享且主存利用率高。

            為了支持動(dòng)態(tài)重定位cpu至少要有三個(gè)重定位寄存器。將代碼段、數(shù)據(jù)段和堆棧段分別作為三個(gè)可重定位的模塊。Intel x86有6個(gè)重定位寄存器。

            要將動(dòng)態(tài)地址重定位與根據(jù)重定位段進(jìn)行的基址重定位區(qū)分開(kāi)來(lái)。基址重定位是當(dāng)exe或dll沒(méi)有加載到其首選基址時(shí),所有涉及對(duì)邏輯地址引用的代碼都需要修改成相對(duì)于exe或dll實(shí)際載入的邏輯地址條件下的偏移地址。它是對(duì)邏輯地址進(jìn)行操作。而當(dāng)exe或dll被加載到首選基地址時(shí),基址重定位不會(huì)發(fā)生。但是任何程序都會(huì)進(jìn)行動(dòng)態(tài)地址重定位,將邏輯地址轉(zhuǎn)換為物理地址。

            在多道程序設(shè)計(jì)中,可用的主存通常被多個(gè)進(jìn)程共享,必須允許進(jìn)程所使用的內(nèi)存因?qū)Q或空閑區(qū)收集而被移動(dòng),這需要?jiǎng)討B(tài)地址重定位支持。無(wú)論采取何種重定位方式,通常進(jìn)程運(yùn)行時(shí)會(huì)對(duì)需要訪問(wèn)所有主存地址進(jìn)行檢查,確保進(jìn)程僅訪問(wèn)自己的存儲(chǔ)區(qū)。這就是地址越界保護(hù),它依賴于硬件。除了地址越界保護(hù)之外,還要進(jìn)行訪問(wèn)權(quán)限檢查,如允許讀、寫(xiě)、執(zhí)行等,從而保證數(shù)據(jù)的安全性和完整性,這就是信息存取保護(hù)。

            固定分區(qū)存儲(chǔ)管理的基本思想:主存空間被劃分成數(shù)目固定不變的分區(qū),各個(gè)分區(qū)大小不等,每個(gè)分區(qū)只裝入一個(gè)作業(yè),若多個(gè)分區(qū)都裝有作業(yè)則它們可以并發(fā)執(zhí)行。缺點(diǎn):預(yù)先規(guī)定分區(qū)大小使得大作業(yè)無(wú)法裝入。作業(yè)很少會(huì)恰好填滿分區(qū),主存利用率不高。

            可變分區(qū)管理又稱為動(dòng)態(tài)分區(qū)管理,按照作業(yè)大小來(lái)劃分分區(qū),但劃分的時(shí)間、大小、位置都是動(dòng)態(tài)的。系統(tǒng)把作業(yè)裝入主存時(shí),根據(jù)其所需要的主存容量查看是否有足夠的空間。若有,則按需分配一個(gè)分區(qū)給此作業(yè);若無(wú),則令此作業(yè)等待主存資源 。由于分區(qū)大小是按需求而定的,因此分區(qū)數(shù)目是可變的。這可以提高主存利用率。

            用于管理的數(shù)據(jù)結(jié)構(gòu)由兩張表組成:已分配分區(qū)表和未分配區(qū)表。當(dāng)裝入新作業(yè)時(shí),從未分配表中找出一個(gè)足夠容納它的空閑區(qū)。將此區(qū)分成兩部分,一部分用來(lái)裝入作業(yè),另一部分仍是空閑區(qū)。然后在已分配的表中登記新作業(yè)的起始地址、占用長(zhǎng)度,同時(shí)修改未分配區(qū)表中空閑區(qū)的長(zhǎng)度和起始地址。當(dāng)作業(yè)撤離時(shí),已分配區(qū)表中的相應(yīng)狀態(tài)變?yōu)榭眨鴮⑹栈氐姆謪^(qū)登記到未分配區(qū)表中,若有相鄰空閑區(qū),將其合并后登記。

            已分配分區(qū)表和未分配分區(qū)表采用鏈表是不錯(cuò)的選擇。在內(nèi)部各分區(qū)都可按一定的規(guī)則排列。如按空閑區(qū)大小、地址排列。

            常用的可變分區(qū)分配算法有以下五種:

            1:最先適應(yīng)分配算法:順序查找未分配表找出一個(gè)滿足需要的。

            2:下次適應(yīng)分配算法:總是從未分配區(qū)的上次掃描結(jié)束處順序查找未分配區(qū)表。

            3:最優(yōu)適應(yīng)分配算法:掃描整個(gè)未分配區(qū)表,從中找出一個(gè)能滿足需要的最小分區(qū)進(jìn)行分配。查找前分區(qū)一般按大小排列。

            4:最壞適應(yīng)分配算法:掃描整個(gè)未分配分區(qū)表,總是挑選一個(gè)最大的空閑區(qū)分割給作業(yè)使用。

            5:快速適應(yīng)分配算法:為那些經(jīng)常使用的長(zhǎng)度設(shè)立單獨(dú)的空閑區(qū)鏈表。

           對(duì)可變分區(qū)需采用動(dòng)態(tài)地址重定位,進(jìn)程的程序和數(shù)據(jù)的地址轉(zhuǎn)換由硬件完成,硬件設(shè)置兩個(gè)專用控制寄存器:基址寄存器和限長(zhǎng)寄存器。基址寄存器存放分配給進(jìn)程使用的分區(qū)的起始地址,限長(zhǎng)寄存器存放進(jìn)程所占用的連續(xù)存儲(chǔ)空間的長(zhǎng)度。當(dāng)進(jìn)程占有cpu運(yùn)行后,操作系統(tǒng)可把分區(qū)的起始地址和長(zhǎng)度送入基址寄存器和限長(zhǎng)寄存器,在執(zhí)行指令或訪問(wèn)數(shù)據(jù)時(shí),由硬件根據(jù)基址寄存器進(jìn)行地址轉(zhuǎn)換得到絕對(duì)地址。

            當(dāng)邏輯地址小于限長(zhǎng)值時(shí),邏輯地址加上基址寄存器的值就可以獲得絕對(duì)地址。當(dāng)邏輯地址大于限長(zhǎng)值時(shí)表示進(jìn)程所訪問(wèn)的地址超過(guò)所分得的區(qū)域,此時(shí)不允許訪問(wèn)。

            C語(yǔ)言的程序會(huì)被編譯成至少三個(gè)段:代碼段,數(shù)據(jù)段,堆棧段。Intel x86平臺(tái)提供專用的存放段基址的寄存器:代碼段寄存器CS在指令執(zhí)行期間重定位指令地址;堆棧段寄存器SS為棧指令執(zhí)行重定位地址;數(shù)據(jù)段寄存器DS在指令執(zhí)行周期內(nèi)重定位其他地址。提供多對(duì)基址、限長(zhǎng)寄存器的機(jī)器中,允許一個(gè)進(jìn)程占用兩個(gè)或多個(gè)分區(qū)。可規(guī)定某對(duì)基址、限長(zhǎng)寄存器的區(qū)域是共享的,用來(lái)存放共享的程序和數(shù)據(jù)。

            可變分區(qū)中常常出現(xiàn)分散的小空閑區(qū),稱之為碎片。當(dāng)在分區(qū)表中找不到足夠大的空閑區(qū)來(lái)裝入進(jìn)程時(shí),可采用移動(dòng)技術(shù)把已在主存中的進(jìn)程分區(qū)連接到一起,使分散的空閑區(qū)匯集成片。這就是移動(dòng)技術(shù)。第一種方法是把所有當(dāng)前占用的分區(qū)移動(dòng)到主存一端。第二種是也是把占用分區(qū)移動(dòng)到另一端,但是當(dāng)產(chǎn)生足夠大的空閑區(qū)就停止移動(dòng)。

            分區(qū)方式管理存儲(chǔ)器,每道程序要求占用主存的一個(gè)或多個(gè)連續(xù)存儲(chǔ)區(qū)域,這樣不僅導(dǎo)致主存中產(chǎn)生碎片,而且處理器的開(kāi)銷太大。分頁(yè)存儲(chǔ)管理允許程序存放到若干不相鄰的空閑塊中,既可以免除移動(dòng)信息工作也可充分利用主存空間。

            進(jìn)程邏輯地址空間分成大小相等的區(qū),每個(gè)分區(qū)成為頁(yè)面或頁(yè),頁(yè)號(hào)從0開(kāi)始依次編號(hào)。 把主存物理地址空間分成大小相等的區(qū),每個(gè)區(qū)是一個(gè)物理塊或頁(yè)框。頁(yè)框大小與頁(yè)面大小相等。

            與此對(duì)應(yīng)分頁(yè)存儲(chǔ)器的邏輯地址由兩部分組成:頁(yè)號(hào)和頁(yè)內(nèi)位移。邏輯地址是連續(xù)的,用戶在編制程序時(shí)仍使用相對(duì)地址,不必考慮如何分頁(yè),由硬件地址轉(zhuǎn)換機(jī)構(gòu)和操作系統(tǒng)的管理需要來(lái)決定頁(yè)面尺寸,從而確定主存的分塊大小。進(jìn)程在主存中的每個(gè)頁(yè)框內(nèi)的地址是連續(xù)的,但頁(yè)框之間的地址可以不連續(xù)。

            頁(yè)表用于是操作系統(tǒng)為進(jìn)程建立的,是程序頁(yè)面和主存對(duì)應(yīng)頁(yè)框的對(duì)照表。頁(yè)表中的每一欄指明程序中的一個(gè)頁(yè)面和分得頁(yè)框之間的對(duì)應(yīng)關(guān)系。從數(shù)學(xué)角度來(lái)看,頁(yè)表表示一個(gè)函數(shù),其變量是頁(yè)面號(hào),函數(shù)值為頁(yè)框號(hào),通過(guò)頁(yè)表可以把邏輯地址中的邏輯頁(yè)面替換成物理頁(yè)框。進(jìn)程頁(yè)表存放在內(nèi)存中,系統(tǒng)設(shè)置了專門(mén)的硬件:頁(yè)表基址寄存器(一對(duì),地址和長(zhǎng)度),存放當(dāng)前運(yùn)行進(jìn)程頁(yè)表的起始地址 ,以加快地址轉(zhuǎn)換速度。

            進(jìn)程運(yùn)行前由系統(tǒng)把它的頁(yè)表基地址送入頁(yè)表基址寄存器,運(yùn)行時(shí)借助于硬件的地址轉(zhuǎn)換,按頁(yè)面動(dòng)態(tài)地址重定位。當(dāng)cpu獲得邏輯地址后,由硬件按設(shè)定的頁(yè)面尺寸分成兩部分:頁(yè)號(hào)和頁(yè)內(nèi)位移。先從頁(yè)表基地址寄存器找到頁(yè)表基地址,再用頁(yè)號(hào)作為索引查找頁(yè)表,得到對(duì)應(yīng)的頁(yè)框號(hào)。根據(jù)

            物理地址=頁(yè)框號(hào)*塊長(zhǎng)+頁(yè)內(nèi)位移。

            計(jì)算出欲訪問(wèn)的主存單元。雖然進(jìn)程存放在若干不連續(xù)的頁(yè)框中,

            但在執(zhí)行過(guò)程中總能按正確的物理地址進(jìn)行存取。

            按照給定邏輯地址進(jìn)行讀寫(xiě)操作時(shí),至少訪問(wèn)兩次主存:一次訪問(wèn)頁(yè)面,另一個(gè)根據(jù)物理地址訪問(wèn)指令或數(shù)據(jù)。為了提高運(yùn)算速度,設(shè)置了專門(mén)的硬件,用來(lái)存放進(jìn)程最近訪問(wèn)的部分頁(yè)表項(xiàng),被稱為轉(zhuǎn)換后援緩沖或快表。對(duì)快表的訪問(wèn)速度遠(yuǎn)快于主存,但造價(jià)高,且只能存儲(chǔ)幾十個(gè)頁(yè)表項(xiàng)。塊表項(xiàng)包含頁(yè)號(hào)及對(duì)應(yīng)的頁(yè)框號(hào),它通過(guò)并行匹配對(duì)所有快表項(xiàng)進(jìn)行查找。如果找不到,再查主存中的頁(yè)表,同時(shí)將頁(yè)號(hào)即頁(yè)框號(hào)登記到快表中。當(dāng)塊表快滿時(shí),需要淘汰舊的塊表項(xiàng),最簡(jiǎn)單的策略是先進(jìn)先出。

            通過(guò)快表實(shí)現(xiàn)主存訪問(wèn)的比率成為命中率。快表與高速緩存不同,前者記錄最近轉(zhuǎn)換的頁(yè)號(hào)即頁(yè)框號(hào),后者保存最近實(shí)際訪問(wèn)的指令或數(shù)據(jù)的副本。

            分頁(yè)存儲(chǔ)管理能實(shí)現(xiàn)多個(gè)進(jìn)程共享程序和數(shù)據(jù),共享頁(yè)面信息可大大提高主存空間的利用率。實(shí)現(xiàn)頁(yè)面共享必須區(qū)分?jǐn)?shù)據(jù)共享和程序共享。實(shí)現(xiàn)數(shù)據(jù)共享時(shí),允許不同進(jìn)程對(duì)共享的數(shù)據(jù)頁(yè)面用不同的頁(yè)號(hào),只要讓各自頁(yè)表中的有關(guān)表項(xiàng)指向共享的數(shù)據(jù)頁(yè)框。實(shí)現(xiàn)程序共享時(shí),由于指令包含指向其他指令或數(shù)據(jù)的地址,進(jìn)程依賴于這些地址才能執(zhí)行,所以,不同進(jìn)程正確執(zhí)行共享代碼頁(yè)面,必須為它們?cè)谒羞壿嫷刂房臻g中指定同樣的頁(yè)號(hào)。實(shí)現(xiàn)信息共享必須解決共享信息的保護(hù)問(wèn)題,通常的做法是在頁(yè)表中增加標(biāo)志位,指出此頁(yè)的訪問(wèn)模式。進(jìn)程訪問(wèn)時(shí)核對(duì)訪問(wèn)模式,當(dāng)模式不符時(shí)拋出異常。

            分頁(yè)存儲(chǔ)管理是實(shí)存管理,必須為進(jìn)程分配足夠的主存空間,裝入其全部信息,否則進(jìn)程無(wú)法運(yùn)行。把進(jìn)程的全部信息裝入主存后,實(shí)際上并非同時(shí)使用,有些部分甚至從不使用,這是對(duì)主存資源的一種浪費(fèi)。于是提出一種想法:不必裝入進(jìn)程的全部信息,僅將當(dāng)前使用部分先裝入主存,其余部分存放在磁盤(pán)中,待使用時(shí)由系統(tǒng)自動(dòng)將其裝進(jìn)來(lái),這就是虛擬存儲(chǔ)管理技術(shù)的基本思路。

            當(dāng)進(jìn)程被創(chuàng)建時(shí),代碼段和數(shù)據(jù)段部分?jǐn)?shù)據(jù)被調(diào)入內(nèi)存。如果處理器訪問(wèn)的程序或數(shù)據(jù)不在內(nèi)存,系統(tǒng)自動(dòng)將這部分信息從磁盤(pán)裝入,這叫做部分裝入。若此時(shí)內(nèi)存沒(méi)有足夠的空閑空間,便把主存中暫時(shí)不用的信息移至磁盤(pán),這叫做部分替換。在具有層次存儲(chǔ)結(jié)構(gòu)的計(jì)算機(jī)系統(tǒng)中,自動(dòng)實(shí)現(xiàn)部分裝入和部分替換功能,能從邏輯上為用戶提供一個(gè)比實(shí)際物理存儲(chǔ)器大得多的、可尋址的“主存儲(chǔ)器”,這被稱為虛擬存儲(chǔ)器。它對(duì)用戶隱蔽內(nèi)部細(xì)節(jié)。虛擬地址空間等同于實(shí)際物理主存加部分硬盤(pán)區(qū)域的存儲(chǔ)空間。引用基礎(chǔ)是:程序執(zhí)行的局部性原理:某存儲(chǔ)單元被使用后,其相鄰的存儲(chǔ)單元也很快被使用---空間局部性。最近訪問(wèn)過(guò)的程序代碼和數(shù)據(jù)很快被訪問(wèn)---時(shí)間局部性。

            虛擬存儲(chǔ)器是基于程序局部性原理的一種假想的而非物理存在的存儲(chǔ)器,其主要任務(wù)是:基于程序局部性特點(diǎn),當(dāng)進(jìn)程使用某部分地址空間時(shí),保證將相應(yīng)部分加載至主存中。這種將物理空間和邏輯空間分開(kāi)編制、互相隔離,但又統(tǒng)一管理和使用的計(jì)數(shù)為用戶編程提供了極大地方便。

          虛擬存儲(chǔ)管理與對(duì)換有很大區(qū)別。兌換技術(shù)以進(jìn)程為單位,當(dāng)所需的主存空間大于當(dāng)前系統(tǒng)的擁有量時(shí),進(jìn)程無(wú)法對(duì)換進(jìn)主存工作。而虛擬存儲(chǔ)管理以頁(yè)或段為單位,即使進(jìn)程所需主存空間大于當(dāng)前系統(tǒng)擁有的主存總量,仍然能夠正常運(yùn)行。

            操作系統(tǒng)的存儲(chǔ)管理依靠底層硬件MMU(主存管理部件)來(lái)完成,它提供地址轉(zhuǎn)換和存儲(chǔ)保護(hù)的功能。

            每當(dāng)進(jìn)程上下文發(fā)生切換時(shí),系統(tǒng)負(fù)責(zé)把要運(yùn)行的進(jìn)程的頁(yè)表基地址裝入頁(yè)表寄存器,此頁(yè)表便成為活動(dòng)頁(yè)表。MMU只對(duì)頁(yè)表基址寄存器所指出的活動(dòng)頁(yè)表進(jìn)行操作。然后將邏輯地址分解為頁(yè)面號(hào)和頁(yè)內(nèi)位移,以便進(jìn)行地址轉(zhuǎn)換。對(duì)快表的管理設(shè)計(jì)兩個(gè)方面:一是直接查找快表,找到相應(yīng)的頁(yè)框后去拼接物理地址。二是裝入表目和清除表目,每次發(fā)生快表查找不命中的情況后,待缺頁(yè)中斷處理結(jié)束,把相應(yīng)的頁(yè)面和頁(yè)框號(hào)裝入。

            請(qǐng)求分頁(yè)虛擬存儲(chǔ)管理是將進(jìn)程信息的副本存放在輔助存儲(chǔ)器中,當(dāng)它被調(diào)度投入運(yùn)行時(shí),并不把程序和數(shù)據(jù)全部裝入主存,僅裝入當(dāng)前使用的頁(yè)面,訪問(wèn)到不在主存的頁(yè)面時(shí)再動(dòng)態(tài)的把所需的信息裝入。請(qǐng)求分頁(yè):當(dāng)需要執(zhí)行某條指令或使用某個(gè)數(shù)據(jù)而發(fā)現(xiàn)它們不在主存時(shí),產(chǎn)生缺頁(yè)中斷,系統(tǒng)從磁盤(pán)把此指令或數(shù)據(jù)所在的頁(yè)面裝入。

            請(qǐng)求分頁(yè)虛擬存儲(chǔ)管理屬于虛擬存儲(chǔ),與分頁(yè)實(shí)存管理不同,僅讓當(dāng)前使用部分裝入,必然會(huì)發(fā)生某些頁(yè)面不在主存的情況,為了標(biāo)記頁(yè)面是否在主存中,所采用的方法為:擴(kuò)充頁(yè)表項(xiàng)的內(nèi)容,增加駐留標(biāo)志位,又稱頁(yè)失效異常位,用來(lái)指處頁(yè)面是否裝入主存。當(dāng)訪問(wèn)一個(gè)頁(yè)面時(shí),如果某頁(yè)的駐留標(biāo)識(shí)為1,表示此頁(yè)已經(jīng)在主存中,可被正常訪問(wèn)。如果某頁(yè)的駐留標(biāo)識(shí)為0,不能立即訪問(wèn),產(chǎn)生缺頁(yè)中斷,操作系統(tǒng)根據(jù)磁盤(pán)地址將這個(gè)頁(yè)面調(diào)入主存,然后重新啟動(dòng)相應(yīng)指令。

            頁(yè)面裝入策略決定何時(shí)把頁(yè)面裝入主存,有兩種策略:

            1:請(qǐng)頁(yè)式,僅當(dāng)需要訪問(wèn)程序和數(shù)據(jù)時(shí),通過(guò)缺頁(yè)中斷并由缺頁(yè)中斷處理程序分配頁(yè)框,把所需頁(yè)面裝入主存。

            2:預(yù)調(diào)式,裝入主存的頁(yè)面并非缺頁(yè)中斷請(qǐng)求的頁(yè)面,是由操作系統(tǒng)依據(jù)某種算法,動(dòng)態(tài)預(yù)測(cè)進(jìn)程最可能要訪問(wèn)的那些頁(yè)面。

            頁(yè)面清除策略與裝入策略相對(duì)應(yīng),要考慮何時(shí)把修改過(guò)的頁(yè)面寫(xiě)回輔助存儲(chǔ)器,常用的算法是:

            1:請(qǐng)頁(yè)式清除,僅當(dāng)一頁(yè)被選中進(jìn)行替換且被修改過(guò),才把它寫(xiě)回磁盤(pán)。

            2:預(yù)約式清除,對(duì)于所有更改過(guò)的頁(yè)面,在需要替換之前把它們都寫(xiě)回磁盤(pán)。

            在多道程序設(shè)計(jì)中,屬于不同進(jìn)程的頁(yè)面被分散存放在主存頁(yè)框中,當(dāng)發(fā)生缺頁(yè)中斷時(shí),如果已無(wú)空閑頁(yè)框,系統(tǒng)要選擇一個(gè)駐留頁(yè)面進(jìn)行淘汰。

            頁(yè)面替換有兩種策略:

            1:局部替換,頁(yè)面替換算法局限于進(jìn)程自身。

            2:全局替換,頁(yè)面替換算法的作用范圍是整個(gè)系統(tǒng)。

            全局替換算法有以下幾種算法:

            1:最佳頁(yè)面替換算法(optimal replacement ,OPT):當(dāng)要調(diào)入一頁(yè)而必須淘汰舊頁(yè)時(shí),應(yīng)該淘汰以后不再訪問(wèn)的頁(yè),或距現(xiàn)在最長(zhǎng)時(shí)間后要訪問(wèn)的頁(yè)。它所產(chǎn)生的缺頁(yè)數(shù)最少。這只是一種理想的情況。

            2:先進(jìn)先出頁(yè)面替換算法(FIFO)

            基于程序總是按線形順序來(lái)訪問(wèn)物理空間這一假設(shè),總是淘汰最先調(diào)入主存的頁(yè)面,即淘汰在主存中駐留時(shí)間最長(zhǎng)的頁(yè)面。

            3:最近最少使用頁(yè)面替換算法(Least Recently Used ,LRU)

            淘汰的頁(yè)面是在最近一段時(shí)間內(nèi)最久未被訪問(wèn)的那一頁(yè)。

            4:第二次機(jī)會(huì)頁(yè)面替換(Second Chance Replacement ,SCR)

            此算法是將FIFO算法與頁(yè)表中的引用位結(jié)合起來(lái)使用,實(shí)現(xiàn)思想:首先檢查FIFO頁(yè)面隊(duì)列中的隊(duì)首,這是最早進(jìn)入主存的頁(yè)面,如果其引用位是0,那么這個(gè)頁(yè)面不僅入隊(duì)時(shí)間長(zhǎng),而且沒(méi)有使用。如果引用位為1,說(shuō)明它進(jìn)入主存的時(shí)間較早,但最近仍在使用,于是將其引用位歸0,置于隊(duì)尾,把它看成新調(diào)入的頁(yè),再給一次機(jī)會(huì)。

            5:時(shí)鐘頁(yè)面替換算法(Clock policy replacement)

          相關(guān)鏈接:

          內(nèi)功修煉之操作系統(tǒng)學(xué)習(xí)(處理器管理)

          內(nèi)功修煉之操作系統(tǒng)學(xué)習(xí)(同步、通信及死鎖)

          posted on 2012-07-09 10:09 順其自然EVO 閱讀(478) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2012年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 双鸭山市| 彭泽县| 黑河市| 松溪县| 西乌珠穆沁旗| 泰顺县| 蒙自县| 钟祥市| 玛沁县| 怀仁县| 厦门市| 绥滨县| 万载县| 宿迁市| 肥乡县| 松溪县| 上虞市| 鄂尔多斯市| 庆云县| 新安县| 东莞市| 迭部县| 冷水江市| 资兴市| 塔河县| 观塘区| 古丈县| 金平| 新郑市| 静海县| 泸溪县| 米泉市| 余江县| 林芝县| 岢岚县| 宁都县| 淅川县| 北海市| 崇阳县| 四川省| 大埔县|