操作系统复习(七)
操作系统复习(七)
一些题目
记一些我忘记的题目。
重定位

1. 什么叫重定位?
将程序地址空间中的逻辑地址(虚拟地址) 转换为物理内存中的物理地址的过程。
2. 动态重定位的特点:
- 转换时机:在程序运行时(指令执行时)动态完成地址转换,而非加载时。
- 硬件依赖:需依赖MMU(内存管理单元) 和重定位寄存器(基址寄存器) 支持。
- 灵活性高:程序在内存中可移动(换进换出),且允许程序非连续存放或仅部分装入。
- 性能代价:每次访存都需进行地址转换,增加了运行时开销(硬件会通过TLB加速优化)。
- 支持共享:多个进程可动态映射到同一物理地址,便于代码共享和进程隔离。
动态链接

1. 什么是动态链接?
将程序中对库函数的链接推迟到**程序运行时(或加载时)**才完成,而非编译链接阶段。这使得多个进程可共享同一份动态库(如.dll或.so)的物理代码副本。
2. 用何种内存分配方法实现?
采用分页式(或段页式)虚拟内存分配方法。
- 原因:分页支持非连续分配和按需调页,允许动态库作为独立模块映射到进程的虚拟地址空间,且仅在需要时才将对应页面调入物理内存,并通过内存映射机制实现进程间共享同一份物理页框。
页错误

主要是第二问,我之前没有思考过这个问题。
(1)为什么引入缺页中断?
由于请求分页存储管理采用按需调页策略,程序运行时并不预先将所有页面装入内存。当CPU访问的逻辑页面不在物理内存(页表有效位为0)时,指令无法继续执行,必须由缺页中断介入,将所需页面从磁盘调入内存,从而打破“程序必须完全装入才能运行”的限制,实现虚拟内存。
(2)缺页中断的实现由以下4部分组成及实现方法:
| 组成部分 | 实现方法 |
|---|---|
| ① 硬件陷阱与现场保护 | CPU的MMU检测到缺页后,自动触发中断,将程序计数器(PC)、CPU状态等压入内核栈,并切换至核心态,转入缺页中断处理程序。 |
| ② 地址合法性检查 | 中断程序检查引发缺页的虚拟地址是否在进程的逻辑地址空间内。若非法(越界),则终止进程;若合法,继续下一步。 |
| ③ 页面调入(含置换) | 分配空闲物理页框;若无空闲,调用页面置换算法(如LRU)换出牺牲页。同时发起磁盘I/O操作,将目标页从交换区或文件读入该物理页框。 |
| ④ 更新页表并恢复现场 | 磁盘I/O完成后,修改页表项,将有效位置为1,填入物理页框号。恢复CPU上下文(寄存器),重新执行引发缺页的那条指令,此时访问命中。 |
程序分段
5、假定有一个求n!程序被两个进程所共享,求n!程序如下:
int fun(int n)
{
if (n==0||n==1)
return 1;
else
return fun(n-1)*n;
}
若系统采用段式管理,应如何安排程序? 为什么?
在段式管理下,应将程序代码(fun函数的指令)单独作为一个纯代码段,且两个进程共享该代码段;同时为每个进程分别设立独立的私有堆栈段和数据段(用于存放参数n、返回地址及临时变量)。
原因如下:
- 段式管理以段为共享单位:段式存储管理中,每个段是一个逻辑独立的实体,系统允许不同进程的段表项指向同一物理段。因此可将只读的代码指令放入一个段中,供两个进程映射到相同的物理内存区域。
- 代码具有可重入性(纯代码):
fun函数在执行过程中不会修改自身指令,属于纯代码。共享同一份物理代码副本不会互相干扰,能节省大量内存空间。 - 执行上下文必须私有:递归程序严重依赖堆栈保存每层调用的返回地址和局部变量
n。若共享堆栈段,两个进程的调用序列会互相覆盖,导致计算结果错乱。因此,堆栈段和数据段必须物理分开,每个进程各有一份。
FIFO和LRU

在访问序列呈现“顺序循环” 的情况下,FIFO 和 LRU 两种置换算法发生缺页时被置换的页完全一样。
核心条件:访问串中的页面按固定顺序循环出现,且在单个周期内每个页面最多只被访问一次。这使得页面进入内存的顺序(FIFO依据)与其最近被访问的时间顺序(LRU依据)完全同步。
举例说明:
假设系统分配给进程的物理块数为 3,访问串为:
1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4…
我们模拟前几步,对比两种算法的置换行为(初始内存为空):
| 步骤 | 访问页 | FIFO队列(尾进) | FIFO置换页 | LRU栈(顶新) | LRU置换页 |
|---|---|---|---|---|---|
| 1 | 1 | [1] 缺 | — | [1] 缺 | — |
| 2 | 2 | [1,2] 缺 | — | [2,1] 缺 | — |
| 3 | 3 | [1,2,3] 缺 | — | [3,2,1] 缺 | — |
| 4 | 4 | [2,3,4] 缺 | 1 | [4,3,2] 缺 | 1 |
| 5 | 1 | [3,4,1] 缺 | 2 | [1,4,3] 缺 | 2 |
| 6 | 2 | [4,1,2] 缺 | 3 | [2,1,4] 缺 | 3 |
结果:从第4步开始,每一步发生缺页时,两种算法淘汰的页面完全相同(依次为 1, 2, 3, 4…)。
原因:在此类循环访问串中,页面被装入内存的“年龄”顺序与其被访问的“新旧”顺序始终保持一致,因此两种算法决策等同。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)