FreeBSD采用頁式內存管理方式,缺頁處理主要有3個機制:
1.取頁策略
2.放置策略
3.置換策略
虛擬頁面地址與物理地址轉換功能由硬件的MMU負責,MMU還要負責頁面授權,1個進程不能訪問另外1個進程的頁面地址。
缺頁處理需要確定以下三種策略:
fetch policy,讀取策略,FreeBSD為了減少I/O操作次數,希望一次讀入盡量多的頁面,采用prepaging策略,一般是需要頁面前後各8個頁面內可以一次讀入的部分。
placement policy,放置策略,FreeBSD為了充分利用Cache功能,采用Color算法來確定讀入頁面放置的物理位置。
replacement policy,替換策略,FreeBSD維持多個鏈表管理和釋放物理空間,以便重用。
進程對內存的操作具有局部集中性(locality of reference)。當進程在某個子流程或者循環中時,很可能固定的引用一段內存空間,稱作working set,工作集。進程可能周期性的改變工作集。
swap在內存短缺時執行整個進程的換入換出。不過現在與分頁相結合,直到大的短缺時,才swap.
硬件支持:
要避免一個進程修改別的進程,就要禁止進程修改它自己的內存地址映射。
當進程換出時硬件要支持指令執行狀態信息的保存。
髒頁標志
FreeBSD系統的內存管理基於部分面向對象思想:將文件,匿名內存段等所有數據源歸結為object,定義對這些數據源的標准操作接口(pager, pagerops),並根據不同的數據源采用不同的操作實現(如swappagerops,vnodepagerops)。物理內存只是用來作為這些對象最近所使用的頁面的緩存。
虛擬內存到物理內存部分的實際映射交給pmap模塊完成
FreeBSD內存管理相關數據結構:
vmspace 表示內核或一個進程的地址空間,包含硬件獨立的內容,也包含硬件相關的內容。
Vm_map 包含硬件無關的虛擬地址空間的描述。
Vm_map_entry 使用相同存儲介質,並且保護和繼承方式也相同的虛擬連續的地址段
Vm_page 代表虛擬內存系統中內存頁管理的數據結構。
vmspace 用於描述一個進程的地址空間,包括機器相關的與機器無關的結構
vm_map 用於描述機器無關的虛擬地址空間的高級抽象數據
pmap 機器相關虛擬地址與物理地址映射結構
vm_map_entry 用於描述一個虛擬的連續地址空間,它們擁有共同的保護屬性與繼承屬性,並且使用相同的備份存儲對象
vm_object 表示一個地址范圍的數據源
shadow_object 表示已經修改過的數據,是一種object的特殊形態
vm_page 這是最底層的數據結構,表示虛擬內存所使用的物理內存
這些數據結構中的重要字段