请求调页
页面只有在程序执行期间被请求时才被加载
- 硬件支持——有效-无效位:
有效:相关页合法且在内存
无效:不在进程的逻辑地址空间或者只在磁盘上而不在内存中
- 试图访问尚未调入内存的页面,引起缺页错误:
检查进程内部表,确定该引用是否有效
无效-终止进程
有效-调入页面:找到空闲帧,将磁盘上的页面分配到帧上,修改页表,重新启动被中断的指令
- move指令中,当源块和目的块有重叠,会导致源块被修改:
解决方案:1.试图访问两块的两端,如果有缺页错误,在这一步就会解决
2.使用寄存器保存覆盖位置的值
写时拷贝
写时拷贝时,OS为这类请求提供空闲的页面池,在需要分配之前先填0,清除以前的内容
UNIX提供vfork(),父进程挂起,子进程使用父进程空间
页面置换
- 步骤:
1.找到所需页面的磁盘位置
2.找到空闲帧
找到:使用
没找到:选择牺牲帧,将牺牲帧写入磁盘,修改页表和帧表
3.将页面读入空闲帧,修改页表和帧表
4.返回缺页错误位置
dirty bit:置为1时,表示页表被修改,需要写入磁盘
- 页面置换算法:
1.FIFO:会有Belady异常:随着分配帧数的增加,缺页错误可能会增加
2.LRU:每个页表条目关联时间域 or 使用栈的结构,当页面被引用移动到栈顶
3.近似LRU:引用位——当引用一个页面,引用位置为1
额外引用位算法:用8位字节,OS将每个页面引用位移到最高位,其他位右移1位
第二次机会算法:用1位引用位,使用循环队列的FIFO,如果引用位为1,清楚引用位并寻找下一个,否则牺牲该页
增强型第二次机会算法:利用引用位和修改位,降低I/O数量
4.LFU
5.MFU
页面缓冲算法:系统保留缓冲池,所需页面先读到缓冲池的空闲帧,等牺牲帧写出后,再被添加到空闲帧池
原始磁盘:将磁盘分区作为逻辑块的大数组使用,而不使用文件系统的数据结构
帧分配
最小帧数;最大帧数
全局置换:允许一个进程从所有帧的集合中选择一个置换帧,而不管该帧是否已分配给其他进程
局部置换:要求每个进程只从它自己分配的帧中进行选择
非均匀内存访问(NUMA):特定板CPU访问同板内存的延迟,小于访问其他板内存的延迟
系统抖动
中级CPU调度:如果低优先级进程所分配的帧数低于最小分配帧数,必须暂停该进程执行,调出它剩余页面,释放分配的帧
抖动:高度调页活动
- 解决方式:
1.采用局部置换算法
2.提供足够多的所需帧数
工作集模型:检查最近▲个页面引用。
分配大于工作集的帧数。
缺页错误频率:当错误率太高时,需要分配更多的帧;当缺页错误率低于下限,可从进程中删除一帧
内存映射文件
内存映射文件:允许一部分虚拟内存与文件进行逻辑关联,文件读写按照内存访问处理
多个进程给可以内存映射到同一个文件,进行数据共享
内存映射I/O:一组内存地址映射到设备寄存器,对这些内存地址的读写,导致数据传到或取自设备寄存器
分配内核内存
- 内核内存与用户内存分配的区别:
1.内核需要为不同大小的数据结构请求内存,其中有的小于一页,因此内核需要努力最小化碎片浪费
2.有的硬件设备与物理内存直接交互,要求内存常驻在连续物理内存中
- 策略
策略1-伙伴系统:采用2的幂分配器
策略2-slab分配:
每个slab由一个或多个物理连续页面组成
每个cache由一个或多个slab组成
每个cache含有内核数据结构对象实例
创建cache时,分配若干空闲对象到cache
当内核需要新的数据结构对象,从cache上分配空闲对象
分配器优先级:
1.部分为空的slab
2.空slab
3.从连续物理页面分配新的slab
其他注意事项
预调页面:对于小文件采用,同时调进所需的所有页面
页面锁定位:不允许被置换出内存