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