操作系统复习(七)

操作系统复习(七)

一些题目

记一些我忘记的题目。

重定位

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...)。

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

相关推荐
小宇子2B1 天前
虚拟地址不是内存:Linux 如何切开一个进程的地址空间
操作系统
饼干哥哥3 天前
ChatGPT会员掉了,代充黑幕藏不住了
人工智能·操作系统·产品
小宇子2B3 天前
五、内核里的 GS / swapgs,与现代 TSS
操作系统
小宇子2B4 天前
四、x86-64 的简化:段机制基本退场,FS/GS 为什么留下
操作系统
小宇子2B4 天前
二、保护模式的段:选择子、GDT,与那张 64 位的段描述符
操作系统
小宇子2B7 天前
三、内核入口 el0_svc / entry_SYSCALL_64 的汇编做了什么——从异常向量到 C 函数
操作系统
小宇子2B8 天前
四、从 write(1, "hello", 5) 到 ksys_write() —— sys_call_table 怎么路由的
操作系统
小宇子2B8 天前
一、printf("hello") 怎么变成 write(1, "hello", 5) —— libc 的 stdout 缓冲机制
操作系统
小宇子2B13 天前
一个 pthread_mutex_lock() 到底锁了什么——从用户态 CAS 到内核调度
操作系统