分页存储管理方式(两极和多级页表)

用户程序只有在内存中才可以执行,那么如何在内存中给程序分配空间呢?一般有两种方式,第一种是连续分配存储管理方式,即用户程序“整个儿”地放入内存空间中,单一连续分配、固定分区分配和动态分区分配都属于这种存储管理方式。但是连续分配的方式有很多缺点,比如产生大量的内部碎片(分配给某进程的内部区域中没用上的区域)和外部碎片(内存中某些分区由于太小而无法再被利用)。所以又提出了非连续分配管理方式

非连续分配管理方式最大的特点就是不把用户程序“整个儿”地放入内存空间中,首先我们先学习非连续分配管理方式中的分页存储管理

分页存储管理的主要内容就是将用户程序分成若干个相同大小的部分,称为“页”或者“页面”(一定注意页和页面的说法是针对程序来说的),相应地,将内存空间也分为相同大小(与上述的“页”和“页面”大小相同)的块,称为物理块或页框。

 如图,可以将分页后的进程放入内存的用户区中,每个分区和页面的大小相同,每一页可以不按顺序地放入不同的分区中。(分区就是页框)

试想一下,我们将一个进程分页后,分散地装入每个分区,在进程调用的时候怎么才能知道进程都放在哪些分区中了呢?为了解决这个问题,系统又为每个进程都建立了一张页面映像表,也就是页表。对于进程空间中的所有页都在页表中有一个页表项。每一个页表项中都记录了页号和该页号所对应的块号(分区号),所以页表的作用就是实现从页号到物理块号的地址映射。其实页表就像一本厚厚的书的目录,书的页数太多,直接翻找很麻烦,我们可以从目录中找出每一章对应的页码,这样很容易就能找到需要的章节,类似的,我们从内存中一个一个地找进程页面也是不现实的,需要一个页表来充当目录,在页表中寻找页号在内存中找对应的块号,这样查找就会变得很方便。需要注意的一点是页表不能分开存储(在一段连续的内存空间内存储,这是因为如果页表分散开存储在不同的内存块中,那么将无法确定页号对应的块号,相当于把刚刚说的那本厚书的目录放到我们不知道的地方了,那怎么可能找到对应的书页呢,对不对?)

 如果一个进程很大,那么需要把它分成很多页,每一页对应一个页表项,这样在页表中就需要存放很多个页表项,所以页表可能会占用很大的内存,而我们在前文说过,必须找一段连续的内存来存放页表,如果页表过大的话,这显然是不现实的,那我们应该怎么解决这个问题呢?

有两种方式来解决这个问题:

1.对于页表所需的内存空间,可采用离散分配方式,以解决难以找到一块连续的大内存空间的问题;

2.只将当前需要的部分页表项调入内存,其余的页表项仍驻留在磁盘上,需要时再调入。

我们先来讲第一种方式,把第一种方式翻译成人话就是 页表太大了,很难找到一块连续的空间来存放整个页表,我们可以采用分页存储管理方式的思想,即把页表进行分页,分页的大小于物理块的大小相同,这样就可以将各个页面放入不同的物理块中,同时,还需要给离散分配页表再建立一张页表(外层页表),外层页表的表项中存放的是某表分页的首地址,以便于找到分散存放的页表分页。还是用前面厚书的例子,书太厚了,目录也成了一本小册子,查阅起来很困难,那我们可以给目录再加一个目录,称为外层目录,外层目录将相近的章放在一起作为一部分,在我们读书的时候,可以先看外层目录,找到某一部分,然后在这一部分中找到章节的页数,最后翻到想查阅的内容。

 

 下篇文章我将介绍如何从逻辑地址找到物理地址。

如果有错漏之处,还请大家批评指正。

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值