基本思想
- 按程序的逻辑结构划分为若干段(Segment)
- 每段有独立的名称和长度(主程序段、数据段、堆栈段等)
- 每段独立编址(从 0 开始),段长可变
- 物理内存采用可变分区管理
- 通过段表实现段到物理内存的映射
- 每个进程一张段表
- 包含:段号、段基址、段长度、状态位等
- 段号由数组下标自然表示
- PCB 中有指针指向段表
地址转换
- 二维逻辑地址:段号(S)+ 段内偏移(D)
- 转换过程:
- 查段号 S 是否超过段表长度寄存器(越界保护)
- 查段表获取该段物理起始地址
- 检查段内偏移 D 是否越界(D < 段长度)
- 物理地址 = 基址 + 段内偏移(加法拼接,区别于页式的位拼接)
共享与保护
- 共享:不同进程段表的段表项指向同一物理起始地址(共享代码段、共享库)
- 保护:每段可独立设置访问权限(只读代码段、可读写数据段)
优缺点
- 优点:对用户自然(按逻辑划分),便于共享和保护,无内部碎片
- 缺点:外部碎片(需内存紧致 Complex),内存分配复杂,编程需在汇编中加段号
重点 页式 vs 段式
| 方面 | 页式 | 段式 |
|---|
| 划分依据 | 固定大小(系统决定) | 逻辑结构(用户/程序员) |
| 地址结构 | 一维线性 | 二维(段号 + 偏移) |
| 段/页大小 | 固定(2^k) | 可变 |
| 表 | 页表(较长) | 段表(较短) |
| 物理地址形成 | 帧号|偏移(位拼接) | 基址 + 偏移(加法) |
| 对用户 | 不自然 | 自然 |
| 碎片 | 内部碎片(平均半页) | 外部碎片 |
| 共享保护 | 困难 | 容易 |
| 内存扩充 | 不支持 | 不支持 |