3.3 分段存储管理机制 (由可变分区演化而来)
- 逻辑分段与内存划分
- 分段存储的管理表格
- 分段存储的地址转换
- 分页和分段存储比较
- 段页式存储管理方案
一、逻辑分段与内存划分
(一)逻辑分段:
按照程序逻辑关系划分成若干个程序段或者数据段(例如函数模块等)
对每一段进行编号,段从0开始编号,每一段内部从0开始编址;(和逻辑页面的编址类似)
例如:
有一个程序可以分为主程序段M、子程序段X、子程序段Y、工作区段B、数组A共五个段,每一个段内都是从0开始编制;
(二)内存划分:
内存也是按照程序段来划分的;
内存空间会按照用户程序的需要划分为若干个长度不相同的物理段;
(例如:主程序段有一个物理段,各子程序也有各自的物理段)
每个物理段由起始地址和长度来确定;
每一个物理段在内存中占据连续空间,但是段和段之间可以离散存放;
二、分段存储的管理表格
(一)段表:
段表和页表类似,建立了逻辑段和物理段之间的对应关系;
每一个进程都有一个段表,段表记录了进程的每一个逻辑段在内存中的位置信息(主要包括起始地址和长度);
进程的段表也是存放在内存当中的,属于进程的现场信息;
段表是在进程装入内存时, 根据内存的分配情况建立的;
(和页式存储方案类似,段表也有请求表这类管理表格,不重复讲了)
(二)其他硬件支持:
段表始址寄存器:
用于保存正在运行的进程的段表的始址;(不是某一段的始址)
段表长度寄存器:
用于保存正在运行进程的段表的长度;
三、分段存储的地址转换(逻辑地址转为物理地址)
分段存储的地址转换不同于分页存储的地址转换;
图示说明:
首先CPU获得的是某进程的逻辑地址,但是必须告诉CPU该逻辑地址对应的物理地址,CPU才能找到对应的数据或代码段;
逻辑地址由段号和段内地址组成。
系统首先提取段号,然后系统将段号与段表长度寄存器中的值进行比较(段号一定是会小于段表长度的,例如某进程由0~9共十个段,则段长为10,段号一定小于10)。
如果段号大于段表长度,系统返回地址越界错误。
如果段号没出错,则系统将段号和段表始址寄存器中的值做加法操作。
因为利用段表始址寄存器找到了段表在内存中的位置,而段表在内存中的存储也是连续的,所以段号与段表地址相加就能找到段表中该段号在内存中的位置信息;
在得到物理地址之前,还要将段表中记录的段长度与逻辑地址中的段内地址相比较,这样可以防止在访问段内部地址时出现越界错误;
(例如:某段的段长是10,则该段的逻辑地址为9,表示0~9共十个地址。逻辑地址是一定会小于段长的,如果大于则报错)
如果如果两次比较都没有出错,则将段内地址和段的起始地址相加,得到最终的物理地址;
四、分页和分段存储比较
(一)分页存储的特点:
优点:
- 解决了空间碎片问题;
- 便于管理
缺点:
- 不易实现共享(因为程序被按照空间大小被切分,而没按照逻辑功能被切分)
- 不便于动态链接
(二)分段存储特点:
优点:
- 便于动态申请内存
- 便于实现共享
- 便于动态链接
- 段表长度较短
缺点:
- 产生空间碎片
- 不易扩展(段内不易扩展额外空间)
五、段页式存储管理方案
结合页式段式的优点,克服两者的缺点;
首先按照用户程序逻辑关系将程序划分为若干逻辑段;
然后再按照分页存储管理机制对每一段内部进行划分和内存分配;
(先分段,再分页)