大話操作系統(2)內存管理

December 15, 2015 11:54 AM

程序運行是執行一條條指令,指令存放在存儲器裏,有的存儲器讀寫快,但是容量低,比如緩衝,有的存儲器容量大,但是讀寫速度慢,如硬盤,還有的性能介於兩者之間,比如內存。我們希望所有的指令都最好放在緩衝,這樣速度就會很快,但是,一方面緩衝容量小,另一方面比較昂貴,不可能所有指令都放在緩衝裏,這樣就需要有一個機制對這些不同的存儲器進行管理,以適應不同情況下的內存分配,這便是即將提到的內存管理

內存管理主要達到兩個目標:
1.地址保護,即一個進程不能不能訪問兩一個進程的地址空間,使得不同進程互不干擾的工作;
2.地址獨立,程序指令的地址(虛擬地址)應該是與物理主存地址無關的,這樣保證在不同的硬件平臺上均可以穩定的工作,我們事先不能確定在不同硬件平臺上確定分配的物理地址。

虛擬內存技術:
程序執行要先載入內存在執行,以提升運行速度,現在的普通計算主存相對硬盤都很小,不可能一下將程序都直接載入內存中執行,那怎麼解決這個問題呢?將磁盤空間看成主存的一部分,用戶程序存放於磁盤上相當於存放於主存內。程序執行時虛擬內存儘量從緩衝滿足用戶的需求。

多通道內存管理
程序加載到內存完畢後,計算物理地址(基地址),即動態地址翻譯。程序運行實際的物理地址是基地址和虛擬地址的和,如果地址超過指定的極限,被視爲地址出界而禁止訪問,否則正常訪問。
分頁:內存被不同的進程分割成尺寸大小不一的空間,一段時間後會產生散佈在進城之間的外部碎片。比如第一個進程使用了的200Kb的內存空間,執行完成釋放掉後,接下來可能會有一個180Kb的進程使用該空間,但是剩下的20Kb就不太好再分配出去,類似的情況很常見,就會在內存空間產生很多這樣的碎片。爲此,對內存進行分頁,即將內存按照某種規定的大小進行分配,每一個部分稱爲一頁,然後按頁進行內存分配,一個虛擬頁面可以分配到任意一個物理頁面。一個程序每次只加載當前需要的部分,其餘部分放在磁盤上,如果需要更多的空間,爲其分配一個頁即可。虛擬地址由頁面號號頁內偏移量組成。頁表提供虛擬頁面到物理頁面的映射。頁面越大,內部碎片就越大,浪費就越多。
內存抖動,對一個不在內存的頁面訪問,會產生缺頁中斷,內存沒有可用空間,變爲磁盤訪問,速度慢一百萬倍,整個系統速率急劇下降,這種現象叫內存抖動。
頁面更換:在運行時,一個程序的所有頁面並不一定都在內存中,因此在執行過程中就會出現某個頁面不在內存的情況,此時此生缺頁中斷,中斷服務程序負責將位於磁盤的數據加載到物理內存,如果有空閒頁面,直接使用,如果沒有,挑選某個使用過的進行替換。
頁面更換準則:
公平算法:

  • 隨機算法
  • FIFO
  • 第二次機會(FIFO+使用頻率)
  • 時鐘算法(頁面訪問爲爲0,替換,不爲0,清0,找一下個)

非公平:

  • 列表內容
  • 最優
  • NRU(最近未使用)
  • LRU(最近使用最少)
  • 工作集(尋找一個不屬於當前工作集的頁面)

段式內存管理:按照邏輯單元分成多個段,每個段使用自己獨立的虛地址空間,如符號表、代碼段、常數表、詞法樹、調用棧。同時方便共享,一個段全部共享或者全部不共享(分頁無法做到)。

分段 分頁
一個邏輯單元對應一個虛擬地址空間,程序編寫長度不受限 一個程序最多隻能和一個虛擬空間一樣大
方便共享 不方便共享
容易產生外部碎片 沒有外部碎片

段頁式內存管理:結合兩種管理方式的優點,將程序分爲多個段,段內又進行分頁管理。

發佈了30 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章