計算機操做系統之存儲器管理

程序運行程序員

將用戶的一個源程序變成一個可在內存中執行的程序,一般要通過如下幾個步驟:算法

一、編譯:由編譯程序,將程序編譯成若干個目標模塊編程

二、連接:由連接程序將編譯後造成的一組目標模塊,以及他們所須要的庫函數連接在一塊兒,造成一個完整的裝入模塊。緩存

三、裝入:由裝入程序將裝入模塊裝入內存函數

具體討論一下如何把一個裝入模塊,裝入內存:blog

一、絕對裝入方式:編譯程序產生帶有絕對地址的目標代碼,只適合於單道程序環境。索引

二、可重定位裝入方式:所獲得的模塊都是以0開始的,程序中的其它地址也都是相對於起始地址計算的,此時可重定位裝入方式,根據內存的狀況,將裝入模塊裝入到內存的適當位置。一般把在裝入時對目標程序中指令和數據的修改過程稱爲重定位。又由於地址變換一般是在裝入時一次完成的,之後再也不改變,故稱爲靜態重定位進程

三、動態運行時裝入方式:上一種方式,可將裝入模塊裝入到內存中任何位置,故可用於多道程序環境,但並不容許程序運行時在內存中移動位置。而動態運行時裝入方式,是在把裝入內存後,並不當即把裝入模塊中的相對地址轉換爲絕對地址,而是把這種地址轉換推遲到程序真正要執行時才進行。所以,裝入內存後的全部地址都還是相對地址。爲了避免影響轉換帶來的不良影響,通常使用一個重定位寄存器事件

程序的連接ip

源程序通過編譯後,可獲得一組目標模塊,再利用連接程序將這組目標模塊連接,造成裝入模塊。根據連接的時間的不一樣,可把連接分紅以下三種:

一、靜態連接:在程序運行以前,先將各目標模塊和它們的所用的連接庫,連接成一個完整的裝配模塊,之後再也不拆開。

二、裝入時動態連接:在把一系列的目標模塊裝入內存時,採用邊裝入邊連接的連接方式。

三、運行時動態連接:這是指對某些目標模塊的連接,是在程序執行中要該模塊時,纔對它進行連接。

對換:爲何要用到對換?

在多道程序環境下,在內存中的某些進程因爲某事件還沒有發生,而被阻塞了,但它卻佔用了大量的內存空間,另外一方面,其餘的做業卻在外存上等待。這樣就造成了浪費。所以引用了「對換」這個概念。

對換是把內存中能運行的進程或者暫時不用的程序和數據,調出到外存上,以便騰出足夠的內存,再把已經具有運行條件的進程或進程所須要的程序和數據,調入內存。

若是對換的單位是整個進程,則稱爲總體對換,若是對換的單位是段或頁,則稱爲部分對換。

對換空間的管理

在具備對換功能的OS中,一般把外存分爲文件區和對換區。前者用於存放文件,後者用於存放從內存換出的進程。

因爲對換分區的分配是連續分配方式,於是對換空間的分配與回收,與動態分區方式時的內存分配與回收方法雷同。通常用首次適應算法,循環首次適應算法或最佳適應算法。

進程的換入與換出:

一、若是某一個進程被阻塞了或是優先級最低的,通常會把它的程序與數據換出到對換區

二、系統應定時地查看全部的進程的狀態,從中找出「就緒」狀態但已經換出的進程,將其中換出時間最久的進程做爲換入進程,將之換入。

基本的分頁存儲管理方式

連續分配方式會造成許多的碎片,雖然可經過「緊湊」方法將許多碎片拼接成可用的大塊空間,但須爲之付出很大的開銷。若是容許將一個進程直接分散地裝入到許多不相鄰接的分區中,則無須再進行「緊湊」。基於這一思想,產生了離散的分配方式。若是離散分配的基本單位是,則稱爲分頁存儲管理方式;若是是,則稱爲分段存儲管理方式

在分頁存儲管理中,若是不具有頁面對換功能,則稱爲基本的分頁存儲管理方式,或稱爲純分頁存儲管理方式,它不具備支持實現虛擬存儲器的功能。它要求把每一個做業所有裝入內存後才能運行。

頁面與物理塊

分頁存儲管理,是將一個進程的邏輯地址空間分紅若干個大小相等的片,稱爲頁面。也把內存空間分紅和頁面大小相等的存儲塊,稱爲物理塊或頁框。因爲進程的最後一頁常常裝不滿一塊而造成了不可利用的碎片,稱爲「頁內碎片」

頁面的大小

頁面過小,能夠減少頁內碎片,提升利用率。可是這樣會使得頁表過長。若是頁面過大,雖然頁面能夠變得很短,可是頁內碎片太大。因此通常選擇大小適中,且頁面大小就是2的冪,一般是512B-8KB

地址結構

