3.3 分段与段页式存储管理
分段存储管理的逻辑地址结构、段表与地址变换,越界检查;分页与分段的比较;段的共享与保护(可重入代码);段页式存储管理的地址结构、段表与页表、地址变换与访存次数。
分段存储管理
分页是从系统管理内存的角度出发的,页的划分与程序的逻辑结构无关。而程序员往往希望按照程序的逻辑结构来组织地址空间:主程序、子程序、数据、栈各自成为一段,便于编程、共享、保护和动态增长。分段正是这样做的:
- 按照程序自身的逻辑关系把进程的地址空间划分为若干段,每段都有一个段名(编程时)和段号(编译后),每段从 0 开始编址;
- 内存分配以段为单位,段内要求连续,段间不要求连续。
逻辑地址结构
分段系统的逻辑地址由段号 S 和段内偏移量 W 两部分组成。例如 32 位逻辑地址中段号占 16 位、段内偏移占 16 位,则一个作业最多有 2¹⁶ 个段,最大段长为 64 KB。
分页的逻辑地址是一维的:程序员只需给出一个地址,由系统自动划分页号和页内偏移;分段的逻辑地址是二维的:程序员既要给出段名(段号),又要给出段内地址。
段表与地址变换
每个进程有一张段表,每个段对应一个表项,记录该段在内存中的起始地址(基址)和段长。系统中设有段表寄存器,存放段表的起始地址 F 和段表长度 M。地址变换过程如下:
- 从逻辑地址中取出段号 S 和段内偏移 W;
- 比较段号 S 与段表长度 M,若 S ≥ M,产生越界中断;否则找到段表中第 S 项(地址为 F + S × 段表项长度),取出段长 C;
- 若 W ≥ C,产生越界中断;否则物理地址 = 段的基址 b + W。
分页与分段的比较
| 分页 | 分段 | |
|---|---|---|
| 单位的性质 | 页是信息的物理单位,为了提高内存利用率而划分,对用户不可见 | 段是信息的逻辑单位,含有一组意义相对完整的信息,对用户可见 |
| 大小 | 页的大小固定,由系统决定 | 段的长度不固定,由用户编写的程序决定 |
| 地址空间 | 一维 | 二维 |
| 碎片 | 有内部碎片(页内),无外部碎片 | 无内部碎片,有外部碎片 |
| 共享与保护 | 不便于共享和保护 | 便于共享和保护,便于动态链接和动态增长 |
段的共享与保护
在分段系统中,共享是通过让多个进程段表中的相应表项都指向同一个物理段来实现的。只有纯代码(可重入代码)才能共享:它是一种不属于任何进程、在执行过程中不会被修改的代码,例如编辑程序的代码段;可修改的数据(如每个进程的局部数据)不能共享。
分段管理的保护方法主要有两种:一是存取控制保护——在段表项中设置存取权限(只读、读写、只执行);二是地址越界保护——比较段号与段表长度、段内偏移与段长。
段页式存储管理
分页能有效地提高内存利用率,分段能更好地满足用户需要。段页式把两者结合起来:先把作业的地址空间分成若干个逻辑段,每段有自己的段号;再把每段分成若干个大小固定的页。内存空间仍按页框划分。
- 逻辑地址由三部分组成:段号 S | 段内页号 P | 页内偏移 W;
- 系统为每个进程建立一张段表,每个段对应一个表项,记录该段页表的起始地址和页表长度;每个段有一张页表,记录段内各页对应的物理块号;
- 系统中设有段表寄存器,存放段表的起始地址和段表长度。
地址变换时:用段号 S 查段表(检查越界),得到该段页表的起始地址;用页号 P 查页表(检查越界),得到物理块号;物理块号与页内偏移 W 拼接成物理地址。因此,在没有快表时,一次访问要访问内存三次:第一次访问段表,第二次访问页表,第三次访问数据。可以同样增设快表,以段号和页号为关键字进行检索,命中时只需访问内存一次。
即时练习
- 1一个分段存储管理系统中,地址长度为 32 位,其中段号占 8 位,则最大段长是( )。
- 2某进程的段表内容为:段 0 段长 100、内存起始地址 6000、只读、在内存;段 1 段长 200、读写、不在内存;段 2 段长 300、内存起始地址 4000、读写、在内存。当访问段号为 2、段内地址为 400 的逻辑地址时,进行地址转换的结果是( )。
- 3在段页式分配中,CPU 每次从内存中取一次数据需要( )次访问内存(不使用快表)。
- 4下列关于分页与分段的叙述中,错误的是( )。
- 5采用段页式存储管理时,内存地址映射表是( )。
- 6可以被多个进程共享的代码必须是( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。