歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> FreeBSD中的物理內存管理

FreeBSD中的物理內存管理

日期:2017/2/28 11:16:22   编辑:關於Unix


物理內存通過結構體vm_page_t以頁為基礎進行管理。物理內存的頁由它們各自對應的結構體vm_page_t所代表,這些結構體存放在若干個頁管理隊列中的一個裡面。 一頁可以處於穿線(wired)、活動(active),去活(inactive)、緩存(cache)、自由(free)狀態。除了穿線狀態,頁一般被放置在一個雙向鏈表隊列裡,代表了它所處的狀態。穿線頁不放置在任何隊列裡。
FreeBSD為緩存頁和自由頁實現了一個更為復雜的頁隊列機制,以實現對頁的分類管理。每一種狀態都對應著多個隊列,隊列的安排對應著處理器的一級、二級緩存。當需要分配一個新頁時, FreeBSD會試圖把一個按一級、二級緩存對齊的頁面分配給虛擬內存對象。 此外,一個頁可以有一個引用計數,可以被一個忙計數鎖定。虛擬內存系統也實現了“終極鎖定”(ultimate locked)狀態,一個頁可以用頁標志PG_BUSY表示這一狀態。 總之,每個頁隊列都按照LRU(Least-Recently Used)的原則工作。
短語Least-Recently Used有兩種理解方式: 1.將“least-recently”理解為反向比較級,意義為“最早”,整個短語理解為 “最近的使用時間最早”;2.將“least”和“recently”理解為副詞,都修飾“used”,整個短語理解為“最近最少使用”。 這兩種理解方式的實際意義基本相同。
一個頁常常最初處於穿線或活動狀態。穿線時,頁常常關聯於某處的頁表。虛擬內存系統通過掃描在一個較活躍的頁隊列(LRU)確定頁的年齡,以便將他們移到一個較不活躍的頁隊列中。移動到緩存中的頁依然與一個VM對象關聯,但被作為立即再用的候選。在自由對列中的頁是真正未被使用的。FreeBSD盡量不將頁放在自由隊列中,但是必須保持一定數量的自由頁,以便響應中斷時分配。 如果一個進程試圖訪問一個不在頁表中而在某一隊列中的頁 (例如去活隊列或緩存隊列),一個相對耗費資源少的頁錯誤發生,導致頁被重激活。如果頁根本不存在於系統內存之中,進程必須被阻塞,此時頁被從磁盤中載入。
Intel等廠商的CPU工作在保護模式時,可用來實現虛擬內存。當尋址的地址空間對應著真實內存時,則正常讀寫;當尋址的地址空間沒有對應的真實內存時,CPU會產生一個“錯誤”,通知操作系統與磁盤等設備進行交換,讀尋址則調入存儲內容,寫尋址則寫出存儲內容。這個“錯誤” 並非操作系統或應用程序開發人員犯下的錯誤,盡管在CPU硬件實現中這與應用程序或操作系統內核崩潰的錯誤的發生機制相同。參見Intel的CPU保護模式開發手冊。
FreeBSD動態的調整頁隊列,試圖將各個隊列中的頁數維護在一個適當的比例上,同時管理程序崩潰的已清理和未清理頁。重新平衡的比例數值決定於系統內存的負擔。這種重新平衡由pageout守護進程實現,包括清理未清理頁(與他們的後備存儲同步)、監視頁被引用的活躍程度 (重置它們在LRU隊列中的位置或在不同活躍程度的頁隊列間移動)、當比例不平衡時在隊列間遷移頁,如此等等。 FreeBSD的VM系統會將重激活頁而產生的錯誤頻率調低到一個合理的數值,由此確定某一頁活躍/閒置的實際程度。 這可以為更好的決定何時清理/分配一個頁做出決策。
Copyright © Linux教程網 All Rights Reserved