装入

Q: 使用绝对装入与可重定位装入的程序, 地址的使用上有什么区别?
A: 绝对装入: 使用绝对地址.
可重定位装入: 使用相对地址

Q: 静态重定位与动态重定位区别
A: 都是使用了相对地址, 装入物理内存的时候, 需要对相对地址进行转换
静态重定位在装入的时候就进行了转换
动态重定位则在执行的时候进行转换

Q: 静态重定位与动态重定位哪个更加适合程序的浮动?
A: 动态重定位.
因为动态重定位是在程序运行时才进行地址转换, 所以当程序在内存中的位置发生改变 (浮动) 时, 操作系统只需更新基址寄存器即可, 程序无需修改就能继续运行. 而静态重定位在装入时就已确定了绝对地址, 无法再移动.

Q: 编译与链接阶段产生的逻辑地址有什么区别?
A: 编译产生单个目标文件 (*. o 文件) 的逻辑地址
链接产生可执行程序的逻辑地址

Q: 可执行程序和目标文件的关系
A: 多个目标文件+库文件 (*. lib, *. a, *. so, *. dll), 处理之后得到可执行文件

内存分配算法

基于顺序搜索的内存分配算法

Q: 为什么首次适应算法低地址会有很多外部碎片?
A: 首次适应算法从低地址开始, 找到第一个能满足大小的空闲内存块, 分配给作业
导致低地址有大量的小空闲内存碎片

Q: 循环首次适应算法与首次适应算法顺序搜索区别
A: 首次适应算法: 从低地址开始寻找满足大小的空闲内存块
循环首次适应算法: 从上次查找结束的地址开始搜寻满足大小的空闲内存块

Q: 循环首次适应算法与首次适应算法, 哪个效率更好?
A: 一般情况下, 还是首次适应算法效果更好

Q: 最佳适应与最坏适应算法顺序搜索区别
A: 最佳适应算法: 空闲内存块从小到大搜索, 第一个满足大小的空闲内存块, 分配给作业
最坏适应算法: 空闲内存块从大到小搜索, 第一个满足大小的空闲内存块 (一般就是最大的空闲内存块) 划分之后, 分配给作业

Q: 首次适应, 循环首次适应, 最佳适应, 最坏适应
四大顺序搜索算法, 哪个产生的外部碎片最多?
A: 最佳适应算法
每次都分配最接近作业需要大小的空闲内存块, 导致每次作业分配几乎都能产生外部碎片
名叫最佳其实性能很差, 外部碎片也是最多

Q: 首次适应, 循环首次适应, 最佳适应, 最坏适应
四大顺序搜索算法, 哪个性能最好?
A: 首次适应算法
循环首次适应算法, 内存很少保留大块的空闲内存块
最佳适应和最坏适应算法, 需要维护按照空闲内存块大小排序的队列, 每次分配或者释放内存, 都需要修改队列
使得最简单的首次适应算法, 性能最好

分页的内存分配算法

Q: 如何从页表得到页框的物理地址?
A: 页表划分为页表项
查找第 页框的物理地址, 就看第 页表项的值
该值就是对应的页框的物理地址

Q: 在分页管理中, 单级页表存在什么核心问题, 导致了多级页表的出现?
A: 单级页表本身需要一块巨大且连续的物理内存来存放, 当进程地址空间很大时, 很难找到这样的大块连续内存.

Q: 为什么说单级页表需要占用大块”连续”物理内存空间?
A: 因为页表本身也需要存储, 如果一个进程的页表很大 (例如有数百万个页表项), 就需要找到一块同样大的、连续的物理内存来存放这个页表, 这在内存紧张时很困难.

Q: 多级页表是如何解决单级页表需要连续内存空间的问题的?
A: 它将庞大的页表进行”分页”, 使得只有顶级页表 (页目录) 需要连续存储, 而次级页表可以离散地存放在内存的不同位置.

Q: 多级页表除了解决连续存储问题, 还有什么额外的好处?
A: 可以将暂时用不到的次级页表放在外存中, 需要时再调入内存, 从而节省了宝贵的内存空间.

虚拟内存

实现虚拟内存管理的实现
请求分页系统基本分页系统的基础之上, 增加了{请求调页}和{页面置换}功能

Q: 虚拟内存的大小由什么决定?
A: 1. 虚存的实际容量小于等于内存容量和外存容量之和
2. 虚存的最大容量小于等于计算机的地址位数能容纳的最大容量

页面置换算法

常见的页面置换算法

Q: 最佳 (OPT) 页面置换算法与最近最久未使用 (LRU) 页面置换算法的区别
A: 最佳 (OPT) 页面置换算法: 向后看, 淘汰掉未来不可能使用, 或者下次使用间隔最长的页面
最近最久未使用 (LRU) 页面置换算法: 向前看, 淘汰掉上次调用与此时时间间隔最长的页面

Q: 为什么工程上不适用 OPT 页面置换算法, 仅仅用来作为其他算法性能的评估参照?
A: OPT 页面置换算法要求”向后看”的能力, 每次淘汰掉未来不可能使用, 或者下次使用间隔最长的页面
人类目前还没有这样的能力

Q: 什么是 Belady 异常?
A: 为进程分配的物理块增多, 缺页次数不减反增的异常现象

Q: 哪种页面置换算法会发生 Belady 异常?
A: FIFO, 可能会发生

Q: 简单 Clock 算法运行过程 (装入, 替换)
A: 装入:
为每个页面设置一位访问位, 当某页首次被装入或被访问时, 其访问位被置为 1
内存中的页面链接成一个循环队列
替换:
在选择淘汰一页时, 只需检查页面的访问位:
若为 0, 直接换出
若为 1, 将它置为 0, 暂不换出
指针指向下一个页面

Q: 改进型 Clock (NRU) 算法是如何根据访问位 (R) 和修改位 (M) 来选择淘汰页的?
A: (访问位, 修改位)
寻找 (0,0), 若没有寻找 (0,1)
若 (0,0) 与 (0,1) 都没有, 将所有的访问位置为 0, 进入第二轮寻找

内存保护

在连续分配的内存管理方式中 (如可变分区), 最主要的内存保护措施是使用{界地址寄存器}(基址和限长寄存器) 进行保护.