一、为什么需要“分段”?
在程序运行时,代码、数据、堆栈等部分具有不同的功能和访问属性。
为了更好地管理这些不同类型的内存区域,操作系统提出了“分段机制”。
📘 类比:
想象内存是一栋大楼,程序由多个部门组成(代码区、数据区、堆区、栈区),
分段就是给每个部门划定单独楼层,每层的权限、用途都不同。
二、分段的基本原理
1️⃣ 程序结构
程序一般由以下逻辑段组成:
- 代码段(存放程序指令)
- 数据段(存放全局变量)
- 堆段(动态分配内存)
- 栈段(函数调用与局部变量)
每个段有不同的读写执行属性。
2️⃣ 虚拟地址结构
在分段机制下,虚拟地址由两部分组成:
虚拟地址 = 段选择因子(Segment Selector) + 段内偏移量(Offset)
- 段选择因子:决定访问哪个段(存在 CPU 段寄存器中),
内含:
-
- 段号(索引段表)
- 特权等级(权限控制)
- 段界限(最大长度)
- 段内偏移量:表示段内的偏移距离。
📘 类比:
段选择因子是“楼层号”,偏移量是“楼层内房间号”。
3️⃣ 地址转换过程
- 程序提供虚拟地址(段号 + 偏移量)
- CPU 查段表,找到段的基地址(Base Address)
- 物理地址 = 段基地址 + 段内偏移量
举例:
若段3的基地址为 7000,偏移量为 500,
那么物理地址 = 7000 + 500 = 7500。
📘 类比:
找房间时,先确定楼层(段表基址 7000),
再加上房间号(偏移 500),最终定位房间 7500。
三、分段的优势
| 优点 | 说明 |
| 1️⃣ 逻辑清晰 | 各功能模块(代码、数据、堆栈)相互独立 |
| 2️⃣ 方便管理 | 不同段可设不同访问权限(只读/读写/执行) |
| 3️⃣ 易于共享与保护 | 例如多个程序可共享只读代码段 |
四、分段存在的问题
虽然分段机制解决了地址隔离问题,但在多进程系统中,仍存在性能和空间管理问题:
1️⃣ 内存碎片问题
- 内部碎片:分配的空间大于实际使用(分段机制中较少出现)。
- 外部碎片:多个不连续的小空闲区域无法拼出足够大的连续空间。
📘 示例:
假设 1GB 内存被以下程序使用:
游戏:512MB
浏览器:128MB
音乐:256MB
关闭浏览器后空闲了 256MB,但可能被分成两块 128MB。
于是一个需要 200MB 的新程序就无法加载。
📘 类比:
房间之间有空隙,但因为不连续,放不下一个大柜子。
2️⃣ 内存交换效率低
为解决碎片问题,系统可以使用 Swap(交换空间):
- 把某段内存内容写入硬盘;
- 重新调整位置;
- 再读回内存中形成连续空间。
问题是:
- 硬盘访问速度远慢于内存;
- 每次交换都是“大段搬家”;
- 导致系统卡顿、性能下降。
📘 类比:
为腾出一间连续的会议室,要先把一整层办公室的家具搬到仓库再搬回来,非常低效。
五、总结:分段机制的本质与局限
| 项目 | 内容 |
| 目标 | 让程序逻辑上独立运行,不直接使用物理地址 |
| 原理 | 段表记录每段基址与界限;虚拟地址 = 段号 + 偏移量 |
| 优点 | 清晰结构、权限管理、支持共享 |
| 缺点 | 会产生外部碎片、内存交换低效 |
| 结果 | 分段机制最终被 分页机制(Paging) 取代 |
📘 一句话理解:
分段像是“按功能划区”的内存管理方案,
逻辑清晰但容易“空间不够拼”,
后来人们发明了“分页”,把内存切成小块更灵活。
✅ 一句话总结:
分段机制让程序更结构化、更安全,但难以高效利用内存。
外部碎片与低效的交换使它逐渐让位于“分页机制”,为现代虚拟内存奠定了基础。

2620

被折叠的 条评论
为什么被折叠?