分頁地址中的地址以下:

一共32位,0-11位是位移量(頁內地址,因此一頁爲4KB), 12-31是頁號,因此最多能夠有1M頁。

地址變換機構---頁表

爲了能將用戶地址空間中邏輯地址,變換爲內存空間中的物理地址,在系統中必須設置地址變換機構。該機構的基本任務是實現從邏輯地址到物理地址的轉換。因爲頁面內的地址與物理塊內的地址是一一對應的。因此只要把邏輯地址的頁號轉換爲內存中的物理塊號就能夠了。

而頁面映射表(頁表)就是用於實現從頁號到物理塊號的變換。所以,地址變換的任務是藉助於頁表來完成的。

clip_image001

基本的地址變換機構

頁表的功能能夠藉助一組專門的寄存器來實現。一個頁表項用一個寄存器來實現,可是因爲頁表太長,寄存器比較小,並且貴。因此通常把頁表放在內存上。在系統中只設置一個頁表寄存器PTR,在其中存入頁表在內存中的始址和大小。當程序未執行時,這兩個值是放在PCB中的。當調度程序調度到某個進程時,纔將這兩個數據裝入頁表寄存器中。所以在單處理機環境下,雖然系統中能夠運行多個進程,但只要一個PTR就能夠。

當進程要訪問某個邏輯地址中的數據時,分頁地址變換機構會自動地將有效地址分爲頁號和頁內地址兩部分。再以頁號爲索引去檢索頁表。查找操做由硬件來執行,提升效率。首先判斷是否是越界,若是不越界,則將頁表始址與頁號和頁表項長度的乘積相加,便獲得該表項在頁表中的位置,因而可從中獲得該頁的物理塊號,將之裝入物理地址寄存器中。與此同時,再將有效地址寄存器中的頁內地址送入物理地址寄存器的塊內地址字段中。這樣便完成了從邏輯地址到物理地址的變換。

clip_image002

具備快表的地址變換機構

因爲頁表是放在內存中的,這使得CPU在每存取一個數據時,要訪問內存兩次。

第一次,是找到指定頁面的物理塊號,再將物理塊號和頁內地址相加,獲得物理地址。

第二次,從第一次獲得的地址中,把對應的數據找到。

那如今有沒有改進的方案呢。是否是能夠不用第一次訪存呢?若是不須要的話,那應該有一個地方存儲這個頁表,或頁表的一部分。

爲了提升地址變換速度,可在地址變換機構中,增設一個具備並行查尋能力的特殊高速緩衝寄存器,又稱爲「聯想寄存器」或快表。

此時的地址變換過程是這樣子的:

在CPU給出有效地址後,由地址變換機構自動地將頁號P送入高速緩衝寄存器,並將此頁號與高速緩存中的全部頁號進行比較,若其中有與此相匹配的頁號,便送到物理地址寄存器中。如在快表中未找到對應的頁表項,則還須再訪問內存中的頁表。找到後,把從頁表項中讀出的物理塊號送到地址寄存器,同時,再將此頁表項存入快表的一個突破器單元中,即重修快表。但若是此快表已經滿了,則OS必須找到一個老的且已經被認爲再也不須要的頁表項,將它換出。

因爲成本的考慮,快表不可能作的太大,通常只存16-512個頁表項。

clip_image004

如今的計算機還能夠有兩級和多級頁表

基本的分段存儲管理方式

若是說推進存儲管理方式從固定分區到動態分區分配,進而又發展到分頁存儲管理方式的主要動力,是提升內存利用率,那麼引入分段存儲管理方式的目的,則主要是爲了知足用戶(程序員)在編程和使用上多方面的要求。

1) 方便編程

一般,用戶把本身的做業按照邏輯關係劃分爲若干個段,每一個段都是從0開始的。而且有本身的名字和長度。所以,但願要訪問的邏輯地址是由段名和段內地址偏移量決定的。以下指令:

Load 1 ,[A]|<d> 其中,含義是將分段A中D單元內的值讀入到寄存器1.

2) 信息共享

在實現程序和數據的共享時,是以信息的邏輯單位爲基礎的。好比共享某個函數,頁面只是存放信息的物理塊,不具有完整的意義。而段是信息的邏輯單位。爲了實現段的共享,但願存儲管理能與用戶程序分段的組織方式相適應。

3) 信息保護

一樣是對信息的邏輯單位進行保護

4) 動態增加

在實際應用中,有些段,特別是數據段,是不斷增加的,而事先沒法知道大小。分段存儲管理能夠很好的解決這個問題。

5) 動態連接

在做業運行以前,並非把幾個目標程序段連接起來。要運行時,先將主程序對應的目標程序裝入內存啓動運行,當運行過程當中又要調用某段時,纔將該段調入內存並進行連接。可見,動態連接也要求以段做爲管理的單位。

