操作系統 內存管理相關知識點介紹

在這裏插入圖片描述在這裏插入圖片描述
爲什麼會有內存管理??
隨着計算機的高速發展,計算機早已不是單道處理模式了,不再使用古老的紙帶打孔的方式,將持續輸入到cpu,讓其執行了,而是將程序加載到內存中去,那麼當多個程序同時運行的情況下,怎麼去給程序分配位置就是發明者要考慮的問題了。因此有了內存管理這種說法,
內存管理的目標有兩點

  1. 地址保護:一個程序不能訪問另一個程序的地址空間
  2. 地址獨立:程序發出的地址應與物理地址沒有直接關係

虛擬地址映射到物理內存
現代系統是爲每一個進程提供了一個虛擬地址空間,以方便管理,同時方便共享內核空間的代碼。(儘管用戶空間的代碼很可能不同,至少數據會不一樣)
簡而言之,就是16位寄存器無法存入20位地址,那麼通過兩個寄存器的相互配合,就能解決這一問題,那麼分段就是必然手段。
1. 實模式尋址方式
2. 保護模式尋址方式

一: 虛擬地址, 邏輯地址

邏輯地址(Logical Address): 是指由程序產生的與段相關的偏移地址部分。是CPU所生成的地址。邏輯地址是內部和編程使用的、並不唯一。
例如,在進行C語言指針編程中,可以讀取指針變量本身值(&操作),實際上這個值就是邏輯地址,它是相對於你當前進程數據段的地址,不和絕對物理地址相干。
操作系統爲什麼要引入虛擬地址?
在早期的計算機中,要運行一個程序,會把這些程序全都裝入內存,程序都是直接運行在內存上的,也就是說程序中訪問的內存地址都是實際的物理內存地址。當計算機同時運行多個程序時,必須保證這些程序用到的內存總量要小於計算機實際物理內存的大小。那當程序同時運行多個程序時,操作系統是如何爲這些程序分配內存的呢?下面通過實例來說明當時的內存分配方法:
某臺計算機總的內存大小是128M,現在同時運行兩個程序A和B,A需佔用內存10M,B需佔用內存110。計算機在給程序分配內存時會採取這樣的方法:先將內存中的前10M分配給程序A,接着再從內存中剩餘的118M中劃分出110M分配給程序B。這種分配方法可以保證程序A和程序B都能運行,但是這種簡單的內存分配策略問題很多。
問題1:進程地址空間不隔離。由於程序都是直接訪問物理內存,所以惡意程序可以隨意修改別的進程的內存數據,以達到破壞的目的。有些非惡意的,但是有bug的程序也可能不小心修改了其它程序的內存數據,就會導致其它程序的運行出現異常。這種情況對用戶來說是無法容忍的,因爲用戶希望使用計算機的時候,其中一個任務失敗了,至少不能影響其它的任務。

問題2:內存使用效率低。在A和B都運行的情況下,如果用戶又運行了程序C,而程序C需要20M大小的內存才能運行,而此時系統只剩下8M的空間可供使用,所以此時系統必須在已運行的程序中選擇一個將該程序的數據暫時拷貝到硬盤上,釋放出部分空間來供程序C使用,然後再將程序C的數據全部裝入內存中運行。可以想象得到,在這個過程中,有大量的數據在裝入裝出,導致效率十分低下。

問題3:程序運行的地址不確定。當內存中的剩餘空間可以滿足程序C的要求後,操作系統會在剩餘空間中隨機分配一段連續的20M大小的空間給程序C使用,因爲是隨機分配的,所以程序運行的地址是不確定的。
  
虛擬地址和分段的由來
      爲了解決上述問題,人們想到了一種變通的方法,就是增加一個中間層,利用一種間接的地址訪問方法訪問物理內存。按照這種方法,程序中訪問的內存地址不再是實際的物理內存地址,而是一個虛擬地址,然後由操作系統將這個虛擬地址映射到適當的物理內存地址上。這樣,只要操作系統處理好虛擬地址到物理內存地址的映射,就可以保證不同的程序最終訪問的內存地址位於不同的區域,彼此沒有重疊,就可以達到內存地址空間隔離的效果。

       人們之所以要創建一個虛擬地址空間,目的是爲了解決進程地址空間隔離的問題。但程序要想執行,必須運行在真實的內存上,所以,必須在虛擬地址與物理地址間建立一種映射關係。這樣,通過映射機制,當程序訪問虛擬地址空間上的某個地址值時,就相當於訪問了物理地址空間中的另一個值。人們想到了一種分段(Sagmentation)的方法,它的思想是在虛擬地址空間和物理地址空間之間做一一映射。比如說虛擬地址空間中某個10M大小的空間映射到物理地址空間中某個10M大小的空間。這種思想理解起來並不難,操作系統保證不同進程的地址空間被映射到物理地址空間中不同的區域上,這樣每個進程最終訪問到的 物理地址空間都是彼此分開的。通過這種方式,就實現了進程間的地址隔離。

在這裏插入圖片描述
       這種分段的映射方法雖然解決了上述中的問題一和問題三,但並沒能解決問題二,即內存的使用效率問題。在分段的映射方法中,每次換入換出內存的都是整個程序,這樣會造成大量的磁盤訪問操作,導致效率低下。所以這種映射方法還是稍顯粗糙,粒度比較大。實際上,程序的運行有局部性特點,在某個時間段內,程序只是訪問程序的一小部分數據,也就是說,程序的大部分數據在一個時間段內都不會被用到。基於這種情況,人們想到了粒度更小的內存分割和映射方法,這種方法就是分頁(Paging)。

