连续分配内存方式会形成许多“碎片”,通过紧凑的方式将碎片拼接成一块大的空间,但是拼接过程系统开销太大。如果允许将一个进程直接分散地装入到许多不相邻的分区中,那么就不需要再进行“紧凑”。基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。
在分页管理方式中,如果不具备页面对换功能(将处于阻塞状态且优先级低的进程对换到外存),则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后才能运行。
1、页面与页表
1.1、页面
a)、页面和物理块
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或者页,并为各页加以编号0、1、2...。相应地,把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框,也加以编号0、1、2...。在为进程分配内存时,以块为单位将进程中的若干个页面分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片——“页内碎片”。
b)、页面大小
在分页系统中的页面其大小适应中。页面若太小,一方面虽然可使内存碎片减小,从而减小了内存碎片的总空间,有利于提高内存利用率,但是另一方面也会使每个进程占用较多的页面,导致进程页表过长,占用大量内存,反而降低页面换进换出的效率。然而如果选择的页面较大,虽然可以减小页表的长度,提供页面换进换出的速度,但却又会使页内碎片增大。因此,页面的大小应选择适中,且页面大小应该是2的幂,通常为512B~8KB。
1.2、地址结构
分页地址中的地址结构如下:
0~11位为页内地址,即每页的大小为2^12=4KB;12~31位为页号,地址空间最多允许有2^20=1M页。
对于某特定机器,其地址结构是一定的。若给定一个逻辑地址空间中的地址为A,每页的大小为L,则页号P=A/L和页内地址d=A%L。
1.3、页表
在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应该保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。系统又为每个进程建立了一张页表,其记录着相应页在内存中对应的物理块号。进程在执行时,通过查找页表找到内存中对应的物理块号。可见,页表的作用的实现从页号到物理块号的地址映射。
2、地址变换机构
为了能将用户地址空间中的逻辑地址 变换为内存空间的物理地址,在系统中必须设置地址变换机构。其基本任务是实现从逻辑地址到物理地址的转换。即将逻辑地址中的页号转换为内存中的物理块号,借助页表来实现。
2.1、基本的地址变换机构
页表的功能可以由一组专门的寄存器来实现。一个页表项用一个寄存器。由于寄存器成本高,数量少,因此页表大多驻留在内存中。在系统中只设置一个页表寄存器PTR(Page-Table Register),在其中存放页表在内存的起始地址和页表的长度。平时,进程未执行时,页表起始地址和页表长度是存放在本进程的PCB中,当调度程序调度该进程时,才将其放入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表,查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,如果页号大于等于页表长度,则表示本次所访问的地址已超越进程的地址空间。系统将产生一地址越界中断。如果没有越界,则将页表起始地址与页号和页表项长度的乘积相加,使从而到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从逻辑地址到物理地址的变换。
2.2、具有快表的地址变换机构
由于页表存放在内存中,这使CPU在存取一个数据时,都要两次访问内存:第一次是访问内存的页表,从中找到指定页的物理块号,再将块号与页内偏移量W拼接,形成物理地址;第二次访问内存时,才是从第一次所得地址中获得所需数据(或向此地址写入数据)。因此,采用这种方式将使计算机的处理速度降低近一半。
为了提高地址变换速度,可在地址变换机构中增设一个具有并行查询能力的特殊高速缓冲寄存器,又称为“联想寄存器”——“块表”,用来存放当前访问的那些页表项。此时的地址变换过程是:在CPU给出有效地址后,由地址变换机构自动地将页号P送入高速缓冲寄存器,并将此页号与高速缓存中的所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问的页表在快表中。直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。如果在快表中未找到对应的页表项,则还需在访问内存中的页表,找到后把页表项中读出的物理块号送地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中。从新修改快表。,如果联想寄存器已满,则 OS 必须找到一个老的且已被认为不再需要的页表项,将它换出。
3、两级和多级页表
现代的大多数计算机系统,都支持非常大的逻辑地址空间(2^32~2^64)。在这样的环境下,页表就变得非常大,要占用相当大的内存空间。采用的解决方法:
a)、采用离散分配方式来解决难以找到一块连续的大内存空间的问题;
b)、只将当前需要的部分页表项调入内存,其余的页表项仍然留在磁盘上,需要时在调入。
3.1、两级页表(Two_Level Page Table)
对于要连续的内存空间来存放页表的问题,可利用将页表进行分页,并离散地将各个页面分别存放在不同的物理块中的办法加以解决,同样也要为离散分配的页表再建立一张页表,称为外层页表,在每个页表项中记录了页表页面的物理块号。
在外层页表的每个页表项中,所存放的是某页表分页的首地址。我们可以利用外层页表和页表这两级页表,来实现从进程的逻辑地址到内存中物理地址间的变换。为了地址变换实现上的方便起见,在地址变换机构中同样需要增设一个外层页表寄存器,用于存放外层页表的始址,并利用逻辑地址中的外层页号,作为外层页表的索引,从中找到指定页表分页的始址,再利用 P2 作为指定页表分页的索引,找到指定的页表项,其中即含有该页在内存的物理块号,用该块号和页内地址 d 即可构成访问的内存物理地址。
3.2、多级页表
多级页表原理和二级页表一样,用来处理更大的页表划分问题。
以上内容参考汤小丹 梁红兵等编著的《计算机操作系统》第4章 第4节
原文:http://blog.csdn.net/csdn515/article/details/24851511