提出四個問題及解答:
1)若進程在運行過程中,實體記憶體不足會發生什嗎?
2)為何進程在佔用實體記憶體不變的情況下,系統的實體記憶體會增加?
3)為何程式的大小大於實際佔用的實體記憶體?(假如程式30M,卻只有20M實體記憶體)
問題一:
與第一個問題相關的是一個swap的概念,簡單來說就是將根據某一演算法將部分實體記憶體頁交換到硬碟或者其他存放裝置,空出的記憶體頁就可以為進程使用。
1)記憶體頁在此可分為兩種不同屬性,一種為不可寫的記憶體頁(cache、程式的text段,共用庫的記憶體映像以及唯讀資料檔案等),一種為可寫的記憶體頁(進程資料、棧)等。
2)對不可寫的記憶體頁,可以簡單的丟棄,因為記憶體頁中的資料在需要的時候可以重新讀入;對可寫的記憶體頁,在swap時,必須將它儲存在swap file中,後續在使用的時候可以重新讀回。
問題二:
與第二個問題相關的是cache的概念,一般的平台都會有硬體cache,這是彌合cpu速率和記憶體讀取速率的利器,有了它程式才能執行的夠快。與此問題相關的cache則是一個cache buffer的概念。
1)buffer cache主要是為塊裝置驅動使用
問題三:
與第三個問題相關的是虛擬儲存的概念,進程在32位linux系統中記憶體位址空間大小為4G,實體記憶體可以遠小於4G(如512M),實現虛擬儲存主要是由linux的記憶體管理完成的(如線性地址到物理地址的映射等)。
1)要解釋問題三,除了虛擬儲存的概念外還需要兩種技術,demand paging技術 和 問題1中的提到的swap
2)程式在開始執行時,開始只分配地址空間,並沒有實際的實體記憶體分配,在需要用到時才分配記憶體頁(demand paging技術),所以不執行的程式部分不會被匯入記憶體。
問題四:
與第四個問題相關的是延遲分配技術,linux總是認為使用者需要的進程記憶體不是緊要的,在不對此記憶體進行操作的時候,並沒有實際的實體記憶體分配給它。單純的malloc介面只是進程地址空間的一個說明。
http://www.thegeekstuff.com/2012/02/linux-memory-swap-cache-shared-vm/