第5章 存储管理(下)
段式管理
基本概念
-
段式存储管理中,将存储空间按段进行管理,每个段的长度可以不同。把程序按内容、过程或函数关系分段,每段通过一个段名来标识
-
段式管理中,进程的虚拟空间是一个二维的结构
-
上述两点都和页式管理中非常不同:
-
页式管理中各进程的虚拟空间是连续独立的,也就是说同一个页中可能存有两个不同的过程,每个页面在逻辑上并不完整,在进程间无法共享。而通过段式管理就容易实现程序段和数据段的共享
-
页式管理中进程的虚拟空间就是一段连续的页面,和物理内存的线性结构相同,是一个一维的存储空间
-
-
段式管理中,进程的二维虚拟地址空间的两个维度:段号、段内相对地址
对某一个进程来说,其程序中的段号和段表中的段名一一对应
❓页式管理中虚拟地址空间不也是分成页号、页内地址两部分,为什么说是一维的?
🏴页式管理中,将虚拟地址分为两部分只是一种人为的额外“理解”和“划分”。本质上,这个虚拟地址仍然是“一个”地址,并不是由两个地址拼起来的
对于某个进程,它的虚拟地址空间仍然是从小到大连续编址的,页表中的页号永远是从小到大连续的,中间并没有“跳过”某一段地址。
从数值上看,前一页最后一个存储单元的地址和后一页第一个存储单元的地址是连续的
因此页式管理的虚拟地址空间本质上是一维的
(若此处仍不好理解,可以与后面段表部分的讲解结合起来看)
段表
段式管理程序在进行初始内存分配之前,会为每个作业/进程建立一个段表
段表一般存放在内存中的一块固定区域内,下图是带有访问标志位和访问权限控制的段表
-
段号:从0开始,按序往后编址,在本进程内,这个段号和段名是一一对应的,例如段名X对应段号3。如此就可以根据段名找到要访存的位置
-
起始地址、长度、内存还是外存:通过这三个字段的信息,就可以锁定要访存的真实地址了
-
存取方式:规定了本进程对目标段的读写权限,例如可读R、可读可写RW等
-
访问位:即访问标志位,标志这个段在近期是否被访问过,与页式管理中相同,访问位可以用于淘汰算法
段的分配与释放
段式管理中,以段为单位分配管理内存,每个段对应一块连续的内存,同一进程包含的各段可以不连续
段式管理中,内存的分配与回收释放都是在进程/作业的执行过程中动态进行的
当进程/作业请求某个段且该段不在内存中,需要从外存调入时,发起缺段中断,此时可以分为两种情况
-
内存中空闲区足够
段式管理中,对空闲区的数据结构组织,可以使用和动态分区管理相同的方法(例如自由链);对选择哪个空闲区分配给来请求的段,也可以使用和动态分区管理相同的方法(最先适应、最佳适应、最坏时应)
-
内存中空闲区不足
此时就需要淘汰已经存在于内存中的段。与页式管理中淘汰出去一个页面替换不同,由于段式管理中各段的长度不同,可能需要淘汰多个段以满足当前需要换入的段
动态页式管理中的几种淘汰算法(FIFO、LRU等)都可以用于此处的淘汰
地址变换
在段式管理中,地址分成的两部分是没有直接关联的,单纯只是两个地址的拼接,是两个可以相互独立的地址。相较于页式管理中将一个虚拟地址“视为”页号+页内地址完全不同
在数值上,前一段的最后一个存储单元的地址和后一段的第一个存储单元的地址并不是连着的
另外需要注意的是,程序中的段名本质上是和段表中的起始地址一列唯一对应的。也就是说,不同的程序可以使用同一个段名实现段的共享
使用段式管理时,系统对地址的处理过程如下
-
某进程准备开始执行,管理程序将该进程对应段表的起始地址放入段表地址寄存器
-
进程需要访存时,管理程序根据虚拟地址中的段号索引段表表项,以获得该段的相关信息
-
若该段在内存中,根据对应表项的起始地址找到对应位置读取即可;
若该段不在内存中,发起缺段中断,由中断处理程序处理(包括空闲内存足够可以直接换入、空闲k空间不够需要淘汰两种情况)
段的共享
若用户进程/作业需要共享某个段,只要在不同的进程/作业中使用相同的段名,在运行过程中,管理程序在段表表项中的起始地址就会写上相同的地址,从而实现共享
由于不同的进程/作业都拥有自己的段表,如此就可以实现“不同进程/作业对一个共享段的权限不同”
另外需要注意的是,当系统中有多道进程并发执行时,正在被使用或即将被使用的共享段显然不应该在淘汰算法中被淘汰。往往会在段表中额外设置一列作为共享位来判别该段是否正在被某进程调用
下图中展示的就是两个进程共享同一个数据段X的情况
段式管理的缺陷
-
仍然需要硬件机构完成,成本增加
-
段式管理在对空闲区的管理上和分区管理相同,每个段大小不同,因此也同样存在存储空间的碎片问题
-
由于也存在淘汰处理,会有抖动的风险
-
显然,段式管理中,每个段的长度受内存可用空间大小的限制
段页式管理
结合页式管理和段式管理的思路,以增加系统开销的代价消除段式管理中空闲空间碎片化、每个段占用连续空间、段长受内存可用空间大小的限制的缺陷
段页式管理是在段式管理基础上,使用页式管理的思路进行的优化
基本概念
-
段页式管理事实上就是把段式管理中的每个段按照相同的大小分为不同的页
-
段页式管理中的虚拟地址与段式管理中相同,由两个相对独立的地址拼接而成,只不过借用页式管理的思路,将段内地址部分视为两部分,即段中的页号与页内相对地址
-
显然,段页式管理中,物理内存被分成了若干相同大小的页
段表
显然,在段页式管理中,段表中的每一项都要存储本段对应的页表在物理内存中的起始地址。另外,段的长度是可变的(即一个段中的页数是可变的),也就是说,其对应的页表也是可变的,所以还需要存放本段对应页表的长度
页表
和页式管理中的页表相同,记录着从页号到块号的映射
地址变换
段页式管理中,设段号为s、段内地址为w(视为页号p和页内地址d两部分),根据虚拟地址寻找访存空间的执行过程如下
-
某进程准备开始执行,管理程序将该进程对应段表的起始地址放入段表地址寄存器
-
在段表中根据段号s找到要访问段的记录,获得本段对应页表在物理内存中的起始地址
-
在页表中根据页号p找到访问页的记录,获得要访问页在物理内存中的起始地址
-
将上一步中获得的页的起始地址与页内地址d相加,定位到要访问的字节位置