您好,登錄后才能下訂單哦!
這篇文章主要介紹了Linux的虛擬內存怎么理解的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Linux的虛擬內存怎么理解文章都會有所收獲,下面我們一起來看看吧。
為了正確的理解虛擬內存管理器的工作原理,磨刀不誤砍柴工,我們先來了解一下虛擬內存的組成。雖然對于虛擬內存低層級組成概念很有益處,但是有必要更深入地了解虛擬內存如何工作以及怎樣才能優化其性能。
圖表1. 高級虛擬內存子系統組成圖
Linux系統中的虛擬內存子系統復雜極其復雜,但是我們可以通過下面的組件更深入地了解虛擬內存:
內存管理單元(MMU, Memory Management Unit,下面簡稱MMU)是作為實現虛擬內存系統的物理硬件基礎,MMU可以允許軟件通過一個別名的地址跟物理地址建立映射,通常是多于一個。這是通過使用分頁(pages)和分頁表(分頁表:分頁表是一種數據結構,為使用電腦操作系統之虛擬內存技術,將內存空間切割成分頁的形式,用于儲存虛擬內存及實體內存間的對應). MMU再使用一部分內存,通過一系列的查找表(Table lookups)來翻譯虛擬地址到物理地址的映射。
Zoned Buddy Allocator (暫譯為:區域內存分配器 沒有找到中文標準的翻譯, Buddy Allocator暫譯為友內存分配器)
區域內存分配器負責整個虛擬內存系統分頁存儲管理。 這部分代碼管理連續物理內存分頁的鏈表并且讓他們映射到MMU的分頁表(page tables),當其他系統和核心子系統請求分配物理地址的時候,由其提供有效的物理地址(物理地址到虛擬內存地址的映射是被虛擬內存系統較高層處理的)。通過友內存分配器的名字我們就可以推斷出子系統用來維護空閑列表的算法。所有在內存中的物理分頁是被友內存分配器分類和分組進入列表的。每一個列表代表了2n分頁個的簇,這里的n會隨著每個逐步自增。如果在請求列表中沒有任何請求,下一個里誒包的請求將會被分在兩個隔離的簇中并且在下一個請求到達的時候返回給請求者。當分配返回請求給到好友分配器友內存分配器的時候,反轉處理便開始了;注意到友內存分配器也管理著定義不同用途的內存池的內存區域。目前友內存分配器能夠管理進入一下三種內存池:
DMA-這個區域包含內存最開始的16MB空間,這部分是作為遺留設備(legacy devices)用作直接對內存進行操作的空間的。
NORMAL-這部分區域包括接下來的16MB到1GB的內存地址,被用作內核的內部數據結構以及系統和用戶的空間來分配使用。
HIGHMEM-這部分區域包含1GB以上的地址,被專門留給操作系統分配使用(如文件系統緩沖,用戶空間分配,等等)。
Slab分配器提供了一種可用性更高的前端實現來配合Buddy(伙伴算法)分配器,它主要用來應對內核中某些部分需求大小更加靈活內存(并非常用的4KB)的請求。Slab分配器允許內核組件創建給定大小的內存對象緩存。Slab分配器負責將盡可能多的緩存對象放在一頁并且監控哪些對象已經釋放,哪些內存已經被分配。當有內存分配請求但是頁面中沒有內存可用時,Slab分配器會向Buddy分配器請求更多的頁來滿足分配請求。這就使得內核組件用一種更簡單的方法來使用內存。使用這種方法,很多只利用一小部分內存的組件就不需要各自獨立實現內存管理的代碼,從而不需要浪費很多的頁。Slab分配器只可能從DMA和NORMAL區域分配內存。
最后一個虛擬內存子系統的組件是內核線程,包括:kscand, kswapd, kupdated, 和bdflush。這些線程負責正在使用的內存的恢復和管理。虛擬內存中的所有頁面都有一個關聯的狀態(更多關于內存狀態機的信息請參考"頁面的生命周期"章節)一般來說,內核中虛擬內存相關的活躍線程負責嘗試將頁面移出RAM的操作。它們定期的檢查RAM,嘗試識別和釋放非活躍的內存,從而使得這一部分內存可以在系統中另作他用。
所有由虛擬內存管理的內存都會被一個狀態標記。這些狀態幫助虛擬內存知道在各種各樣的情形下對給定的頁面該做些什么。依賴于當前系統的需要,虛擬內存可能依據狀態機(圖示2. "虛擬內存頁面狀態機")將頁面從一種狀態轉移到下一個狀態。利用這些狀態, 虛擬內存可以決定操作系統在某個時間對某個頁面做了什么,并且它還可以決定對這個頁面做什么操作。這些有特殊意義的狀態如下所示
1.FREE —— 所有可被分配的頁面從這個狀態開始。這個狀態告訴虛擬內存本頁面沒有被用于任何目的,并且可分配。
2.ACTIVE —— 頁面已經被Buddy分配器分配了之后進入ACTIVE狀態。這個狀態告訴虛擬內存本頁面已經被分配,并且它已經被內存進程或者用戶進程所使用。
3. INACTIVE DIRTY —— 這個狀態預示著本頁面已經被要求分配它的進程所拋棄,并且它成為將要從主存中被剔除的候選者。kscand任務會定期掃描內存中的頁面,并記下頁面自從最后一次訪問的到當前呆在內存的總時間。如果kscand任務發現自從上次它掃面這個頁面以來,這個頁面有被訪問,它會增加這個頁面的年齡計數器的值,否則,它會減少這個頁面的年齡計數器的值。當kscand任務發現這個頁面的年齡計數器的值為0,它會將這個頁面的狀態置成INACTIVE DIRTY狀態。在INACTIVE DIRTY狀態下的頁面被保存在將要被清除的頁面列表里面。
4. INACTIVE LAUNDERED —— 這是一個臨時的狀態,在這個狀態下的頁面已經被選擇出要從主存中剔除,與此同時這個頁面的內容將被保存在磁盤上。只有在INACTIVE DIRTY狀態下的頁面才能進入這個狀態。一旦磁盤I/O操作(寫磁盤操作)完成,這個頁面的狀態轉移到INACTIVE CLEAN,在INACTIVE CLEAN 狀態下,這個頁面可能會被釋放或者由于其他目的而被重寫。如果在(寫)磁盤操作期間,這個頁面被訪問了, 它的狀態將變成ACTIVE。
5. INACTIVE CLEAN —— 這個狀態下的頁面已經被從內存中清除了。這意味著此頁面的內容已經同步到磁盤上。從而,此頁面可能會被虛擬內存釋放或者由于其他目的而被重寫。
關于“Linux的虛擬內存怎么理解”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Linux的虛擬內存怎么理解”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。