分頁
       分頁的基本方法是,將地址空間分成許多的頁。每頁的大小由CPU決定,然後由操作系統選擇頁的大小。目前Inter系列的CPU支持4KB或4MB的頁大小,而PC上目前都選擇使用4KB。按這種選擇,4GB虛擬地址空間共可以分成1048576個頁,512M的物理內存可以分爲131072個頁。顯然虛擬空間的頁數要比物理空間的頁數多得多。

       在分段的方法中,每次程序運行時總是把程序全部裝入內存,而分頁的方法則有所不同。分頁的思想是程序運行時用到哪頁就爲哪頁分配內存,沒用到的頁暫時保留在硬盤上。當用到這些頁時再在物理地址空間中爲這些頁分配內存,然後建立虛擬地址空間中的頁和剛分配的物理內存頁間的映射。

通過程序的裝入來認識分頁

       一個可執行文件(PE文件)其實就是一些編譯鏈接好的數據和指令的集合,它也會被分成很多頁,在PE文件執行的過程中,它往內存中裝載的單位就是頁。當一個PE文件被執行時,操作系統會先爲該程序創建一個4GB的進程虛擬地址空間。前面介紹過,虛擬地址空間只是一箇中間層而已,它的功能是利用一種映射機制將虛擬地址空間映射到物理地址空間,所以,創建4GB虛擬地址空間其實並不是要真的創建空間,只是要創建那種映射機制所需要的數據結構而已,這種數據結構就是頁目和頁表。

        當創建完虛擬地址空間所需要的數據結構後,進程開始讀取PE文件的第一頁。在PE文件的第一頁包含了PE文件頭和段表等信息,進程根據文件頭和段表等信息,將PE文件中所有的段一一映射到虛擬地址空間中相應的頁(PE文件中的段的長度都是頁長的整數倍)。這時PE文件的真正指令和數據還沒有被裝入內存中,操作系統只是根據PE文件的頭部等信息建立了PE文件和進程虛擬地址空間中頁的映射關係而已。當CPU要訪問程序中用到的某個虛擬地址時,當CPU發現該地址並沒有相相關聯的物理地址時,CPU認爲該虛擬地址所在的頁面是個空頁面,CPU會認爲這是個頁錯誤(Page Fault),CPU也就知道了操作系統還未給該PE頁面分配內存,CPU會將控制權交還給操作系統。操作系統於是爲該PE頁面在物理空間中分配一個頁面,然後再將這個物理頁面與虛擬空間中的虛擬頁面映射起來,然後將控制權再還給進程,進程從剛纔發生頁錯誤的位置重新開始執行。由於此時已爲PE文件的那個頁面分配了內存,所以就不會發生頁錯誤了。隨着程序的執行,頁錯誤會不斷地產生,操作系統也會爲進程分配相應的物理頁面來滿足進程執行的需求。

       分頁方法的核心思想就是當可執行文件執行到第x頁時,就爲第x頁分配一個內存頁y,然後再將這個內存頁添加到進程虛擬地址空間的映射表中,這個映射表就相當於一個y=f(x)函數。應用程序通過這個映射表就可以訪問到x頁關聯的y頁了。

final:動態分區算法

       動態分區分配是根據進程的實際需要,動態地爲之分配內存空間。在實現可變分區分配時,將涉及到分區分配中所用的數據結構分區分配算法分區的分配與回收操作這樣三個問題。

  • 首次適應算法(First Fit):

       將空閒分區鏈以地址遞增的順序連接;在進行內存分配時,從鏈首開始順序查找,直到找到一塊分區的大小可以滿足需求 時,按照該作業的大小,從該分區中分配出內存,將剩下的空閒分區仍然鏈在空閒分區鏈中。
假如:我們存一個大小爲5k的文件
在這裏插入圖片描述
優點
(1)高址部分的大的空閒分區得到保留,爲大作業的內存分配創造了條件;
缺點
(1)每次都是優先利用低址部分的空閒分區,造成低址部分產生大量的外碎片。
(2)每次都是從低址部分查找,使得查找空閒分區的開銷增大

  • 循環首次適應算法(Next Fit)

       分配內存時不是從鏈首進行查找可以分配 內存的空閒分區,而是從上一次分配內存的空閒分區的下一個分區開始查找,直到 找到可以爲該進程分配內存的空閒分區。

先分配一個4k的空間, 再分配一個3k的空間
因爲是從上一次的下一個分區開始找, 所以不會分配第一個空間, 而是第三個在這裏插入圖片描述

優點
(1)使得空閒分區分佈更加均勻

(2)空閒分區的查找開銷小
缺點
(1)高址部分的大空閒分區被分小,使得大作業進入無法分配內存;

  • 最佳適應算法(Best Fit)

       將空閒分區鏈中的空閒分區按照空閒分區由小到大的順序排序,從而形成空閒分區鏈。每次從鏈首進行查找合適的空閒分區 爲作業分配內存,這樣每次找到的空閒分區是和作業大小最接近的,所謂“最佳”.
在這裏插入圖片描述
優點
       第一次找到的空閒分區是大小最接近待分配內存作業大小的;

缺點:
        產生大量難以利用的外部碎片。

  • 最壞適應算法(Worst Fit)

       與最佳適應算法剛好相反,將空閒分區鏈的分區按照從大到小的順序排序形成空閒分區鏈,每次查找時只要看第一個空閒分區是否滿足即可。
在這裏插入圖片描述優點
效率高,分區查找方便;

缺點
當小作業把大空閒分區分小了,那麼,大作業就找不到合適的空閒分區。

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