linux中的每個程序都有自己的虛擬位址空間。作業系統的乙個最重要的基本管理目的就是避免程序之間的相互影響。下面將介紹虛擬位址空間。
通過虛擬位址訪問記憶體有以下優勢:
某台計算機總的記憶體大小是 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 使用,因為是隨機分配的,所以程式執行的位址是不確定的。
作業系統採用
分段、分頁機制來實現虛擬記憶體空間到物理記憶體空間的對映和管理。
當程序建立時,每個程序都會有乙個自己的
4gb虛擬位址空間。要注意的是這個
4gb的位址空間是「虛擬」的,並不是真實存在的,而且每個程序只能訪問自己虛擬位址空間中的資料,無法訪問別的程序中的資料,通過這種方法實現了程序間的位址隔離。那是不是這
4gb的虛擬位址空間應用程式可以隨意使用呢?很遺憾,
windows
系統下,這個虛擬位址空間被分成了
4部分:
null
指標區、使用者區、
64kb
禁入區、核心區。應用程式能使用的只是使用者區而已,大約
2gb左右
(最大可以調整到
3gb)
。核心區為
2gb,核心區儲存的是系統執行緒排程、記憶體管理、裝置驅動等資料,這部分資料供所有的程序共享,但應用程式是不能直接訪問的。
計算機明明沒有那麼多記憶體(n個程序的話就需要n*4g)記憶體
建立乙個程序,就要把磁碟上的程式檔案拷貝到程序對應的記憶體中去,對於乙個程式對應的多個程序這種情況,浪費記憶體!
第二層理解
1. 每個程序的4g記憶體空間只是虛擬記憶體空間,每次訪問記憶體空間的某個位址,都需要由作業系統把位址翻譯為實際物理記憶體位址
2. 所有程序共享同一物理記憶體,每個程序只把自己目前需要的虛擬記憶體空間對映並儲存到物理記憶體上。
3. 程序要知道哪些記憶體位址上的資料在物理記憶體上,哪些不在,還有在物理記憶體上的**,需要用頁表來記錄
4. 頁表的每乙個表項分兩部分,第一部分記錄此頁是否在物理記憶體上,第二部分記錄物理記憶體頁的位址(如果在的話)
5. 當程序訪問某個虛擬位址,去看頁表,如果發現對應的資料不在物理記憶體中,則缺頁異常
6. 缺頁異常的處理過程,就是把程序需要的資料從磁碟上拷貝到物理記憶體中,如果記憶體已經滿了,沒有空地方了,那就找乙個頁覆蓋,當然如果被覆蓋的頁曾經被修改過,需要將此頁寫回磁碟
所有程序共享統一物理記憶體理解示意圖:
程序位址空間與虛擬儲存空間的理解
在進入正題前先來談談作業系統記憶體管理機制的發展歷程,了解這些有利於我們更好的理解目前作業系統的記憶體管理機制。一 早期的記憶體分配機制 在 早期的計算機中,要執行乙個程式,會把這些程式全都裝入記憶體,程式都是直接執行在記憶體上的,也就是說程式中訪問的記憶體位址都是實際的物理記憶體位址。當計算機同時...
程序位址空間與虛擬儲存空間的理解
筆記 程式編譯後檔案包含程序空間資訊,執行的時候並不是完全載入記憶體,是按分頁訪問到哪個頁面才載入虛擬記憶體位址對映到得物理記憶體位址空間。在進入正題前先來談談作業系統記憶體管理機制的發展歷程,了解這些有利於我們更好的理解目前作業系統的記憶體管理機制。一 早期的記憶體分配機制 在早期的計算機中,要執...
程序位址空間與虛擬儲存空間的理解
在進入正題前先來談談作業系統記憶體管理機制的發展歷程,了解這些有利於我們更好的理解目前作業系統的記憶體管理機制。一早期的記憶體分配機制 在 早期的計算機中,要執行乙個程式,會把這些程式全都裝入記憶體,程式都是直接執行在記憶體上的,也就是說程式中訪問的記憶體位址都是實際的物理記憶體位址。當計算 機同時...