上一节我们在连续内存分配中提到了两种用于解决外部碎片问题的非连续内存分配技术,即分页和分段,本接将详细讲解这两种非连续内存分配技术以及它们的进阶版——段页式存储管理。
1.1 分页存储管理
离散分配方式允许将一个进程直接分散地装入到许多不相邻接的分区中。如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式
分页存储管理的基本原理
页面和物理块
-
页:页面号
-
系统把用户程序的地址空间划分成若干个大小相等的区域,每个区域称作一个页面或页
-
页号一般从0开始
-
-
物理块(页框):帧
-
把内存空间划分成若干和页大小相同的物理块,这些物理块叫“帧”(frame)或内存块
-
块号从0开始
-
-
页内碎片
-
在分页系统中,为进程分配内存时,以块为单位将进程中的若干页分别装入多个可以不相邻接的块中。由于进程的最后一页经常装不满一块,而形成不可利用的碎片,称为“页内碎片”
-
地址结构
在分页系统中,每个逻辑地址分为两个部分:页号(p)和页内偏移(或称页内地址)(w)。
-
通常,如果逻辑地址空间为2^m,页的大小为2^n单元,那么逻辑地址的高m-n位表示页号(长度),而低n位表示页内偏移(长度)。
-
例:地址长度为32位,其中0~9位为页内地址,每页的大小为1KB(2^10),10~31位为页号,地址空间最多可有4M(2^22)页
-
-
地址变换 = 内存起始地址+页内偏移量(页内地址)
-
给定逻辑地址A,页面大小为L,则(INT是向下整除的函数)
-
假设系统的页面大小为1KB,A=5960,则p=INT(5960/1024)=5,w= 5960%1024=840
-
页表
一个进程的页面可以离散的装入物理上不连续的内存块中
系统为每个进程建立一张页面映射表,简称页表,每个页在页表中占一个页表项,其中记录了该页在内存中对应的物理块号。
进程执行时,首先按照逻辑地址中的页号查找页表中对应的项,找到该页在内存中的物理块号。页表的作用就是实现页号到物理块号的地址映射
-
每个页在页表中都有一个表项:
-
对于中、小型作业,其页表完全放在内存中
-
对于大、中型作业的页表,可采取两级结构形式
-
碎片问题
-
采用分页技术不会产生外部碎片,每一物理块都可以分配给进程页面
-
分页技术可能产生页内碎片
-
在最坏的情况下,一个需要n页再加上1 B的进程,就需要给它分配n+1个物理块。这样就几乎产生了一个物理块的页内碎片
-
地址映射
任务:
-
将逻辑地址中的页号转换为内存中的物理块号
基本的地址映射
过程 :
-
当进程要访问基个逻辑地址中的指令或数据时,分页系统的地址变换机构自动将有效地址分为页号和页内地址两部分,再以页号为索引去检索页表。整个查找过程将由硬件来执行。
具有快表的地址变换机构
CPU取一个数据或指令至少要访问内存两次:
-
访问页表
-
访问存储数据
具有快表(高速联想存储器)的地址变换过程:
-
快表:具有并行查询能力的特殊高速缓冲存储器,用以存放当前进程访问过的页表项
-
基于程序运行时所呈现的“局部性”工作原理实现
过程:
-
在 CPU 给出有效地址后,由地址变换机构自动将页号交给快表,并将此页号与快表中所有页号进行比较
-
如果找到该页号,该项中对应的值就是物理块号,从而迅速形成物理地址
-
如果页号不在快表中,就需要访问页表。同时,将页号和物理块号增加到快表中,这样下次再用时即可快速查到
-
如果条目已满,那么操作系统会选择其中一些进行替换
拓展: 关于联想存储器 基于成本,联想存储器不能太大 联想存储器的效果,取决于访问联想存储器的命中率
页表的结构
对于32位的地址结构,假设页面大小为4KB - 作业最大时可达到2^32=4G - 最多可有页面数为: 2^32/4KB=2^20=1M(个) - 假设:存储页表中每个页表项需4B - 则存储页表需1M×4B=4MB
现代计算机系统都支持非常大的逻辑地址空间(2^32 ~2^64)。在这种情况下,页表会变得非常大,要占用相当大的内存空间
解决办法:
-
将页表分页后再离散存储在内存中
-
只将当前需要的部分页表项调入内存,其余的仍然在外存,需要时在调入(虚拟存储器系统)
两级页表
两级页表:将页表进行再分页,并离散地将各个页面分别存放在不同物理块中的办法来加以解决的方法
外层页表:为离散分配的页表所建立的一张页表,每个页表项中记录了某个页表页面的在内存占据的页框号
地址变换过程:
解决问题:
-
大页表的不需要大片连续存储空间
存在问题:
-
未能实现用较少的内存去存放大页表的问题
-
解决办法:请求分页
-
多级页表
对于64位的逻辑地址,两级分页方案就不再适合了。因此必须采用多级页表,将外层页表再进行分页。
1.2 分段存储管理
分段存储管理方式的引入
分段存储管理的好处:
-
方便用户编程
-
易于实现程序和数据的共享
-
易于实现信息的保护
-
便于满足用户动态链接的需要
-
便于实现程序或数据的动态增长
分段存储管理的基本原理
在分段存储管理方式中,程序按内容或过程(函数)关系划分为若干个段,每个段定义一组逻辑信息,都有自己的名字。
在段式管理方式下,进程的地址空间设计为二维结构,包括段号s与段内地址w。
分段的基本概念
-
每个段是一组相对独立的逻辑信息
-
分段长度由其逻辑信息组的长度决定,各段长度不等,可以动态增长
-
分段方式需要得到编译程序的支持
-
作业的地址空间被划分为多个分段,每个分段都从0开始编址,并采用一段连续的地址空间
分段存储管理的内存管理策略
-
采用动态分区存储管理,每个分段连续存储在一个分区中
-
多个分段离散存储在内存中的不同分区中
段表
-
在系统中为每个进程建立一张段映射表
-
每个段在表中占有一个表项,其中记录该段在内存中的起始地址(又称基址)和段的长度
-
段表是用于实现从逻辑段到物理内存区的映射,执行中的进程可通过查找段表找到每个段所对应的内存区。
-
段表寄存器
-
段表可以存放在一组寄存器中,这样有利于提高地址转换速度
-
两部分组成:
-
一部分指出该段表在内存的起始地址
-
另一部分指出该段表的长度
-
-
地址变换
CPU取一个数据或指令至少要访问内存两次:
-
访问段表
-
访问存储数据
分页和分段的异同
相同点
-
两者都采用离散分配方式
不同点
-
页是信息的物理单位,分页是从系统管理出发,为了提高内存利用率
-
段是信息的逻辑单位,分段是为了满足用户的需要
-
页面大小固定,取决于机器硬件结构
-
段长不固定,取决于用户编写的程序
1.3 段页式存储管理
优点:
-
易于实现、易于信息共享和保护
-
很好地解决内存外部碎片问题
-
可为各个分段离散分配内存
缺点:
-
段页式存储管理的开销会更大
-
一般只用在大型机系统中
段页式存储管理的基本原理
先将用户程序分为多个分段,再把每个分段划分为若干页,并为每个段赋予一个段名
地址结构
在段页式存储管理中,其地址结构由段号s、段内页号p及页内相对地址d三部分组成
段表和页表
页表(分段为单位):多个
-
每个分段被划分为多个页面,每个页面对应于一个页表项,记载在属于同一个分段的页表中,即一个分段对应有一个页表存在
段表(进程为单位):一个
-
有多少个分段,段表中就有多少个段表项
-
每个段表项记载的是对应分段页表在内存中存放的起始地址和页表长度
段表寄存器
-
存储段表始址和段表长度TL
地址变换
CPU取一个数据或指令至少要访问内存三次:
-
由段表地址寄存器得到段表起始地址去访问段表
-
访问页表(得到要访问的物理地址)
-
访问真正需要的物理单元
1.4 虚拟存储器
作业全部进入内存的不足
-
作业很大,其要求的存储空间大于内存总容量
-
大量作业要求运行,但内存容量有限,只能分批运行
解决办法
-
从物理上增加内存容量
-
从逻辑上扩充内存容量