操作系統總結(一)——虛擬內存


1.操作系統內存管理(虛擬內存)

1.1 虛擬內存的概念

操作系統為每個進程分配獨立的一套虛擬地址,這就是虛擬內存。虛擬內存是一個抽象概念,它為每個進程提供了一個假象,即每個進程都在獨占地使用主存,每個進程看到的內存都是一致的,稱為虛擬地址空間。虛擬內存在主存中只保存活動區域,並根據需要在磁盤和主存之間來回傳送數據,由於每個進程的地址空間一致,從而簡化了內存管理,也保護了每個進程的地址空間不被其他進程破壞

操作系統提供一種機制,將不同的進程的虛擬地址和不同內存的物理地址映射起來。當程序訪問虛擬地址的時候,由操作系統轉換成不同的物理地址。

  • 程序所使用的內存地址叫做虛擬內存地址。

  • 實際存在硬件里面的空間地址叫物理內存地址。

Linux進程的虛擬空間地址如圖所示,在Linux中,地址空間最上面的區域是保留給操作系統中的代碼和數據的,這對所有進程來說都是一樣。地址空間的底部區域存放用戶進程定義的代碼和數據,注意圖中的地址是從下往上增大的

每個進程看到的虛擬地址空間由大量准確定義的區構成,從上到下分別是:

1)程序代碼和數據

2)堆

3)共享庫

4)棧

5)內核虛擬內存

 

1.2 內存分段

由於程序是由若干個段組成的(棧、段、代碼段等),所以操作系統用分段的形式管理物理地址和虛擬地址,虛擬地址通過段表與物理地址映射。但是內存分段存在內存碎片和內存交換效率低的問題。

內存碎片:

  • 外部內存碎片,也就是產生了多個不連續的小物理內存,導致新的程序無法被裝載

  • 內部內存碎片,程序所有的內存都被裝載到了物理內存,但是這個程序有部分的內存可能並不是很常使用,這也會導致內存的浪費。

例如操作系統空閑內存為256MB,被分成了2段128MB的內存,那么將無法打開一個200MB的程序,如圖所示:

解決外部內存碎片的問題就是內存交換。將已經使用的內存一部分寫入到硬盤上,再從硬盤讀回到內存里,讀回時緊挨着最上面的512MB的內存,這樣就能空出256MB的連續內存。在Linux系統里,存在內存交換空間,也就是Swap空間,這塊空間是從硬盤里划分出來的,用於內存與硬盤的空間交換。

內存交換效率低:

對於多進程的系統,用分段的方式,內存碎片是很容易產生的,產生了內存碎片,那不得不重新Swap內存區域,每一次內存交換,都需要把大段連續的內存數據寫到硬盤里上,硬盤的訪問速度又很慢,嚴重影響效率。

 

1.3 內存分頁

為了更好的管理內存,操作系統將內存抽象成地址空間。每個程序擁有自己的地址空間,這個地址空間被分割成多個塊,每一塊稱為一頁。在Linux下,每一頁的大小為4KB。這些頁被映射到物理內存,但不需要映射到連續的物理內存,也不需要所有頁都必須在物理內存中。當程序引用到不在物理內存中的頁時,由硬件執行必要的映射,將缺失的部分裝入物理內存並重新執行失敗的指令。虛擬內存允許程序不用將地址空間中的每一頁都映射到物理內存,也就是說一個程序不需要全部調入內存就可以運行

虛擬內存被組織為一個由存放在磁盤上的N個連續的字節大小的單元組成的數組。每個字節都有唯一的虛擬地址,作為數組的索引。VM系統通過將虛擬內存分割為稱為虛擬頁的大小固定的塊來處理這個問題,類似的,物理內存被分割為物理頁。在任意時刻,虛擬頁面的稽核都分為三個不想交的子集:

1)未分配的:VM系統還未分配的頁,未分配的塊沒有任務數據和它們相關聯,因此也就不占用任何的磁盤空間。

2)緩存的:當前已緩存在物理內存中的已分配頁。

