基本分页存储管理方式
连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无须再进行“紧凑”。基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是端,则称为分段存储管理方式。
在分页存储管理方式中,如果不具备页面对换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。
页面与页表
1.页面
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同的若干个存储块,称为(物理块)或页框(frame),也同样为它们加以编号,如0#块、1#块等等。在为进程分配内存时以块为单位将进程中的若干页分别装入到多个可以不相邻的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。
在分页系统中的页面其大小应适中。页面若太小,一方面虽然可使内存碎片减小,从
而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较
多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效
率。然而,如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,
但却又会使页内碎片增大。因此,页面的大小应选择适中,且页面大小应是 2 的幂,通常
为 512 B~8 KB。
2.地址结构
分页地址中的地址结构(逻辑地址):
31 12 11 0
页号P 位移量W
它含有两部分:前一部分为页号P,后一部分为位移量W(或称为页内地址)。图中的地址长度为32位,其中0-11位为页内地址,即每页的大小为4kB;12-31位为页号,地址空间最多允许有1M页。
对于某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为 A,页
面的大小为 L,则页号 P 和页内地址 d 可按下式求得:
P = INT[A/L]
d = [A] MOD L
其中,INT 是整除函数,MOD 是取余函数。例如,其系统的页面大小为 1 KB,设 A = 2170 B,
则由上式可以求得 P = 2,d = 122。
3.页表
在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映射表,简称页表。
在进程地址空间内的所有页(0~n),依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号,见图 4-12 的中间部分。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作用是实现从页号到物理块号的地址映射。
地址变换机构
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对
地址)分为页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在
执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本
次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界
中断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项
在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同
时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完
成了从逻辑地址到物理地址的变换。图 4-13 示出了分页系统的地址变换机构。
具有快表的地址变换机构
由于页表是存在内存中的,这使CPU在每存取一个数据时,都要两次访问内存。第一次时访问内存中的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,已形成物理地址。第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址中写入数据)。因此,采用这种方式使计算机的处理速度降低近1/2。
具有快表的地址变换过程:
为了提高地址变换速度,可在地址变换机构中增设一个具有并行查寻能力的特殊高速
缓冲寄存器,又称为“联想寄存器”(Associative Memory),或称为“快表”,在 IBM 系统中
又取名为 TLB(Translation Lookaside Buffer),用以存放当前访问的那些页表项。此时的地址
变换过程是:在 CPU 给出有效地址后,由地址变换机构自动地将页号 P 送入高速缓冲寄存
器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示
所要访问的页表项在快表中。于是,可直接从快表中读出该页所对应的物理块号,并送到
物理地址寄存器中。如在块表中未找到对应的页表项,则还须再访问内存中的页表,找到
后,把从页表项中读出的物理块号送地址寄存器;同时,再将此页表项存入快表的一个寄
存器单元中,亦即,重新修改快表。但如果联想寄存器已满,则 OS 必须找到一个老的且已
被认为不再需要的页表项,将它换出。图 4-14 示出了具有快表的地址变换机构。
两级和多级页表
现代的大多数计算机系统,都支持非常大的逻辑地址空间(232~264)。在这样的环境下,
页表就变得非常大,要占用相当大的内存空间。例如,对于一个具有 32 位逻辑地址空间的
分页系统,规定页面大小为 4 KB 即 212 B,则在每个进程页表中的页表项可达 1 兆个之多。
又因为每个页表项占用一个字节,故每个进程仅仅其页表就要占用 1 MB 的内存空间,而且
还要求是连续的。显然这是不现实的,我们可以采用下述两个方法来解决这一问题:
(1) 采用离散分配方式来解决难以找到一块连续的大内存空间的问题;
(2) 只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再
调入。
1.两级页表
对于要求连续的内存空间来存放页表的问题,可利用将页表进行分页,并离散地将各个页面分别存放在不同的物理块中的办法来加以解决,同样也要为离散分配的页表再建立一张页表,称为外层页表(Outer Page Table),再每个页表项中记录了页表页面的物理块号。
下面我们仍以前面的 32 位逻辑地址空间为例来说明。当页面大小为 4 KB 时(12 位),若采
用一级页表结构,应具有 20 位的页号,即页表项应有 1 兆个;在采用两级页表结构时,再
对页表进行分页,使每页中包含 210 (即 1024)个页表项,最多允许有 210个页表分页;或者
说,外层页表中的外层页内地址 P2为 10 位,外层页号 P1也为 10 位。此时的逻辑地址结构
可描述如下:
由图可以看出,在页表的每个表项中存放的是进程的某页在内存中的物理块号,如第
0#页存放在 1#物理块中;1#页存放在 4#物理块中。而在外层页表的每个页表项中,所存放的
是某页表分页的首址,如第 0#页表是存放在第 1011#物理块中。我们可以利用外层页表和页
表这两级页表,来实现从进程的逻辑地址到内存中物理地址间的变换。