虚拟内存管理
为什么要虚拟内存?
单道程序的时候
多道程序系统下,多个进程之间共享了主存,但是运行的进程会需要很多内存,物理上不扩展内存,在逻辑/虚拟层面扩充“内存”。
虚拟内存将用户虚拟内存和物理内存分开。随着进程运行的需求,将需要的页面调入内存,将不需要的调出内存。像是一个更加大的物理存储空间,但是其实是不存在的。
- 虚拟内存管理方式(内存管理中提到过
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
需要硬件支持:内存外存空间、页表机制or段表机制、中断机制(访问页面不在内存时)、LA-->PA的映射(MMU)
请求分页管理
- 从磁盘加载可执行程序到内存(两种方式)
- 整个一次性加载到物理内存
- 请求调页:仅在需要的时候才加载
纯请求调页:只有需要这个页面时才调入。
请求调页
一开始只调入了少量页,运行过程中,惰性交换器(只有需要时才调入页)操纵真个过程。
几个特殊位设置
- 有效位
- 有效:页面合法and页面在内存中
- 无效:页面不合法or页面不在内存中
- 修改位(脏位)
- 已修改:写入磁盘
- 未修改:直接丢弃,因为并没有任何变化。
缺页中断/页面置换
- 页面置换步骤:
- 找到所需页面P1的磁盘位置,确定这个引用是有效/无效。无效终止进程。
- 找到一个空闲帧
- 有空闲帧,直接用
- 没有空闲帧,使用页面置换算法选择一个牺牲帧
- 若牺牲帧被修改过(看修改位),将牺牲帧内容写入磁盘,修改页表、帧表。(有效位什么的要改)
- 将P1读入这个空闲帧,修改页表、帧表。
- 从缺页中断错误处继续用户进程。
不同于一般的中断,属于内部异常,缺页中断是指令执行期间发生的,而不是执行完后产生、处理中断信号。
页面置换算法
1 FIFO页面置换
移走最早进来的那个帧,无论其最近有没有被使用过。
2 OPT最优页面置换
要预知未来,很难实现。
置换未来最长时间不会使用的页面
3 LRU页面置换
最近最少使用。
置换最长时间没有使用过的页面。
- 使用工具记录
- 计时器:为每个页面关联一个时间域。每次内存引用递增。
- 栈:页面被调用时,页面从栈中pop然后push入栈(到了栈顶),牺牲指针指向栈的底部。
4 近似LRU页面置换
- 额外引用位算法:页表每个页面保留1B=8bits定期记录。每个时钟右移一位,修改位放到最高位,舍弃最低位。好理解,小数字是淘汰页。
- 第二次机会算法:基于FIFO、采用循环队列实现。找到牺牲页面,
- 修改位=0:直接置换
- 修改位=1,置0,再给一次机会,寻找下一个牺牲帧同样检测。
ps.若所有位=1,退化成FIFO。
- 第二次机会算法(加强版):(引用位,修改位):(0,0)>(0,1)>(1,0)>(1,1)
5 基于计数页面置换
- LFU最不经常使用
- MFU最经常使用
帧分配
- 平均分配:93帧 5进程:每个进程18个帧,剩余3个给空闲帧缓冲池
- 比例分配:按照进程的优先级or大小和优先级的组合分配。
- 全局置换:允许一个进程从另一个进程获取帧。
- 局部置换:只允许从自己分配的帧中获取帧。
抖动
刚刚换出的页面现在又需要调入,抖动指这种频繁的页面调度行为。
- 根本原因:系统中运行进程太多。可用帧太少。
工作集
为解决抖动问题,在某段时间内进程可能要频繁访问的页面集合——工作集。
- 可根据局部性原理,将最近访问的页面作为工作集。
内存映射文件
磁盘文件(全部or部分)与 进程虚拟地址空间某区域建立映射联系。不必执行文件I/O(read()、write()等等)操作了。
使用于大文件。多进程一起访问。
- 关于写入:可能即时可能不即时。
- 关闭文件:将内存映射数据写入磁盘,从进程虚拟内存中删除。
请求调页性能
p的概率缺页,内存访问时间ma(ns)
有效访问时间 = (1-p)*ma + p*缺页错误处理时间
写时复制
针对父子进程之间,任何一个进程写入页面,就会复制一份共享页面副本。
- 写时复制
- 不写时共享
页面池:空闲页面存储在这里,“写时复制”复制的内容利用这些空闲页面。 - 按需填零技术:空闲页面之前填0,清除所有内容。
分配内核内存
1 伙伴系统
- 从物理连续的大小固定的段分配。
- 2的幂分配。
- 合并的技术:将相邻的伙伴合成一个大的分段。有内碎片
就是一个二叉树画下去,叶子结点是父节点大小的二分之一。
2 slab分配
- 内核对象-->指向cache
- 一个cache(1 or 多个 slab组成)
- 1个slab(1 or 多个 物理连续页面)
- 过程:最初cache内所有对象都标记位空闲,内核数据结构需要新对象时,分配器从cache上分配任何空闲对象满足请求-->used标记。
- 优点:
- 没有碎片引起的浪费
- 快速满足内存请求
虚拟内存空间大小怎么决定的?
同时满足两个条件
1. 虚拟内存容量<= 内存容量+外存容量
2. 虚拟内存容量<=计算机地址能容纳的总容量。32位地址,按字节编址(一个地址表示一个B)。
虚拟内存<=232B=4GB
虚拟内存如何解决问题?
使用外存扩充内存空间。
...倒置页表不看了md记不住的再见爷要睡了
标签:空闲,复习,置换,期末,内存,进程,虚拟内存,页面 From: https://www.cnblogs.com/sectumsempra/p/17134100.html