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 这是最底层的数据结构,表示虚拟内存所使用的物理内存
这些数据结构中的重要字段