操作系統的存儲器管理

一 多層結構存儲器

計算機運行時,幾乎每條指令都要設計存儲器的訪問,因此存儲器的速度必須要能和處理機運行速度相匹配,不然就會影響處理機的運行,並且存儲器的容量要足夠大,還得便宜,目前肯定是無法滿足,所以現代操作系統幾乎都採用多層結構的存儲器系統。多層結構如圖A所示,最高層是寄存器(速度不亞於CPU,但是價格昂貴),中間是主存,最後是輔存。
在這裏插入圖片描述
爲了解決CPU與主存的速度差異引入了高速緩存。其中,寄存器、高速緩存、主存儲器都屬於操作系統存儲管理,在發生故障停電的話,其中的數據就消失了,其他更底層的比如磁盤則屬於設備管理,信息可以長期保存。
但是,對於寄存器、主存和輔存的訪問機制是不同的。寄存器、主存又被稱爲可執行存儲器,進程可以通過很少的週期通過指令訪問。對於輔存,那是通過設備管理的,要通過I/O設備實現訪問,經過I/O設備的話就涉及到中斷、設備驅動程序、以及物理設備等,所以速度相對可執行存儲器來說要慢要幾個數量級。所以這也是我們平常寫的程序要加載到內存執行的原因之一吧!

二 存儲器的分配方式

我們都知道用戶程序需要裝入到內存中才能運行,那麼存儲器怎樣爲用戶程序分配存儲空間,如何對內存進行管理。如下有四種管理方式

1. 連續分配存儲管理

連續分配方式是最早出現的存儲器分配,該方式爲用戶程序分配連續的內存空間,即程序代碼或數據的邏輯地址相鄰,體現爲物理地址的相鄰,連續分配又分爲四類

  • A. 單一連續分配

    最早的單道程序環境,存儲器管理方式把內存分爲系統區和用戶區,系統區OS使用,用戶 區只有一道用戶程序,整個用戶區都是這個程序的,所以就是單一連續分配。

  • B. 固定分區分配

    多道程序系統的出現,使得需要在內存中裝入多道程序,但程序之間相互之間不能干擾,所以就將用戶空間分爲若干個固定大小區域,每個區域裝入一道作業。在爲用戶空間劃定大小區域時可以分成大小相等的,那麼程序太小時就太浪費空間,如果太大就無法運行,另一種就是不等的大小空間,這樣可以根據不同作業選擇空間。大體如圖所示:
    在這裏插入圖片描述

  • C. 動態分區分配
    動態分區分配言外之意就是要根據進程的實際需要而分配內存空間,那麼這個 過程就要涉及管理空間的數據結構,分配算法,以及分配和回收的問題。
    數據結構
    通過一個數據結構來描述空閒分區和已分配空間,通常有空閒分區表和空閒分區鏈兩種,如下圖所示:
    在這裏插入圖片描述
    在這裏插入圖片描述
    分配算法
    程序裝入內存,肯定要經過某種算法從空閒分區表或者分區鏈選擇分區,這個所說的算法就有七種:基於順序搜索的有:首次適應(FF)、循環首次適應(NF)、最佳適應(BF)、最壞適應(WF);基於索引搜索的有快速適應、夥伴系統、哈希算法

  • D. 動態可重定位分區分配
    採用上述的方法肯定回造成碎片而導致浪費,所有這裏採用移動的方式將程序緊湊,碎片就可以拼接成大空間,但是這樣的話會導致程序和數據的地址發生改變,所以引入了動態重定位。
    在這裏插入圖片描述
    動態重定位:在程序裝入內存時仍然採用相對地址,當指令真正執行的時候才藉助重定位寄存器將相對地址轉化爲絕對地址。
    在這裏插入圖片描述

2. 對換技術

對換技術又稱爲交換技術,在以前內存很小的時候爲了讓多道程序運行,程序存儲在磁盤,加載一道程序到內存運行,CPU時間片結束過後調到磁盤然後調度另一道程序,進程具體的換出換入操作這裏不討論。

3. 分頁存儲管理

