一、什么是物理記憶體
物理記憶體又稱主存是計算機中重要的部件之一,物理記憶體其實就是插在計算機主板記憶體槽上的硬體設備,是CPU能直接尋址的存盤空間、與CPU進行溝通的橋梁,由半導體器件制成,計算機中所有程式的運行都是在記憶體中進行的,因此記憶體的性能對計算機的影響非常大,記憶體(Memory)也被稱為記憶體儲器,其作用是用于暫時存放CPU中的運算資料,以及與硬碟等外部存盤器交換的資料,只要計算機在運行中,CPU就會把需要運算的資料調到記憶體中進行運算,當運算完成后CPU再將結果傳送出來,記憶體的運行也決定了計算機的穩定運行,物理記憶體的容量是固定的,但是尋址空間卻取決于cpu地址線條數,如32位機,則尋址空間為2^32 = 4G,所以最大支只持4G的尋址空間,即使插了8G的記憶體條也只能使用4G記憶體,
現代作業系統為什么不讓行程直接使用物理記憶體?
- 記憶體空間利用率的問題:各個行程對記憶體的使用會導致記憶體碎片化,當要用malloc分配一塊很大的記憶體空間時,可能會出現雖然有足夠多的空閑物理記憶體,卻沒有足夠大的連續空閑記憶體這種情況,東一塊西一塊的記憶體碎片就被浪費掉了
- 讀寫記憶體的安全性問題:物理記憶體本身是不限制訪問的,任何地址都可以讀寫,由于程式都是直接訪問物理記憶體,所以惡意程式可以隨意修改別的行程的記憶體資料,以達到破壞的目的,有些非惡意的,但是有bug的程式也可能不小心修改了其它程式的記憶體資料,就會導致其它程式的運行出現例外,這種情況對用戶來說是無法容忍的,因為用戶希望使用計算機的時候,其中一個任務失敗了,至少不能影響其它的任務,
- 記憶體讀寫的效率問題:當多個行程同時運行,需要分配給行程的記憶體總和大于實際可用的物理記憶體時,需要將其他程式暫時拷貝到硬碟當中,然后將新的程式裝入記憶體運行,由于大量的資料頻繁裝入裝出,記憶體的使用效率會非常低
二、虛擬記憶體
虛擬記憶體:是計算機系統記憶體管理的一種技術,它使得應用程式認為它擁有連續可用的記憶體(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時存盤在外部磁盤存盤器上,在需要時進行資料交換,現代所有用于一般應用的作業系統都對普通的應用程式使用虛擬記憶體技術,
為了解決上述問題,現代作業系統就是采用虛擬記憶體的方式使程式中訪問的記憶體地址不再是實際的物理記憶體地址,而是一個虛擬地址,然后由作業系統將這個虛擬地址映射到適當的物理記憶體地址上,這樣,只要作業系統處理好虛擬地址到物理記憶體地址的映射,就可以保證不同的程式最終訪問的記憶體地址位于不同的區域,彼此沒有重疊,以此達到記憶體地址空間隔離的效果,
三、分段
人們之所以要創建一個虛擬地址空間,目的是為了解決行程地址空間隔離的問題,但程式要想執行,必須運行在真實的記憶體上,所以,必須在虛擬地址與物理地址間建立一種映射關系,這樣,通過映射機制,當程式訪問虛擬地址空間上的某個地址值時,就相當于訪問了物理地址空間中的另一個值,人們想到了一種分段(Sagmentation)的方法,它的思想是在虛擬地址空間和物理地址空間之間做一一映射,比如說虛擬地址空間中某個10M大小的空間映射到物理地址空間中某個10M大小的空間,這種思想理解起來并不難,作業系統保證不同行程的地址空間被映射到物理地址空間中不同的區域上,這樣每個行程最終訪問到的物理地址空間都是彼此分開的,通過這種方式,就實作了行程間的地址隔離,還是以實體說明,假設有兩個行程A和B,行程A所需記憶體大小為10M,其虛擬地址空間分布在0x00000000到0x00A00000,行程B所需記憶體為100M,其虛擬地址空間分布為0x00000000到0x06400000,那么按照分段的映射方法,行程A在物理記憶體上映射區域為0x00100000到0x00B00000,,行程B在物理記憶體上映射區域為0x00C00000到0x07000000,于是行程A和行程B分別被映射到了不同的記憶體區間,彼此互不重疊,實作了地址隔離,從應用程式的角度看來,行程A的地址空間就是分布在0x00000000到0x00A00000,在做開發時,開發人員只需訪問這段區間上的地址即可,應用程式并不關心行程A究竟被映射到物理記憶體的那塊區域上了,所以程式的運行地址也就是相當于說是確定的了,

到這里我們發現采用分段的方法處理虛擬記憶體與物理記憶體的映射關系,解決了行程間訪問物理記憶體的資源隔離問題,但是記憶體的讀寫效率和空間利用率的問題依然沒有解決,因為此種方式是直接按照虛擬地址映射物理地址,所以記憶體碎片會依然存在;行程切換時依然會整個行程行程磁盤與記憶體的置換,然而行程在實際運行某個指令或某個指令集合時,可能不需要該行程的全部資源,只需要根據區域性原理加載資源即可,對于不需要的資源我們依然把它留在磁盤中,按照這種思想人們設計了分頁的技術,
四、分頁
分頁的基本方法是,將地址空間分成許多的頁,每頁的大小由CPU決定,然后由作業系統選擇頁的大小,目前Inter系列的CPU支持4KB或4MB的頁大小,而PC上目前都選擇使用4KB,按這種選擇,4GB虛擬地址空間共可以分成1048576個頁,512M的物理記憶體可以分為131072個頁,顯然虛擬空間的頁數要比物理空間的頁數多得多,
在分段的方法中,每次程式運行時總是把程式全部裝入記憶體,而分頁的方法則有所不同,分頁的思想是程式運行時用到哪頁就為哪頁分配記憶體,沒用到的頁暫時保留在硬碟上,當用到這些頁時再在物理地址空間中為這些頁分配記憶體,然后建立虛擬地址空間中的頁和剛分配的物理記憶體頁間的映射,分頁的實質就是作業系統向行程描述了一個完整的連續的虛擬地址空間供行程使用,但是在物理記憶體中行程資料的存盤采用離散式存盤(提高記憶體利用率),虛擬地址與物理記憶體地址的映射關系采用頁表來維護,
五、頁表
頁表是一種特殊的資料結構,存放著各個虛擬頁的狀態,是否映射,是否快取.,行程要知道哪些記憶體地址上的資料在物理記憶體上,哪些不在,還有在物理記憶體上的哪里,這就需要用頁表來記錄,頁表的每一個表項分為兩部分,第一部分記錄此頁是否在物理記憶體上,第二部分記錄物理記憶體頁的地址(如果在的話),當行程訪問某個虛擬地址,就會先去看頁表,如果發現對應的資料不在物理記憶體中,則發生缺頁例外,

缺頁例外:行程要訪問的指令或資料地址在虛擬地址空間中沒有,或者沒有訪問權限;頁面中沒有建立虛擬地址與物理地址的映射關系,此時作業系統要發生缺頁例外,通過缺頁例外中斷機制將CPU的執行權讓出去,同時為該行程加載相對應的資源,
缺頁例外中斷:在請求分頁的程序中,如果訪問的頁面不再記憶體中,會產生一次缺頁中斷,在外存中找到所缺的一頁將其調入記憶體,缺頁中斷也是現代作業系統并發執行的一種重要手段,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/279153.html
標籤:Linux
下一篇:作業系統之I/O
