Appearance
基本分段
考情分析
分段常与分页对比出题,属于 🔥🔥 中高频考点。
分页对用户完全透明,但程序天然就有"代码段""数据段""栈段"这样的逻辑边界——能不能按这种自然结构来划分内存,让共享和保护更直观?
分段的思想
分页是从系统管理角度出发的(固定大小、对用户透明),而分段是从用户视角出发——按照程序的自然逻辑结构划分。
一个程序可以分为:代码段、数据段、栈段等。每个段有自己的段名(段号)和段内偏移。打个比方,如果分页是把一本书按固定页数裁成等大的小册子,分段就是按章节来拆——每章长短不一,但语义完整。
逻辑地址结构
逻辑地址 = 段号 S + 段内偏移 W
|← 段号 S →|← 段内偏移 W →|与分页不同:各段的长度不固定。
段表
| 段号 | 段基址 | 段长 |
|---|---|---|
| 0 | 40K | 10K |
| 1 | 80K | 20K |
| 2 | 120K | 15K |
地址变换
注意:分段需要检查两次越界(段号越界 + 段内偏移越界)。
交互可视化
分页 vs 分段
| 比较维度 | 分页 | 分段 |
|---|---|---|
| 划分依据 | 系统自动按固定大小划分 | 用户按逻辑结构划分 |
| 页/段大小 | 固定 | 不固定 |
| 地址空间 | 一维(页号+偏移) | 二维(段号+偏移) |
| 碎片 | 有内碎片 | 有外碎片 |
| 共享 | 不方便(代码可能跨页) | 方便(一个段就是一个逻辑单元) |
| 动态增长 | 不支持 | 支持(段可以增长) |
| 对用户 | 透明(用户感知不到分页) | 可见(用户知道段的存在) |
分段方便共享和保护
由于段是按逻辑功能划分的,共享一个函数只需共享对应的代码段,保护也可以按段设置权限。分页中同一个函数可能跨越多个页面,共享和保护都不方便。
易错
分页和分段的碎片类型经常混淆:
- 分页:有内碎片(最后一页可能不满),无外碎片
- 分段:有外碎片(段间空隙),无内碎片
- 段页式:有内碎片(段内最后一页不满),无外碎片
记忆技巧:固定大小划分(分页)→内碎片;可变大小划分(分段)→外碎片。
考研高频考点
- 🔥🔥🔥 分页与分段的对比(选择题必考)
- 🔥🔥🔥 分段的地址变换过程(两次越界检查)
- 🔥🔥 分段方便共享和保护的原因
- 🔥🔥 分段是二维地址空间
- 🔥 分段有外碎片无内碎片
分段方便共享但有外碎片,分页消除外碎片但不方便共享——能不能两者兼得?下篇来看段页式管理。