3)未緩存的:未緩存在物理內存中的已分配頁。

頁表是存儲在內存的,內存管理單元(MMU)做將虛擬地址轉換成物理地址的工作。通常用術語DRAM緩存來表示虛擬內存系統的緩存,它在主存中緩存虛擬頁。頁表用於將虛擬頁映射到物理頁,虛擬內存地址分為頁號和偏移量,每次地址翻譯硬件將一個虛擬地址轉換為物理地址時,都會讀取頁表。頁表就是一個頁表條目(PTE)的數組。虛擬地址空間中的每個頁在頁表中一個固定的偏移量處都有一個PTE。PTE是由一個有效位和一個n位地址字段組成的,有效位表明了該虛擬頁是否被緩存在DRAM中。從頁表查詢物理頁號,再加上偏移量,即可得到物理內存地址。一個常見的頁表如圖所示:

上圖展示了一個由8個虛擬頁和4個物理頁的頁表。其中:

1)VP 1、VP 2、VP 4和VP 7當前被緩存在DRAM中

2)VP 0和VP 5還未被分配

3)VP3 和VP 6已經被分配了,但還未被緩存。

因為DRAM緩存是全相關聯的,所以任意物理頁都可以包含任意虛擬頁

內存分頁是操作系統事先將內存空間分割好的,所以減少了內存碎片,提高了內存利用率。如果內存空間不足,操作系統會將某個內存釋放並暫時寫到硬盤上,需要的時候再加載進內存,由於每次寫入磁盤的只有少數幾頁,所以內存交換的效率較高。使用分頁的方式,也不用一次性把程序都加載到物理內存中,可以在程序運行時再加載。

 

1.4 頁面置換算法

在地址映射過程中,若在頁面中發現所要訪問的頁面不在內存中,當操作系統發生缺頁中斷時,如果操作系統內存中沒有空閑頁面,則操作系統必須在內存選擇一個頁面將其移出內存,以便為即將調入的頁面讓出空間,而用來選擇淘汰哪一頁的規則叫做頁面置換算法。

常見頁面置換算法總結如下表:

算法名稱 算法規則 算法優缺點
最佳置換算法(OPT) 優先淘汰最長時間內不會被訪問的頁面 缺頁率最小,性能最好;但無法實現
先進先出置換算法(FIFO) 優先淘汰最先進入內存的頁面 實現簡單;但性能很差,可能出現Belady異常(缺頁率提高)
最近最久未使用算法(LRU) 優先淘汰最近最久沒訪問的頁面 性能很好;但需要硬件支持,算法開銷大
時鍾頁面置換算法(Clock) 循環掃描各頁面 第一輪淘汰訪問位=0的,並將掃描過的頁面訪問位改為1。若第-輪沒選中,則進行第二輪掃描。 實現簡單,算法開銷小;但未考慮頁面是否被修改過。
最不常用法(LFU) 優先淘汰訪問次數最少的頁面 一個頁面在一開始頻繁訪問,后續就不訪問了。會導致內存利用率不高。

 

1.5 Linux虛擬內存系統

Linux主要采用頁式內存管理,但是Linux也為每個進程維護了一個單獨的虛擬地址空間,形式如圖所示。

1)Linux虛擬內存區域

Linux將虛擬內存組織成一些段的集合,一個段就是已經存在着的(已分配的)虛擬內存的連續片。

2)內存映射

Linux通過將一個虛擬內存區域與一個磁盤上的對象關聯起來,以初始化這個虛擬區域的內容,這個過程稱為內存映射,虛擬內存區域可以映射到如下兩種類型的對象中的一種:

  • Linux文件系統中的普通文件。一個區域可以映射到一個普通磁盤文件的連續部分,例如一個可執行目標文件。

  • 匿名文件。一個區域也可以映射到一個匿名文件,匿名文件時由內核創建的,包含的全是二進制零。

 

參考:

  1. 《深入理解計算機系統》

  2. 《圖解系統》- 小林coding

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM