操作系统_内存管理

内存管理流程图

无存储器抽象
无存储器抽象是早期操作系统的内存管理方式,程序直接访问物理内存,没有地址空间隔离,也没有虚拟内存的概念
程序没有独立的地址空间,所有程序共用物理内存地址。
典型内存布局变体(三种模式)

| 模式 | 操作系统位置 | 用户程序位置 | 存在问题 |
|---|---|---|---|
| 模式 a | RAM (,随机存取存储器)底部 | RAM 中,从地址 0 向上 | 用户程序错误会直接破坏操作系统 |
| 模式 b | ROM(只读存储器) 顶部 | RAM 中 | 依赖 ROM 存储系统代码,仍无隔离 |
| 模式 c | BIOS(基本输入输出系统) / 驱动在 ROM 顶部,系统在 RAM 底部 | RAM 中 | 用户程序可直接修改系统数据,稳定性差 |
共性缺陷:用户程序和操作系统、用户程序之间没有隔离,错误会直接导致系统崩溃或数据冲突。
核心问题: 程序间内存冲突 程序无法重定位
解决办法:IBM 360 的硬件保护机制(硬件辅助隔离)使用静态重定位技术,加载程序时修改指令中的绝对地址,适配新的内存位置。
无存储器抽象是早期操作系统的内存管理方式,程序直接访问物理内存,没有地址空间隔离,存在严重的稳定性和多任务缺陷,最终被虚拟内存(存储器抽象)取代。
一种存储器抽象:地址空间
定义 地址空间是进程可用来寻址内存的一系列地址集合,为每个进程提供一个抽象的、独立的内存环境。
- 每个进程拥有自己的地址空间,相互隔离、互不干扰。
- 逻辑地址相同也不会冲突,因为它们会被映射到不同的物理内存区域。
解决的核心问题 内存保护 地址重定位 多进程并行
原理:为每个进程分配独立的逻辑地址空间,通过映射到不同物理内存区域实现隔离。
技术实现:动态重定位(基址 + 界限寄存器) (变址寄存器不常这样称呼)
原理:通过基址寄存器和界限寄存器,建立进程地址空间与物理内存的映射关系。
- 基址寄存器:存放进程在物理内存中的起始地址。
- 界限寄存器:存放进程的地址空间大小 / 最大偏移量。(也就是程序的长度)
- 物理地址计算公式:
物理地址 = 基址寄存器值 + 逻辑地址(偏移量)(指令中的逻辑地址(偏移量)必须小于界限寄存器值,否则视为越界访问,系统会终止进程。)
优势:程序加载到任意物理内存位置,只需修改基址寄存器值即可正常运行,无需修改程序代码。
交换技术
定义:交换是操作系统处理物理内存不足的一种技术,将一个进程完整地从内存移到磁盘(交换区),需要时再调回内存。
核心目的:让更多进程能 “同时” 存在于有限的物理内存中,解决内存资源紧张的问题。
| 技术 | 核心特点 | 粒度 | 适用场景 |
|---|---|---|---|
| 交换(Swapping) | 进程整体换入 / 换出 | 整个进程 | 早期无分页 / 分段的系统 |
| 虚拟内存 | 进程部分换入 / 换出(按需调页) | 页 / 段 | 现代操作系统,按需加载 |
二、交换过程的核心流程
重定位问题
两种重定位方式(考研高频):
-
静态重定位:进程装入内存时,由软件一次性修改地址(早期技术,现在很少用)。
-
动态重定位
:程序执行期间,通过硬件寄存器实现地址转换:
- 基址寄存器(BR):存进程在内存的起始地址
- 变址寄存器(LR):存变量 / 指令的相对偏移
- 物理地址 = 基址寄存器 + 逻辑地址
动态重定位是交换技术的核心支撑,也是分页 / 分段地址转换的基础。
三、交换带来的问题与解决技术
内存碎片
- 定义:多次交换后,内存中会出现大量零散的空闲块(“空洞”),导致总空闲空间足够,但无法分配给需要连续内存的进程。
- 解决方式:内存紧凑(Memory Compaction)
- 把所有进程向低地址移动,合并零散空闲块为一个大的连续块。
- 缺点:需要大量 CPU 时间复制数据,现代系统很少用(考研选择题常考 “内存紧凑的开销问题”)。
四、进程内存分段(考研超高频考点)
现代操作系统的进程内存空间,按用途划分为多个段
| 段名 | 核心作用 | 存储内容 | 增长方向 | 关键考点 |
|---|---|---|---|---|
| 代码段(Text) | 存放程序指令 | 只读指令、常量字符串 | 低地址向高地址 | 只读,防止修改指令 |
| 数据段(Data) | 存放已初始化全局 / 静态变量 | int a=10; | 低地址向高地址 | 可读可写 |
| BSS 段 | 存放未初始化全局 / 静态变量 | int b;(默认 0) | 低地址向高地址 | 不占可执行文件空间,加载时清零 |
| 只读数据段(ROData) | 存放只读常量 | const int c=10;、printf 格式串 | - | 程序运行时不可修改 |
| 栈(Stack) | 存放局部变量、函数参数、返回地址 | 函数内int d=10; | 高地址向低地址(向下增长) | LIFO 原则,函数调用时分配,结束时回收 |
| 堆(Heap) | 动态内存分配 | malloc/new分配的内存 | 低地址向高地址(向上增长) | 程序员手动管理,易内存泄漏 |
考研常考细节:
- BSS 段和数据段的区别:BSS 段的变量不占可执行文件的磁盘空间,加载到内存时才分配并初始化为 0。
- 栈和堆的增长方向:栈向下增长(向低地址),堆向上增长(向高地址),两者相向而行,中间是预留的增长空间。
- 段定义(汇编视角):考研可能考汇编中段的伪指令(
segment/ends),理解段的本质是 “连续的内存区域” 即可。
五、数据段(Data Segment)动态增长的三种处理方式
当进程的数据段需要扩展,但相邻内存不是空闲时,操作系统有三种处理策略:
- 相邻空闲区分配
- 条件:进程相邻的内存是空闲块
- 操作:直接把空闲块分配给进程,无需移动 / 交换
- 优点:开销小,效率高
- 进程重定位 / 交换
- 进程重定位:把进程整体移动到内存中一个足够大的空闲区域(需要动态重定位硬件支持)
- 进程交换:把相邻的进程换出到磁盘,释放连续空闲区给目标进程(需要 I/O 操作,开销大)
- 挂起 / 终止进程
- 挂起进程:将进程置于挂起状态,等待内存资源释放(进程被换出到磁盘)
- 终止进程:直接结束进程,释放内存资源(极端情况才用)
六、进程增长预留
核心思想 进程创建 / 换入内存时,预留额外的内存空间,应对未来数据段 / 栈的增长需求,减少频繁交换 / 移动带来的开销。
交换进程时,不需要把预留的增长空间也换出,只换出实际使用的内存页,减少 I/O 开销。
空闲内存管理
考研主要考两种方法:位图(Bitmap) 和 空闲链表(Free Lists)。

1. 位图(Bitmap)
原理
- 把内存划分成一个个固定大小的分配单元(比如 4B、16B、1KB),每个单元对应位图中的 1 位。
- 用
0表示空闲,1表示已占用(也可以反过来)
关键考点
- 空间开销:分配单元越小,位图需要的位数越多。
- 优点:实现简单,内存占用小。
- 缺点
- 分配内存时,需要遍历位图找连续的 0 位,效率低
- 如果进程大小不是分配单元的整数倍,最后一个单元会产生内部碎片。
2. 空闲链表(Free Lists)
原理
- 用链表把内存中的空闲块和已占用块串起来,每个节点记录:
- 类型(空闲 / 进程)
- 块的长度
- 指向下一个节点的指针
- 通常按内存地址顺序排列链表,方便合并相邻空闲块。
关键考点:进程回收时的四种合并情况(考研超高频)
当进程 X 终止释放内存时,要检查它和前后块的相邻情况,合并相邻空闲块,减少碎片:
- 前后都是进程:直接把 X 标记为空闲块,插入链表。
- 前进程,后空闲:和后面的空闲块合并。
- 前空闲,后进程:和前面的空闲块合并。
- 前后都是空闲:和前后两个空闲块合并成一个大空闲块。
优点
- 动态灵活,不需要预先划分固定单元,无内部碎片(分配多少用多少)。
- 合并空闲块方便,减少外部碎片。
缺点
- 链表本身有额外开销(每个节点的类型、长度、指针)。
- 分配内存时需要遍历链表,效率不如位图。
基于空闲链表,操作系统会用不同的策略给进程分配空闲块,核心是这四种
| 算法 | 核心规则 | 优点 | 缺点 | 考研重点 |
|---|---|---|---|---|
| 首次适配(First Fit) | 从链表头开始找,找到第一个足够大的空闲块分配 | 速度快,一旦找到就停止;内存碎片分布均匀,大空闲块保留在后面 | 容易在链表前部留下小碎片,后续分配效率下降 | 算法流程、优缺点对比 |
| 下次适配(Next Fit) | 上次分配结束的位置开始往后找,不再从头开始 | 避免重复遍历前面的块,减少重复搜索 | 容易错过链表前部的大空闲块,导致大碎片被浪费;性能通常不如首次适配 | 与首次适配的区别、性能对比 |
| 最佳适配(Best Fit) | 遍历整个链表,找能装下进程的最小空闲块 | 分配的块大小最匹配,内存利用率高 | 产生大量微小碎片(外部碎片),后续无法利用;遍历整个链表,效率低 | 核心缺陷(小碎片问题)、与最差适配对比 |
| 最差适配(Worst Fit) | 遍历整个链表,找能装下进程的最大空闲块 | 分配后剩余的块较大,不容易形成微小碎片 | 破坏大空闲块,后续大进程可能无法分配;同样需要遍历链表,效率低 | 核心缺陷(大空闲块被破坏)、与最佳适配对比 |
优化算法:快速适配(Quick Fit) 核心思想
- 为不同大小的空闲块,维护多个独立的链表(比如 4KB、8KB、16KB 各一个链表)。
- 分配时,直接根据进程大小找对应链表,快速取出空闲块,无需遍历整个链表。
虚拟地址
核心思路:不用把整个程序放进内存,只放当下正在用的一小段,暂时不用的存在硬盘。
给每个程序单独分配一套专属地址(虚拟地址)
核心硬件:MMU 内存管理单元

基本流程
1 CPU 执行代码,输出虚拟地址,发给 MMU(专门做地址转换的硬件);
2 MMU 查页表,把虚拟地址翻译成真实物理地址;
3 MMU 把翻译好的物理地址发到总线,访问内存;
4 如果 MMU 发现这个虚拟地址对应的内容不在内存里 → 触发缺页中断,交给操作系统处理。
分页

把程序的虚拟地址空间,切成固定大小的小块,每一块叫页
物理内存也切成一模一样大小的块,叫页框 / 物理页框
规定:页的大小一定是 2 的 n 次方(4KB、8KB、16KB 这种),方便硬件快速计算。 12为 2^12=4kb

虚拟地址 = 高位【页号】 + 低位【页内偏移】
页内偏移:表示在这一页内部,第几个字节,虚实转换全程不变;
页号:用来去页表里查,这个虚拟页存在内存哪一个物理页框。
图里面 页表有16个 2^4=16 所以页号占用4位
页面大小也就是偏移量 2^12=4096B
页表

页表是每个进程独立拥有的数组结构,虚拟页号 = 数组下标,一条数组元素 = 一个页表项
页表本身存放在物理内存中
每个程序一张页表,表格每一行对应一个虚拟页,记录两条关键信息:
- 在 / 不在位(有效位):0 = 页面在硬盘,不在内存;1 = 页面在内存,后面跟着物理页框号;
- 物理页框号:如果页面在内存,MMU 拿这个编号拼接偏移,得到最终物理地址。
页表项结构

| 字段 | 别名 | 取值含义 |
|---|---|---|
| 页框号 | PFN | 十进制 / 二进制编号 |
| 在 / 不在位 | 有效位 Present | 1 = 页面在内存;0 = 缺页 |
| 修改位 | 脏位 Dirty | 1 = 页面被写过;0 = 只读未修改 |
| 访问位 | 引用位 Referenced | 1 = 近期访问过;0 = 长期未访问 |
| 保护位 | 读写权限位 | 读 / 写 / 执行权限标记 |
| 高速缓存禁止位 | 辅存地址位 | 1 = 禁用 CPU 缓存;0 = 允许缓存 |
| 禁止位 | 保留位 | 系统预留 |
脏位:减少不必要磁盘写操作;
访问位:辅助页面置换,降低缺页率;
缓存禁止位:保证硬件 I/O 数据实时准确
缺页中断完整全过程
场景:程序执行 MOV REG,32780,虚拟地址 32780 对应的页表条目在 / 不在位 = 0
第一步:硬件操作(MMU)
MMU 检测有效位为 0,立刻触发缺页中断,暂停 CPU,把控制权交给操作系统。
第二步:操作系统内核 5 步处理(软件)
1淘汰一页:找当前内存里最少使用的物理页框;
如果淘汰的页面修改过(脏页),先把内容写回硬盘;没修改过直接覆盖;
2读入缺失页面:从硬盘把虚拟页 8,读到刚腾出来的物理页框;
3更新旧页表:刚才被淘汰的虚拟页,有效位改成 0;
4更新当前页表:虚拟页 8 条目,有效位改成 1,填入新物理页框号;
5返回 CPU:操作系统结束中断,CPU 重新执行刚才失败的 MOV 指令,这次 MMU 就能正常翻译地址。
概念类重点
页:虚拟地址空间分块;页框:物理内存分块,二者大小完全相等;
虚拟地址:程序看见的地址;物理地址:内存真实硬件地址;
MMU:硬件,唯一作用:虚拟地址→物理地址转换,检测缺页;
页表:操作系统维护的数据结构,保存虚拟页→物理页框映射;
缺页中断:硬件触发的故障异常,页面不在内存时发生,处理完重新执行指令;
页大小必须是 2 的整数次幂:硬件不用做除法,直接截取二进制低位当偏移,速度快。
加速分页
1.为什么需要 TLB
痛点 1:地址转换效率极低
无优化分页访存流程:一次 CPU 访存 = 两次物理内存访问
-
第一次读内存:读取页表项,完成虚拟→物理地址映射;
-
第二次读内存:访问目标数据 / 指令。
现代 CPU 单条指令执行仅 1ns,页表查询必须控制在 0.2ns 内;两次内存访问直接将内存性能腰斩,成为系统瓶颈,必须优化。
痛点 2:页表规模爆炸
32 位虚拟地址、4KB 页:约 100 万条页表项;
64 位虚拟地址页面数量几乎不可估量。
完整页表常驻内存开销极大,进程切换时重载整个页表会严重掉性能。
2. TLB 基础概念
- 全称:Translation Lookaside Buffer,别名**快表、地址翻译缓存、相联存储器 ** 页表高速缓存;
- 硬件位置:集成在 MMU 内存管理单元内部,处于 CPU 与内存缓存之间;
- 设计原理:依托程序局部性原理(程序只会频繁访问少量页面),缓存近期高频使用的「虚拟页号→物理页框」映射(页表项 PTE);
- 核心价值:命中 TLB 时仅需1 次内存访问,消除两次访存的性能损耗。
3. TLB 表项结构
TLB 每条表项完整复制页表项全部标记:
有效位、虚拟页面号、修改位(脏位)、保护位、访问位、高速缓存禁止位、页框号。
- 虚拟页号:TLB 匹配检索的唯一标识;
- 保护位:校验读写 / 执行权限,非法访问触发保护异常;
- 修改位:页面写入时同步更新,淘汰 TLB 条目时同步写回内存页表。
4. 硬件 TLB 完整访存流程

页表是存放在内存里的 “完整字典”,TLB 是 CPU 芯片里的 “高频单词小抄”。查单词先看小抄,有就直接用;没有再翻厚厚的字典,同时把单词抄到小抄上。
TLB 命中判断两个必要条件:①虚拟页号完全匹配;②有效位为 1;③访问操作符合保护位权限。
5.两种 TLB 失效类型
失效分类关键区分:有无磁盘 IO,无 IO = 软失效,有磁盘读 = 硬失效(本质就是缺页中断)
| 失效类型 | 触发条件 | 处理流程 | 速度 |
|---|---|---|---|
| 软失效(Soft Miss) | 页面已在物理内存,仅映射未缓存进 TLB | 仅内存操作,OS 从内存页表读取 PTE 写入 TLB,无磁盘 IO | 极快(纳秒级) |
| 硬失效(Hard Miss) | 页面既不在 TLB,也不在物理内存 | 触发缺页中断,磁盘 IO 读页面进内存,更新页表后写入 TLB | 极慢(毫秒级,百万倍耗时) |
6.TLB 条目淘汰策略
TLB 硬件容量有限,新增映射时必须淘汰旧条目,通用策略LRU(最近最少使用):淘汰最久未访问的页面映射,降低后续再次失效概率;淘汰时同步将 TLB 内修改位同步更新至内存页表。
针对大内存的页表
多级页表
计算题
每一级页表本身必须完整存放在1 个物理页面内,不能跨页存储 。 当前不需要的页表先放在磁盘

多级页表缺点
无 TLB 命中时,n 级页表需要 n 次额外内存访问:二级页表需要 2 次内存读页表,三级页表需要 3 次,访存延迟更高。
倒排页表(了解)

哈希 最简单理解就是对下标取模
传统单层 / 多级页表:1 个虚拟页对应 1 条页表项,页表长度 = 进程虚拟页面总数;
倒排页表:1 个物理页框对应 1 条页表项,页表长度 = 机器物理内存总页框数,和虚拟地址空间大小无关。
每条条目存储:
- 虚拟页号 + 进程 ID:唯一标识某进程的某虚拟页;
- 控制位:有效位、访问位、修改位、保护位;
- 链表指针:哈希冲突时,链接同哈希值的其他页表项。
页面置换算法
置换的是内存中的物理页面(页框)
置换的原因 物理内存容量有限 发生缺页异常 内存无空闲页框
最优页面置换算法 OPT
- 核心原理
缺页中断发生时,预测内存中每个页面未来多久才会被访问,淘汰未来最久才用到 / 永远不会再访问的页面,最大限度减少缺页次数。
- 关键特点
-
理论性能天花板,缺页中断次数最少;
-
无法实际实现:操作系统不能提前预知程序未来的页面访问序列,仅作为衡量其他算法好坏的理论标杆。
- 适用场景
仅用于理论分析
NRU 最近未使用置换算法

- 前置基础:页面两个标记位 每个页表项维护 2 个标志位:
- R 位(访问位):页面被读写访问时置 1;时钟周期定时清零所有页面 R 位;
- M 位(修改位 / 脏位):页面内容被修改写入数据时置 1,代表页面和磁盘副本不一致,置换时需要写回磁盘。
- 页面四分类(按 R、M 组合),置换优先级从高到低(先淘汰靠前类别)
0 类:R=0,M=0 → 很久没访问、未修改(优先淘汰)
1 类:R=0,M=1 → 很久没访问、已修改
2 类:R=1,M=0 → 近期访问、未修改
3 类:R=1,M=1 → 近期访问、已修改(最后淘汰)
- 执行流程
缺页时,从编号最小的非空分类里随机选一页淘汰;先找 0 类,没有就找 1 类,依次类推。
- 优缺点
- 优点:逻辑简单、开销低,不用记录页面进入顺序,只靠两个标记位分类;
- 缺点:同一类内随机淘汰,无法区分页面闲置时长;定时清零 R 位会带来少量系统开销。
FIFO 先进先出置换算法

- 核心原理
维护一条链表记录内存页面,按页面进入内存的先后顺序管理:
-
链表头部:最早载入内存的页面;链表尾部:最新载入;
-
缺页且内存占满时,直接淘汰链表头部最早进入的页面;新页面插入链表尾部。
- 核心缺陷:Belady 异常(贝尔迪怪象)
分配更多物理页框时,缺页次数反而增多,性能不稳定;会无差别淘汰早期载入、但高频使用的页面。
- 优缺点
- 优点:实现极简,只维护链表,无额外硬件标记需求;
- 缺点:完全不考虑页面近期访问情况,经常淘汰热点页面,存在 Belady 异常,缓存命中率差。
第二次机会算法

- 设计目的:修复 FIFO 的缺陷
FIFO 不区分页面是否被访问,会误删常用页面;第二次机会基于 FIFO 改造,引入R 访问位给页面 “二次存活机会”。
-
执行逻辑
缺页淘汰时,从链表最老页面(表头)开始检查它的 R 位;
若 R=0:页面长期未访问,直接淘汰;
若 R=1:页面近期用过,给它第二次机会 —— 清零 R 位,移到链表尾部(模拟刚载入),继续检查下一个最老页面;
循环直到找到 R=0 的页面淘汰。
-
时钟 Clock 算法(简化版第二次机会)
把链表改成环形循环队列 + 一个扫描指针,不用频繁移动页面,指针循环转圈检查页面 R 位,大幅降低内存移动开销,是操作系统实际最常用的实现。
- 优缺点
- 优点:保留 FIFO 简单特性,同时规避热点页面被错误置换,无严重 Belady 异常;时钟版本性能、开销均衡;
- 缺点:最坏情况所有页面 R 位全为 1 时,会退化成纯 FIFO,需要遍历全部页面。
时钟页面置换算法