前面說的連續分配方式會產生很多的碎片,雖然緊湊可以解決,但是需要很大的開銷,於是就出現將進程分散的裝入不相鄰的分區的想法,這樣就不會有碎片了。基於這種思想出現了分頁存儲管理、分段存儲管理、段頁式存儲管理。
分頁存儲管理中,將用戶程序的地址空間分爲若干個大小相同的區域成爲頁,大小一般是1KB,然後內存空間頁分爲若干個塊,頁和塊的大小相同,通過這種方式任何頁都可以放入任何塊,達到離散分配的目的。以下介紹來自百度百科。
頁面

  1. 頁面和物理塊
    分頁存儲管理是將一個進程的邏輯地址空間分成若干個大小相等的片,稱爲頁面或頁,併爲各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把內存空間分成與頁面相同大小的若干個存儲塊,稱爲(物理)塊或頁框(frame),也同樣爲它們加以編號,如0#塊、1#塊等等。在爲進程分配內存時,以塊爲單位將進程中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於進程的最後一頁經常裝不滿一塊而形成了不可利用的碎片,稱之爲“頁內碎片”。
  2. 頁面大小
    在分頁系統中的頁面其大小應適中。頁面若太小,一方面雖然可使內存碎片減小,從而減少了內存碎片的總空間,有利於提高內存利用率,但另一方面也會使每個進程佔用較多的頁面,從而導致進程的頁表過長,佔用大量內存;此外,還會降低頁面換進換出的效率。然而,如果選擇的頁面較大,雖然可以減少頁表的長度,提高頁面換進換出的速度,但卻又會使頁內碎片增大。因此,頁面的大小應選擇適中,且頁面大小應是2的冪,通常爲512 B~8 KB。
    地址結構
    分頁地址中的地址結構如下:在這裏插入圖片描述

對於某特定機器,其地址結構是一定的。若給定一個邏輯地址空間中的地址爲A,頁面的大小爲L,則頁號P和頁內地址d可按右圖所示公式求得:
在這裏插入圖片描述
其中,INT是整除函數,MOD是取餘函數。例如,其系統的頁面大小爲1 KB,設A = 2170 B,則由上式可以求得P = 2,d = 122。
頁表
在分頁系統中,允許將進程的各個頁離散地存儲在內存不同的物理塊中,但系統應能保證進程的正確運行,即能在內存中找到每個頁面所對應的物理塊。爲此,系統又爲每個進程建立了一張頁面映像表,簡稱頁表。在進程地址空間內的所有頁(0~n),依次在頁表中有一頁表項,其中記錄了相應頁在內存中對應的物理塊號,見右圖的中間部分。在配置了頁表後,進程執行時,通過查找該表,即可找到每頁在內存中的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的地址映射。

4. 分段存儲管理

分頁式存儲管理很好的提高了內存的利用率,那麼分段式存儲則是從程序員的角度出發,方便程序員的開發。
通常,我們的程序本身都可以分爲若干個段,主程序段,子程序段,數據段,棧段,如果你學了彙編會有更深刻的體會。再一個就是我們信息的共享、保護、動態連接等也都是以段爲單位,所以分段存儲管理更符合程序員的需要。
基本原理(來自百度百科)
分段
在分段存儲管理方式中,作業的地址空間被劃分爲若干個段,每個段定義了一組邏輯信息。例如,有主程序段MAIN、子程序段X、數據段D及棧段S等,如圖4-17所示。每個段都有自己的名字。爲了實現簡單起見,通常可用一個段號來代替段名,每個段都從0開始編址,並採用一段連續的地址空間。段的長度由相應的邏輯信息組的長度決定,因而各段長度不等。整個作業的地址空間由於是分成多個段,因而是二維的,亦即,其邏輯地址由段號(段名)和段內地址所組成。
分段地址中的地址具有如下結構:在這裏插入圖片描述

在該地址結構中,允許一個作業最長有 64 K個段,每個段的最大長度爲64 KB。 分段方式已得到許多編譯程序的支持,編譯程序能自動地根據源程序的情況而產生若干個段。例如,Pascal編譯程序可以爲全局變量、用於存儲相應參數及返回地址的過程調用棧、每個過程或函數的代碼部分、每個過程或函數的局部變量等等,分別建立各自的段。類似地,Fortran編譯程序可以爲公共塊(Common block)建立單獨的段,也可以爲數組分配一個單獨的段。裝入程序將裝入所有這些段,併爲每個段賦予一個段號。
段表
在前面所介紹的動態分區分配方式中,系統爲整個進程分配一個連續的內存空間。而在分段式存儲管理系統中,則是爲每個分段分配一個連續的分區,而進程中的各個段可以離散地移入內存中不同的分區中。爲使程序能正常運行,亦即,能從物理內存中找出每個邏輯段所對應的位置,應像分頁系統那樣,在系統中爲每個進程建立一張段映射表,簡稱“段表”。每個段在表中佔有一個表項,其中記錄了該段在內存中的起始地址(又稱爲“基址”)和段的長度,如右圖所示。段表可以存放在一組寄存器中,這樣有利於提高地址轉換速度,但更常見的是將段表放在內存中。
在這裏插入圖片描述

5. 段頁式存儲管理

分頁系統能提高內存的利用率,分段系統能夠滿足用戶的需要,所以對兩種存儲方式“各取所長”,得到段頁式存儲管理方式(現在基本都在使用)。
基本原理
段頁式系統先將用戶程序分成若干個段,在把每個段分爲若干個頁。地址結構就由段號段內頁號,以及頁內地址組成。段表內容略有不同,如果所示:通過這種方式將邏輯地址轉化爲物理地址。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章