操作系统13————存储器管理之分页存储
一.目录
文章目录
二.概述
连续存储会产生许多的“碎片”,虽然“紧凑”方法可以将许多碎片拼接可以的大块空间,但需为之很大的开销。如果允许将一个进程直接分散的装入到许多不相邻的分区中,便可以充分利用内存空间。基于这一思想,产生了离散分配方法。根据在离散分配时所分配的地址空间的基本单位不同,将离散分配方法分为以下三种:
- 分页存储管理方式:该方法中,将用户程序的地址空间分为若干个固定大小的区域,成为“页”或者“页面”,典型的页面大小为1KB.相应的,也将内存空间分为若干个物理块或者叶框,页和块的大小相同,这样可将用户程序的任一页放入任一物理块中,实现离散分配。
- 分段存储管理方式:这种方法时为了满足用户的要求而形成的一种存储管理方式,它把用户程序的地址空间分为若干个大小不相同的段,每段可以定义一组相对完整的信息,在存储器分配时,以段为单位。这些段不相邻,同样也实现了离散分配。
- 段页式存储管理方式:这是分段和分页结合的产物。它具有两者的优点,是目前应用教广泛的一种存储管理方式。
三.分页存储管理的基本方法
1.页面和物理块
a.页面
分页存储管理将进程的逻辑地址分为若干页。病对每个页进行编号,从0开始,如:第0页,第1页。相应的,把内存中的物理地址分为若干块,同时对他们进行编号,如0#,1#等。在内存分配时,以块为单位,将若干页面分别装入多个不相邻的物理块中。由于进程的最后一页经常装不满,就形成了不可利用的碎片,称为“页面碎片”
b.页面大小
在分页系统中,页面过小会造成单个进程占有多个页面,从而导致进程的页面过长,占用大量内存,还会降低页面换进换出的效率。页面过大,会导致页面碎片过大。因此,页面的大小应该适中,且页面大小应该为2的幂。通常为1kb—8kb.
2.地址结构
分页地址中地址结构如下:
它包括两部分:前一部分为页号P,后一部分表示为位移量W,即页内地址。
上图中的地址长度为32位,其中011位表示页内地址,即每页大小为4kb,1231表示页号,地址空间最多运行有1M页。
对某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按下式求得:
$ P = A/ L $(整除)
$ d= A % L $(取余)
3.页表
在分页系统中,为了保证进程可以在内存中找到每个页面对应的物理块,系统为每一个进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页,依次在页表中有一页表项,其中记录了相应页在内存对应的物理块号。如下图:
在分页系统中,常常会在页表的表项中设置一各存取控制字段,用于表示该存储块中的内容是允许读/写还是只读,以此来对该存储块中的内容加以保护。
四.地址变换机构
地址变化机构的任务是将逻辑地址中的页号转换为内存中的物理块号。
1.基本的地址变换机构
进程在运行期间,需要将用户地址空间中的逻辑地址变换为内存空间中的物理地址,由于它执行的频率非常高,每条指令的地址都需要进行变换,因此需要采用硬件来实现。页表功能是由一组专门的寄存器来实现的。一个页表项用一个寄存器。而页表大多驻留在内存中,在系统中只设置一个页表寄存器,在其中存放页表在内存中的的始址和页表的长度。在进程未执行时,这两个数据存在进程的PCB中,当操作系统调度该进程时,再讲这两个数据装入页表寄存器中。因此。单处理机环境中,虽然系统可以允许多个进程,但只需要一个页表寄存器。
转换过程
当进程要访问某个逻辑地址中的数据时,分页地址变化机构会自动将有效地址分为页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。执行前,将页号和页表长度进行比较,查看是否出现越界错误,如果出现则产生地址越界中断,若未出现,则将表页始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可以得到该块的物理块号,将之装入物理地址寄存器中,与此同时,再将有有效地址寄存器中页内地址送入物理地址寄存器的块内字段中,这样就完成了从逻辑地址到物理地址的转变。
逻辑地址转换物理地址实例
已知:逻辑地址A = 2500 B,页面大小(块的大小) L = 1 K, 页表起始项F,页表长度M(页表长度:指的是一共有多少页。页表项长度:指的是一页占多大内存。)
-
第一步:根据逻辑地址计算逻辑地址(页号 * 页长 + 偏移地址)中的页号(P = A/L)和地址偏移量(W = A %L).
逻辑地址A = 2500 B,得到 P = 2, W = 452 -
第二步:比较页号P和页表长度M,若P > M,则产生越界中断,否则继续执行
-
第三步:页表寄存器中,分为两部分(页表起始地址F和页表长度M),计算页号P在页表中对应的物理地址的页表项地址(对应块号b) p = 页表起始项F +页号P * 页表项长度L,根据页号,得到物理块号B,直接对应的2页号对应块号8(页号与块号在页表中有直接对应)
-
第四步:计算物理地址E = b L +W (块号 块大小+地址偏移量)得到E = 8 * 1 KB +452 B = 8644 B ,得到物理空间之后,就可以访问内存了。
2.具有快表的地址变换机构
上述方法需要访问两次内存,一次是访问页表,确定所存取数据或指令的物理地址,一次是根据该物理地址存取数据或者指令。显然这样的方法较慢。
为此我们可以在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器——快表,又称联想寄存器,用来存放当前访问的若干页表项,加速地址变换过程,命中率达到90%以上
第一步就变为了:将逻辑地址中的页号直接送入高速缓存寄存器,与快表进行匹配,未找到则按慢表处理,同时把未找到的项放入到块表中,如果块表存满后,删除一个老的且被认为不在需要的页表项~
有些处理器设计为快表和慢表同时查找,快表查找成功则终止慢表的查找
五.访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据,所需要花费的总时间,称为内存的有效访问时间(Effective Access Time,EAT)。
假设访问一次内存的时间为t,在基本分页存储管理方式中,有效访问时间为:EAT = t + t = 2t
在引入快表的分页存储管理方式中,有效访问时间的计算公式即为;EAT=а×λ+(t+λ)(1—а)+t=2t+λ-t×а。λ表示查找快表所需要的时间,а表示命中率,t表示访问一次内存所需要的时间。
六.两级和多级页表
1.引入原因
现代系统大多都支持非常大的逻辑空间,在这种情况下,页表就变得非常大,要占用相当大的内存空间。为了解决这一问题,我们采用了两种方法来改进这个问题
- 对于页表所需要的内存空间,采用离散分配的算法。来解决难以找到一块连续的大内存问题
- 只将当前需要的部分页表项调入到内存,其余页表项仍驻留在磁盘上,需要时在调入。
2.两级页表
a.外层页表
两级页表就只将页表再次进行分页,将页表页面在离散的放在不同物理块中。同时为这些分散的页表页面再建立一张页表,称为外层页表,外层页表的页表项记录了页表页面的物理块号。
b.地址结构
以32位逻辑地址空间为例。当页面大小为4kb时,若采用一级页表,应具有20位页号,即页表项应该有1m.如果采用二级页表结构时,在对页表进行分页,页表分页包含
2
10
2^{10}
210个页表项,最多允许有
2
10
2^{10}
210页表页面。即如下图:
外层页表的页表项是页表,页表的页表项是进程的页面
c.地址变换
在两级页表中,增加了一个外层页表寄存器,存放外层页表的始址,并利用逻辑地址中的外层页号
P
1
P_1
P1作为外层页表的索引,从中找到指定页表分页的始址,再利用
P
2
P_2
P2作为指定页表分页的索引,找到指定的页表项,其中即含有该页在内存的物理块号P,用该块号P和页内地址d即可构成访问的内存物理地址。
3.多级页表
对于32位的机器,采用两级页表结构是合适的,但对于64位的机器,如果要求它支持 2 32 2^{32} 232规模的物理存储空间。,则即使是采用三级页表结构也是很难办到的的,而当前的实际应用中也无此必要。故在进两年退出的64OS中,把可直接寻址的存储器空间减少为45位长度,便可以利用三级页表结构实现分页存储管理。
七.反置页表
1.反置页表的引入
为了减少页表占用内存的大小,引入了反置页表。
一般的页表的页表项是按照页号进行排序的。页表项中的内容是物理块号。而反置页表是为每一个物理块建立一个页表项,并将他们按照物理块的编号进行排序,其中内容是页号和其所隶属进程的标识符。
2.地址变换
在利用反置页表进行地址变换时,是根据进程标识符和页号,去检索反置页表。如果检索到与之匹配的页表项,则该页表项(中)的序号i便是该页所在的物理块号,可用该块号与页内地址一起构成物理地址送内存地址寄存器。若检索了整个反置页表仍未找到匹配的页表项,则表明此页尚未装入内存。对于不具有请求调页功能的存储器管理系统,此时则表示地址出错。对于具有请求调页功能的存储器管理系统,此时应产生请求调页中断,系统将把此页调入内存。
反置页表仅包含以调入内存的页面,并未包含未调入内存的页面,所以还应该为每个进程建立一个外部页表,该表和传统页表一样。
搜索时可以采用哈希算法进行改进
八.参考资料
《操作系统 第四版》