内存管理 --- 分页

  内存管理最基本的操作是由处理器把程序装入内存中执行。在大部分现代多道程序设计系统中,这往往还涉及到一种称为虚拟内存的精密方案。虚拟内存又基于分段和分页这两种基本技术或其中的一种技术,以下介绍分页机制。

1、页面和物理块  

  页面:假如内存被划分成大小固定相等的块,且块相对较小,每个进程也被分成同样大小的小块,那么进程中称为页的块可以指定到内存中称为页框的可用块。使用分页技术的内存中为每个进程浪费的空间,仅仅是进程中最后一页的小部分形成的内部碎片。没有任何外部碎片。

  页面大小:在分页系统中,若选择国小的页面大小,虽然一方面可以减少内存碎片,起到减少内存碎片总空间的作用,又利用内存利用率的提高,但另一方面却会造成每个进程占用较多页面,从而导致进程的页表过长,占用大量内存。此外,还会降低页面换进换出的效率。然而,如果选择过大的页面,虽然可以减少页表长度,提高页面换进换出的效率,但又会使页面碎片过大。因此页面的大小应选择适中,通常为1KB~8KB

2、页表

   在使用分页技术为进程划分内存时,操作系统需要为每个进程维护一个页表。页表给出了该进程的每一页对应的页框的位置。在程序中,每个逻辑地址包括一个页号和在该页中的偏移量。在简单分区的情况下,逻辑地址事一个字相对于程序开始处的位置,处理器把它转换成一个物理地址。在分页中,逻辑地址到物理地址的转换仍然由处理器硬件完成,并且处理器必须知道如何访问当前进程的页表。

   即使在简单的分页系统中,也常在页表的表项中设置一存取控制字段,用于对该存储快中的内存加以保护。当存取控制字段仅有一位时,可用来规定该存储快中的内容是允许读/写还是只读;若存取控制字段为二位,则可规定为读/写、只读、和只执行等存取方式。如果有一进程试图去写一个只允许读的存储快时,将引起操作系统的一次中断。

3、地址变换

(1)基本的地址变换机制

   进程在运行期间,需要对程序和数据的地址进行交换,即将用户地址空间中的逻辑地址变换为内存空间中的物理地址,由于它执行的频率非常高,每条指令的地址都需要进行交换,因此需要采用硬件来实现。页表功能是由一组专门的寄存器来实现的。一个页表项用一个寄存器。由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度。但由于寄存器成本较高,且大多数现代计算机的页表又可能很大,使页表的总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现。因此,页表大多驻留在内存中。在系统中只设置一个页表寄存器,在其中存放页表在内存中的起始地址和长度。平时,进程未执行时,页表的起始地址和长度存放在本进程的PCB中。当调度程序调度到某个进程时,才将这两个数据装入页表寄存器中。因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需要一个页表寄存器。

   为了使分页方案更加方便,规定页的大小及页框的大小必须是2的幂,以便容易地表示出相对地址。相对地址由程序地起点和逻辑地址定义,可以用页号和偏移量表示。考虑一个n+m位的地址,最左边的n位是页号,最右边的m位是偏移量。地址转换需要经过以下步骤:

  • 提取页号,即逻辑地址最左面的n位
  • 以这个页号为索引查找该进程页表中相应的页框号k
  • 该页框的起始物理地址为k*2^m,被访问字节的物理地址是这个数加上偏移量。物理地址不需要计算,可以简单地把偏移量附加到页框号后面来构造物理地址。

(2)具有快表的地址变换机制

  由于页表是存放在内存中的,这是CPU在每次存取一个数据时,都要两次访问内存。第一次是访问内存中的页表,从中找到指定的物理块号,再将块号与页内偏移量w拼接,以形成物理地址。第二次访问内存时,才是第一次所得地址中获得所需数据。因此,采用这种方式将使计算机的处理速度降低将近1/2。

  为了提高地址变换速度,可在地址变换机制中增设一个具有并行查寻能力的特殊高速缓冲寄存器,又称为“联想寄存器”,或称为“快表”,用以存放当前访问的那些页表项。此时的地址变换过程是:再CPU给出有效地址后,由地址变换机制自动地将页号p送入告诉缓冲寄存器,并将此页号与告诉缓存中地所有页号进行比较,若其中有与此相匹配的页号,便表示所要访问地页表在快表中。于是可直接在快表中读出该页所对应地物理块号,并送到物理地址寄存器中。如在快表中未找到对应的页表项,则还须再访问内存中的页表,找到后,把从页表项中读出的物理块号送往地址寄存器;同时,再将此页表项存入快表的一个寄存器单元中,即重新修改快表。但如果联想寄存器已满,则OS必须找到一个老的且已被认为是不再需要的页表项,将它换出。

4、反置页表

    在分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。在现代计算机系统中通常允许一个进程的逻辑地址空间非常大,因此就有很多页表项,从而占用很多的内存空间。为了减少页表占用的内存空间而引入了反置页表(Inverted Page Table)。一般页表的表项是按页号进行排序,页表项中的内容是物理块号。而倒置页表是为每一个物理块设置一个页表项并将按物理块号排序,其中的内容则是页号及其隶属进程的标志符。

   在利用反置页表进行地址变换时,是用进程标志符和页号去检索反置页表;若检索完整个页表都未找到与之匹配的页表项,表明此页此时尚未调入内存,对于具有请求调页功能的存储器系统应产生请求调页中断,若无此功能则表示地址出错;如果检索到与之匹配的表项,则该表项的序号i便是该页所在的物理块号,将该块号与页内地址一起构成物理地址。

   虽然反置页表可以有效地减少页表占用的内存,然而该表中却只包含已经调入内存的页面,并未包含那些未调入内存的各个进程的页面,因而必须为每个进程建立一个外部页表(External Page Table),该页表与传统页表一样,当所访问的页面在内存时并不访问这些页表,只是当不在主存时才使用这些页表。该页表中包含了页面在外存的物理位置,通过该页表可将所需要的页面调入内存。

   由于在反置页表中是为每一个物理块设置一个页表项的,通常页表项的数目很大,从几千项到几万项,要利用进程标识符和页号去检索这样大的线性表是相当费时的。于是又利用一种Hash表来检索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值