5.2.7 段式存储管理
支持用户的分段观点,将程序按内容或过程(函数)关系分段,每段都有完整的逻辑意义,每段的程序都可独立编制,且每段的长度可以不同。段式管理程序以段为单位分配内存,然后通过地址映射机构,把段式虚拟地址转换成实际的内存物理地址。
1.基本思想
(1)用户程序自然划分
用户程序按程序自身的逻辑关系划分为若干个程序段,每段都有一个段名,且有一个段号。段长不一定相同。段号从0开始,依次递增。
(2)内存根据段动态划分
内存动态划分为若干个长度不相同的区域,这些区域称为物理段,每个物理段由起始地址和长度确定。
(3)逻辑地址
所有的段号构成了一个一维地址空间,同时每个段都有自己的地址空间,其中的地址就是段内地址,每一段的段内地址也从0开始连续编址。段式存储管理方式下,整个进程的地址空间是一个由段号和段内地址构成的二维地址空间,因此,逻辑地址是一个二维地址,由段号S和段内地址W组成。
2.内存分配与去配
以段为单位分配内存,每一个段在内存中占据连续空间(内存随机分割,需要多少,分配多少)。在物理上,段内地址连续,但各段之间可以不连续。
内存分配时,因为需要将作业或进程的所有段一次性都装入内存,所以系统需要判断内存空闲区表中是否有空间装下每一段,如果有,则分配;否则,不予分配。当进程执行完毕,系统回收所占的内存空间,并清除该进程的段表。
内存空闲区表中主要记录了每个空闲区的首地址和长度。内存分配和去配后,都需要对内存空闲区表进行修改。内存分配时,对一个段的内存分配类似于可变分区的内存分配方式,因此当空闲区表中有多项满足段大小时,可采用的内存分配算法与可变分区的内存分配算法相同。如果空闲区都不是足够大时,可以采用紧凑(拼接)技术合并空闲区。
3.段表与地址转换
当一个作业或进程全部装入内存后,系统为其创建一个段表,并将段表的相关信息填入该进程的PCB中。段表中记录了段号、段的首地址和段的长度。
进程装入内存时需要将其相对地址转换为绝对地址,这时可以采用动态重定位方式,有硬件地址转换机构提供支持:段表基址寄存器和段表长度寄存器。当一个进程被调度时,操作系统从PCB中读取出段表首地址和长度,置入段表基址寄存器和段表长度寄存器中。进程运行时,由系统分别将该进程的段表地址和段表长度装入段表基址寄存器和段表长度寄存器。
地址转换的大致过程如下:
1)提取逻辑地址中的“段号”。
2)比较“段号”与段表长度寄存器中的长度,如果超出长度,系统发出越界中断信号,终止进程;否则,执行3)。
3)根据段表基址寄存器给出的段表首地址查找该进程的段表,找到“段号”对应的段首址。
4)比较“段内地址”与段的长度,如果超出长度,系统发出越界中断信号,终止进程;否则,执行5)。
5)得到欲访问单元的主存绝对地址(物理地址),并进行访问。
物理地址=段首地址+逻辑地址中的段内地址
与页式存储管理一样,可以利用快表保存段表的一部分段表项,加快查找速度。具有快表的地址转换分为两个阶段:先查找快表,找不到需要的段号,再到内存中查找段表,找到段号对应的段首地址和长度。
4.段的共享和存储保护
段的共享与页面共享类似,共享的数据段在进程的段表中可指定不同的段号。对于代码段,则要求所有共享代码段在所有进程的逻辑空间中拥有相同的段号。
存储保护与页式存储管理相同,当段号大于等于段表长度时,产生越界中断;当段内地址大于等于该段的段长,产生越界中断。
此外,对于共享段的信息必须进行存取控制和保护,当违反规定的访问权限时,系统将产生一个“非法操作”的程序性中断事件。