分段系統的基本原理

1 分段原理

在分段存儲管理方式中,做業的地址空間被劃分爲若干個段,每一個段定義了一組邏輯信息。例如主程序段,子程序段,數據段,棧段。爲了實現簡單起見,一般可用一個段號來代替段名,每一個段都從0開始編址,並採用一段連續的地址空間。

對於一個做業,因爲是分紅多個段,於是是一個二維的。因此說邏輯地址是由段號和段內地址組成的。

2 段表

在分段式存儲管理系統中,爲每個分段分配一個連續的分區,而進程中的各個段能夠離散地移入內存中不一樣的分區中。爲使程序能正常運行,亦即,能從物理內存中找出每一個邏輯段所對應的位置,就像分頁系統那樣,在系統中爲每一個進程創建一張段映射表,簡稱「段表」。

每一個段在表中佔有一個表項,其中記錄了該段在內存中的起始地址和段的長度。段表能夠放在寄存器中,這樣有利於提升地址轉換速度;但更常見的是把段表放在內存中。在配置了段表後,執行中的進程可經過查找段表,找到每一個段所對應的內存區。可見,段表是用於實現從邏輯到物理內存區的映射。

clip_image005

3 地址變換機構

爲了實現從進程的邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用於存放段表始址和段表長度。在進行地址變換時,系統將邏輯地址中的段號與段表長度進行比較,若是段號太大,表示越界,因而產生越界中斷信息。若是沒有越界,則用段表的始址+段號,獲得所在段表的項。以後,就找到了此段的基址。而後,決斷位移量與此段的長度大小,若是越界,發現越界中斷信息,不然就能夠找到物理地址了。

clip_image007

4 分頁與分段的區別

1) 頁是信息的物理單位,分頁是爲了實現離散分配方式,以消減內存的外零頭提升內存的利用率。分頁只是爲了系統管理的須要;而分段則是爲了程序員的須要。

2) 頁的大小固定且由系統決定,由系統把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的。因此說系統中只有一種長度的頁面。而段的長度不是固定的,決定它的長度的是用戶編寫的程序。一般是編譯程序在對源程序進行編譯時,根據信息的性質來劃分。

3) 分頁的做業地址空間是一維的,即單一的線性地址空間,而分段的做業地址是二維的。

段頁式存儲管理

咱們知道了分頁能夠提升內存的利用率,而分段則能夠實現信息保護,信息共享,動態連接,動態增加等,那能不能合二爲一呢?這就是段頁式存儲管理。

基本原理

先把用戶程序分紅若干段,再把每個段分紅若干個頁面。如一個做業有三個段,頁面大小爲4KB。在段頁式系統中,其地址結構由段號,段內頁號及頁內地址三部分所組成。以下圖:

clip_image009

地址變換過程

爲了方便實現地址變換,須配置一個段表寄存器,其中存放段表始址和段長。過程以下:

clip_image011

在段頁式系統中,爲了獲得一個數據,要進行三次訪問內存。

一、第一次訪問內存的段表,從中取得頁表的始址;

二、第二次訪問是訪問內存的頁表,取得物理塊號;

三、第三次訪問纔是真正從第二次訪問所得的地址中,取出指令和數據;

虛擬存儲器的基本概念

在前面所講的兩種存儲管理方式中,都要求將一個做業所有裝入內存後方能運行,因而出現了兩種狀況:

一、有的做業很大,不可能一會兒裝入內存

二、有大量做業要求運行時,但因爲內存容量不足以容納全部的這些做業,只能將少數做業裝入內存讓它們先運行,而將其它大量的做業放在外存上等待。

解決上述問題:

一、最多見的是擴大內存。但這每每受到機器自身的限制,並且無疑要增長系統成本;

二、另外一種方法是從邏輯上擴充內存容量,這下是虛擬存儲技術。

虛擬存儲器的引入

常規存儲管理方式的特徵

一、一次性:一次裝入。

二、駐留性:做業從裝入內存,便一直駐留在內存中,直到做業運行結束。儘管在整個進程中,可能有屢次IO,可是它仍然佔用着內存。

局部性原理

一、時間侷限性:若是程序中的某條指令一旦執行,則不久之後該指令可能再次執行,若是一個數據被訪問過,則不久之後,還可能再次被訪問。

二、空間侷限性:一旦程序訪問了某個存儲單元,在不久之後,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址,可能集中在必定的範圍以內。典型的例子是順序執行。

虛擬存儲器的定義

是指具備請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。其邏輯容量由內存容量和外在容量以後所決定,其運行速度接近於內存速度,每位的成本接近於外存。因此是一個很好的解決方案。

虛擬存儲器的實現方法

它的實現,都是創建在離散分配的存儲管理方式的基礎上。通常有兩種方法:

一、分頁請求系統

二、請求分段系統

相關文章
相關標籤/搜索