本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
本文是个人学习《现代操作系统》的笔记。
分页系统中的设计
局部分配与全局分配策略
- 问题背景:如何在相互竞争的可运行进程之间分配内存。
- 管理内存动态分配的一种方法:PFF(page fault frequency)
注:它指出了分配的 时机 ,控制了分配集的大小,但不会具体指出要替换哪一个
- 局部全局、各种具体算法的划分不是从同一个维度考虑的。有的算法可同时支持全局和局部,如FIFO和LRU;有的算法只有局部才有意义,如工作集和WSClock算法。
负载控制
- 两级调度思想:一些进程被放入磁盘期间,用一个短期调度程序调度剩余进程。
关于页面大小的选择
page大小是操作系统的可选参数。
在内存中有n个段,页面大小为p字节时,会有np/2字节的内部碎片。
共享page
多个进程通过共享程序页表来共享同一个程序。
共享库(windows中称作DLL(动态链接库))
优点:
- 使可执行文件更小
- 节省内存空间
- 如果共享库中的一个函数因为修正bug被更新了,不需要重新编译
缺点:
由于多个进程共用,装载时进行重定位行不通。
解决方案:
- 写时复制(和使用共享库的目的相悖)
- 变异共享库时,增加一个特殊编译选项,让编译器不要产生绝对地址的指令。
共享库实质
内存映射文件
清除策略
双指针策略:前指针由分页守护进程控制,后指针用于页面置换。
分页守护进程
- 定义:大多数时候睡眠、定期被唤醒以检查内存状态的后台进程。
- 工作原理:通过预定的页面置换算法换出内存,以保证有足够多的空闲页框。
实现虚拟内存系统的注意事项
分页
- 新进程创建时,操作系统要确定程序和数据初始时有多大,并为它们创建一个页表。
- 进程被换出时,页表不需要在内存中;进程运行时,它必须在。
- 缺页中断发生时,操作系统必须通过硬件寄存器以确定是哪个虚拟地址造成了缺页中断。
- 进程退出时,操作系统必须释放进程的页表、页面和硬盘占用空间。
缺页中断处理的过程
- 硬件陷入内核
- 启动汇编代码例程暂存信息(栈思想)(该例程将操作系统作为函数调用)
发生缺页中断时,尝试确定需要哪个虚拟页面,并检查该地址是否有效,存取与保护是否一致。
- if不一致,向进程发出一个信号或kill掉该进程;
- else if 无空闲页框,执行置换页面算法淘汰掉一个页面腾出页框。
- else if 所选页框脏了,将该页写回磁盘,并发生一次上下文切换,期间挂起该进程,先运行其他进程。
- else 通过磁盘操作将其装入
之后可理解为对上述操作的出栈过程。
指令备份
- 背景:为什么需要备份?
当程序访问不在内存中的页面时,引起缺页中断的指令会半途停止并trap,取出页面后需重新启动引起trap的命令。
- 实现
CPU设计上,通过使用一个隐藏的内容寄存器,在每条指令执行之前,把程序计数器内容复制到该寄存器。
虚拟内存与I/O间的关系
在等待I/O完成时,某进程被挂起,另一个进程运行,这期间产生一个缺页中断。
磁盘管理-当页面被换出时会放在磁盘的哪个位置
静态备份:在磁盘上设置特殊的交换分区,甚至从文件系统划分一块独立磁盘。
- 注意:为了避免溢出,最好为context data stack都保留交换区,并且允许其实际多于一个快
- 动态备份:页面换出时才分配磁盘空间。
特点:每个进程都必须有一张表,用于记录每个页面相应的磁盘地址
分段
segment,这和初学汇编时的段思想一致
- page是定长的,segment不是
- segment是一个逻辑实体,但一般不会同时包含多种不同类型的内容。