對於一臺x86(32bit)的操作系統來說,假設它有2G的物理內存,物理內存分成以許多個4k爲單位大小的頁框,這些頁框就是存儲進程的最小單位:
爲了解決系統運行過程中不同進程之間內存的合理分配和利用,防止不同進程同一時刻在物理內存中運行而對物理內存的爭奪和踐踏(一旦某一進程失去控制,佔用的資源不停增大,就會將物理內存佔滿,並導致其他進程中斷,甚至導致服務器崩潰,這是及其危險的),我們採用了虛擬內存。
我們都知道,進程是用戶發起的運行在內核之上的用戶空間的程序,如下所示:
虛擬內存只是進程所看到的一個假象,實際進程運行過程中,進程還是通過物理內存上被CPU調用和執行的;線程是進程運行的最小單位,也是CPU運行和調用的最小單位。每一個進程可以包含多個線程,線程作爲CPU調用的最小單位被映射到物理內存中,如下所示:
線程映射到物理內存後,物理內存會分配指定的頁框給該線程,線程與頁框之間的映射是隨機的,非線性的。
隨着進程的增加,線程的數量也會增加,物理內存的空間有限,頁框將要用盡,物理內存空間幾乎會被佔滿,接近與上限,這時如果繼續運行下去,內存崩潰,服務器死機,將會產生不可預知的結果,那麼該怎麼解決這一問題呢?
於是,內核決定在硬盤上找一段存取速率較高的存儲空間,模擬物理內存,並將其內部劃分爲類似頁框的存儲小格子。當物理內存接近崩潰時,將物理內存中最近一段時間最少頻率使用到的頁框移出物理內存,放進該存儲空間,這段存儲空間我們稱之爲交換空間(Swap)。當新創建的進程3進入內存時,發現當前物理內存已經被佔滿,此時內核便需要交換空間來協調,如下:
圖中紅色方塊代表的線程爲最近一段時間使用最不頻繁的線程,
藍色方塊代表新創建的進程3包含的線程,黃色方塊代表磁盤上的swap分區
a) 內核首先將紅色線程移到swap分區,並取消進程1中該線程與物理內存的映射;
b) 隨即,將藍色線程移進物理內存中紅色進程剛騰出的空間。此時,進程3就獲得了系統內存資源,等待被CPU調用執行;
灰色進程代表當前內存中最近一段時間內使用最不頻繁的線程
c) 當紅色線程再次被喚醒時,內核會將灰色線程移到swap分區,取消該線程的映射;
d) 隨即,內核將紅色線程移進內存中灰色線程剛騰出的空間,並建立新的映射關係,獲取系統內存資源。
swap分區存在的意義在於:允許內存過載(overcommit)使用
儘管swap分區可以爲進程運行提供額外的交換空間,解決物理內存飽滿情況下協調系統進程正常運行的問題,但是使用交換空間所帶來的頁框進出會大大降低系統的性能,所以應謹慎使用交換空間。
交換空間和物理內存之間頁框的移動可以這樣描述: