Skip to content

考点清单

  • [x] 分区存储管理(固定/可变/可重定位,分配算法) ✅ 2026-05-15
  • [x] 分页存储管理 → 详见子文件 ✅ 2026-05-15
  • [x] 分段存储管理 ✅ 2026-05-15
  • [x] 段页式存储管理 ✅ 2026-05-15

笔记

四种存储管理方式的本质区别在于

核心区别一览

对比维度分区存储分页存储分段存储段页式存储
分配单位整个进程(整存)固定大小页框可变大小段先分可变段,再分固定页
地址结构基址+偏移页号+页内偏移段号+段内偏移段号+页号+页内偏移
碎片类型内部/外部碎片内部碎片(极小)外部碎片极小碎片
用户可见性不可见透明(用户无感)可见(按逻辑分段)部分可见
共享/保护困难较困难容易(按段共享)容易
动态链接不支持不支持支持支持

分区存储管理

🎯 一句话结论:分区管理是"整存" — 固定分区产生内部碎片,可变分区产生外部碎片。

整存,将进程所需内存整体一起分配。

方式特点
固定分区静态分区,产生内部碎片
可变分区动态分区,产生外部碎片
可重定位分区移动已分配区域合并碎片,仅在外部请求无法满足时触发

可变分区分配算法

算法策略
首次适应法从头查找,找到第一个 >= 所需空间的空间块
最佳适应法空闲块按大小排序,找最接近的
最差适应法找最大的空闲块,防止产生过多细小碎片
循环首次适应法从上次分配位置继续查找,不每次从头开始

可变分区分配算法:首次适应(从头找第1个够的)→ 最佳适应(找最接近的)→ 最差适应(找最大的)→ 循环首次适应(从上一次位置继续)

分段存储管理

🎯 一句话结论:段表包含段长和基址。偏移 > 段长即为地址越界

将进程空间按逻辑整体分段,段表包含段长和基址两个属性来确定逻辑段在物理段中的位置。

  • 优点:多道程序共享内存,各段修改互不影响
  • 缺点:内存利用率低,内存碎片浪费大

地址越界判断:逻辑地址 (段号, 偏移) 中偏移 > 段长 则为越界。常见错误原因是逻辑地址转换物理地址时地址越界,根源通常是数组下标越界没有检查。

分页存储管理

详见:架构师-备考 综合知识-系统基础-操作系统-分页存储管理

逻辑页分为页号和页内地址,通过页表查询页号对应的物理块号。相关概念:页面置换算法(最优算法、先进先出、最近最少使用)、快表。

段页式存储管理

🎯 一句话结论:先分段,后分页。空间浪费小、共享容易、保护容易、能动态链接。

  • 优点:空间浪费小、存储共享容易、存储保护容易、能动态链接
  • 缺点:管理软件复杂度和开销增加,执行速度下降

拓展理解

场景化理解四种存储方式

四种方式的本质区别在于如何把程序用的逻辑地址翻译成物理内存的真实地址。程序员写 arr[10]func() 时用的是逻辑地址,CPU执行指令时,MMU(硬件)自动查表翻译,程序员完全无感。

下面用生活场景帮你建立直观感受。

① 分区存储 — "租公寓"

好比你要住,给你一整间连续的公寓。你说"房间1040号",管理员知道公寓从2000号开始,直接算出3040号。简单粗暴。

但问题是:租客来了又走,内存变得支离破碎——一块100KB的空地可能被拆成好几个小洞,新来的大租客装不下。固定分区产生内部碎片(租了大房间只住一半),可变分区产生外部碎片(小洞凑不出大空间)。

② 分页存储 — "图书馆散页" 🔥 最常用

把程序(一本书)拆成4KB一页的散页,物理内存(图书馆)切成同样大小的书架格子。每页可以放在任意空位,不需要连续

你想看书的第1040页内容?先查页号(0号页),翻索引卡(页表)找到它在5号书架的格子里,去那里取。页表就是一张"逻辑页号→物理格子号"的映射表。

✅ 核心优势:不连续也没关系,外部碎片几乎消失。还支持虚拟内存——书太厚,只把当前要读的几页放桌上(内存),其余放柜子里(硬盘),读到不在桌上的页时触发"缺页中断"去柜子取。

分段存储 — "图书馆功能区"

图书馆按功能分区:小说区(基址A,占5000本)、参考书区(基址B,占200本)。你说"参考书区的第1040本",管理员先去参考书区基址,再加1040,还得检查有没有超出该区容量——越界了就不合法。

每个段在段表里记着两个值:基址(从哪开始)+ 段长(多大)。偏移 > 段长 → 地址越界,常见根源是数组下标越界没检查。

✅ 优势:按逻辑单位分段,共享容易(两个进程指向同一个代码段即可),支持动态链接。

段页式存储 — "先分功能区,每个功能区内部再拆散页"

图书馆先分区(小说区、参考书区),每个区内再拆散页放。地址 = 段号 + 页号 + 页内偏移。

集两家之长:既有分段共享和保护的能力,又有分页消除碎片的能力。


历史演进(为什么今天大家都在用分页):

1960s  分区存储  → 整存整取,碎片严重
1970s  分段存储  → 按逻辑段分,外部碎片仍在
1980s  分页存储  → 固定4KB ✅ 碎片极小+虚拟内存 → 成为主流
1990s至今      → Linux/Windows 纯分页

操作系统怎么选? 不是运行时选的,是OS写内核时就定死了。Linux/Windows 都用分页,因为只有分页支持虚拟内存。x86 硬件其实同时提供了分段和分页两套翻译单元,但 Linux/Windows 把分段"催眠"了(所有段基址设0、段长设满),实际只靠分页。

一句话速记:

策略一句话
分区包场一个连续房间,基址+偏移
分页书拆散页任意放,查索引卡找
分段按功能区划分,每区有基址+大小限制
段页式先分功能区,每个功能区内部再拆散页

练习题

[Q2] 段式存储-越界判断

假设系统采用段式存储管理方法,进程P的段表如下所示。逻辑地址( )不能转换为对应的物理地址。

image.png

  • A. (0,790)和(2,88)
  • B. (1,30)和(3,290)
  • C. (2,88)和(4,98)
  • D. (0,810)和(4,120)
📝答案与解析

答案:D

解析:段0段长800,偏移810>800越界;段4段长100,偏移120>100越界。


[Q3] 段式存储-越界原因

假设系统采用段式存储管理方法。逻辑地址不能转换为对应的物理地址;不能转换的原因是进行( )。

  • A. 除法运算时除数为零
  • B. 算术运算时有溢出
  • C. 逻辑地址到物理地址转换时地址越界
  • D. 物理地址到逻辑地址转换时地址越界
📝答案与解析

答案:C

解析:偏移>段长→地址越界,发生在逻辑地址→物理地址转换过程中。


[Q31] 段式存储-越界根源

假设系统采用段式存储管理方法,逻辑地址不能转换为对应的物理地址,可能的原因是( )。

  • A. 数组下标运算没有检查是否越界
  • B. 除零错
  • C. 内存段分配失败
  • D. 页面不在内存中
📝答案与解析

答案:A

解析:段越界的常见根源是程序数组下标越界未检查,导致段内偏移超出段长。


[Q51] 段页式地址

在段页式存储管理中,逻辑地址由( )组成。

  • A. 段号、页号和页内偏移量
  • B. 段号和段内偏移量
  • C. 页号和页内偏移量
  • D. 段号和页号
📝答案与解析

答案:A

解析:段页式=先分段再分页,逻辑地址=段号+页号+页内偏移。