最近最少使用页面置换算法LRU
- 核心思想
局部性原理:很久没访问的页面,未来大概率也不会访问;近期频繁访问的页面,短期内还会用到。缺页时淘汰最长时间未被访问的页面。
-
两种硬件 / 软件实现方案
1 双向链表实现(软件模拟)
这个图里面的也叫 老化算法

- 链表表头:最近刚访问的页面;表尾:最久未使用页面
- 页面被访问:从原位置删除,移动到表头;缺页淘汰表尾页面
- 缺点:每次访问都要遍历链表调整顺序,开销大,纯软件效率低
2 计数器硬件实现(主流硬件方案)
- 全局 64 位自增计数器,每条指令执行后 + 1;每个页表项保存访问时的计数值
- 缺页时扫描所有页表,计数值最小的页面 = 最久未访问,直接淘汰
- 局限:计数器位数有限,长时间高频访问后数值差距过小,无法精准区分闲置时长;多进程需独立计数器隔离
-
优缺点
✅ 优点:性能接近最优 OPT 算法,无 Belady 异常,缓存命中率高
⚠️ 缺点:完整 LRU 依赖专用硬件,纯软件实现开销极高,真实系统极少完整实现;工程上多用近似 LRU(NRU、时钟、二次机会)替代
工作集页面置换算法
是集合 要记住
-
前置核心概念
局部性原理:程序运行只频繁访问一小部分页面,该集合称为工作集 w (k,t)
-
w (k,t):过去 k 次访问 / 时间 t 内进程访问过的全部页面
-
特性:k 增大时,工作集先快速扩张,后趋于稳定;内存不足、频繁换页称为**颠簸 **
-
请求调页 + 预先调页
-
请求调页:缺页中断才加载页面,启动初期缺页多
-
预先调页:进程运行前把完整工作集提前载入内存,大幅减少缺页
-
-
页表关键标记
-

每个页表项保存:R 访问位、上次使用时间;定时时钟周期清零所有页面 R 位
-
置换淘汰逻辑(缺页时扫描全部页表)
扫描页面 R 位:
- R=1:本周期访问过,属于工作集,更新「上次使用时间」为当前系统时间,不淘汰
- R=0:本周期未访问,计算页面生存时长 = 当前时间 - 上次使用时间
分情况决策:
- 生存时长 > 阈值 t:页面已脱离工作集,优先标记为淘汰候选
- 生存时长 ≤ 阈值 t:仍属于工作集,保留
兜底策略:
- 存在多个 R=0 且超时页面:淘汰生存时间最长的
- 全部页面 R=1(都在工作集):随机淘汰一页,优先选未修改(M=0)干净页,减少写盘 IO
-
优缺点
✅ 优点:精准识别进程工作集,从根源避免颠簸,多道程序环境内存利用率高
⚠️ 缺点:缺页时需要完整遍历所有页表,扫描开销大,性能损耗明显
工作集时钟置换算法

- 设计目的
优化原版工作集算法「全页表扫描」的低效问题,结合时钟环形指针+ 工作集阈值 t,是工程落地版本。
- 核心机制
- 存储结构:环形循环页框链表 + 单一循环扫描指针(时钟指针),无需遍历全部页表
- 判定逻辑同时满足两套规则:
-
时钟规则:检查 R 访问位,R=1 则清零 R 位,指针下移,给页面二次机会
-
工作集规则:R=0 时计算页面生存时长,超过阈值 t 直接淘汰
-
优缺点
-
✅ 优点:规避全页表扫描,开销远低于原版工作集;兼顾时钟算法高效性与工作集防颠簸能力,现代操作系统广泛使用
⚠️ 缺点:需要维护时间阈值 t,参数调优会影响置换效果
页面置换算法小结


总之,最好的算法是老化算法和WSClock算法。他们分别是基于 LRU 和工作集算法。他们都具有 良好的性能并且能够被有效的实现。还存在其他一些好的算法,但实际上这两个可能是最重要的
习题
1


 页号 1、偏移(565\mathrm{H});
- 初始页 1 不在内存,缺页;驻留集大小为 2,当前内存有页 0、页 2;
- LRU 算法淘汰最久未访问的页 0,页 0 占用页框(101\mathrm{H});
- 页 1 被装入页框(101\mathrm{H});
- 物理地址 = 页框号拼接页内偏移 = (101\mathrm{H}565\mathrm{H} = 101565\mathrm{H})。

2


附录
本次学习3.5章节的代码没有实现
习题 只看了前两题
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)