操作系统复习(七)

一些题目

记一些我忘记的题目。

重定位

在这里插入图片描述

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、返回地址及临时变量)。

原因如下:

  1. 段式管理以段为共享单位:段式存储管理中,每个段是一个逻辑独立的实体,系统允许不同进程的段表项指向同一物理段。因此可将只读的代码指令放入一个段中,供两个进程映射到相同的物理内存区域。
  2. 代码具有可重入性(纯代码)fun函数在执行过程中不会修改自身指令,属于纯代码。共享同一份物理代码副本不会互相干扰,能节省大量内存空间。
  3. 执行上下文必须私有:递归程序严重依赖堆栈保存每层调用的返回地址和局部变量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…)。

原因:在此类循环访问串中,页面被装入内存的“年龄”顺序与其被访问的“新旧”顺序始终保持一致,因此两种算法决策等同。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