页式内存管理

内存管理就是要将各种媒介组建成为一体,形成一个巨无霸似的虚拟存储系统。

基址极限管理模式的问题

到目前为止,已经讲述了几种基本的内存管理方法,分别是固定加载地址的内存管理、固定分区的内存管理、非固定分区的内存管理和交换内存管理,固定加载地址的内存管理只适合于单道编程,而其他三种则可用于多道编程。这三种适用于多道编程的内存管理模式均使用同一种实现机制:基址与极限

基址与极限的工作原理是将程序发出的虚拟地址加上基址而获得物理地址!如果地址超过指定的极限,则视为地址出界而禁止访问,否则访问正常进行。

在介绍过的三种多道编程的内存管理模式里,交换内存管理是最灵活和先进的。它可以解决因程序所需空间增长而无法继续运行的困难又可以实现动态多道编程, 可谓是多道编程内存管理“三剑客”里面的第一高手。但这个第一高手也不是什么问题都没有的。事实上,这种策略存在很多重大问题,而其中最重要的两个问题是空间浪费和程序大小受限

空间浪费问题

随着程序在内存与磁盘间的交换,内存将变得越来越碎片化,即内存将被不同程序分割成尺寸大小无法使用的小片空间。例如,假定我们运行8个程序,A、B、C、D、E、F、G、H,其启动、内存需要和交换过程如下:

A启动,需占用内存200 KB,分配空间1000 ~1199 KB。
B启动,需占用内存100 KB,分配空间1200 ~1299 KB。
C启动,需占用内存300 KB,分配空间1300 ~1599 KB。
A结束,释放内存空间1000~ 1199 KB。
D启动,需占用内存50 KB,分配空间1000 ~1049 KB。
E启动,需占用内存100 KB,分配空间1600 ~1699 KB。
C结束,释放内存空间1300 ~1599 KB。
F启动,需占用内存200 KB,分配空间1300 ~ 1499 KB。
G启动,需占用内存50 KB,分配空间1500 ~1549 KB。
H启动,需占用内存20OKB,无法分配空间!

在上述前7个执行序列后,当前内存尚有200KB的闲置空间,分别处于地址1050 ~ 1199KB和1550 ~1599 KB。但因为不连续,无法容纳进程H。而H的空间需求只有200KB!

这种散布在进程之间的闲置空间称为外部碎片。 因为从进程的粒度来看,这种碎片处于进程空间的外面。这种碎片化过程也称为“外部碎片化”
在下图的情况下,内存空间形成碎片,无法容纳新的进程H,尽管内存总闲置空间可以容纳H。

在这里插入图片描述
随着进程的进进出出,外部碎片将浪费大量的内存空间。我们可以采取一些措施降低外部碎片的危害。比如说,在寻找空间容纳新的进程时,可以按照某种算法,如最先适用(first fit)或者最佳适用(best fit)来进行。“最佳适用”就是找到一个能够容纳新程序的最小空间。而"最先适用”就是找到第一个可以容纳新进程的空间。实践证明,最先适用比最佳适用更好。虽然“最佳适用”的名字听上去很好,但因为每次都是最小适应,使得多出来的空间反而更加难以再次利用。

但不管是“最佳适用”还是“最先适用”,这些算法都不能消除外部碎片。当然,如果实在不行了,我们可以进行碎片整理,即通过移动进程在内存里的位置将空闲空间连成一·片,但是这种操作需要将进程导出到磁盘上,再重新加载,效率十分低下。在进行碎片整理过程中,系统的响应延迟将显著增加。因此,这种方法并不让人感觉到兴奋。

程序受限问题

除了外部碎片外,交换的内存管理模式还存在一个重大问题:地址空间增长困难。这有两层意思:一是指空间增长效率低下,二是指空间增长存在“天花板”限制。
本书前面讲过,通过交换,可以让程序的大小增长。即先把程序“倒”到磁盘上,再在内存寻找一片更大的空间将程序“倒”进来,从而扩展程序所占的空间。由于磁盘操作耗时,这种交换出去,再找一片更大的空间来增长程序空间的做法效率非常低。

但是空间增长的低效率还不是交换所面临的唯一问题。即使我们可以忍受效率低下,但还有另外一个问题:交换所能带来的空间增长有限这个限制就是单一程序不能超过物理内存空间(减去操作系统所占部分),尽管多个程序的总空间可以超过物理内存空间。

解决之道

我们有没有什么办法来解决交换存在的这些问题呢?那得先分析这些问题的根源是什么。空间碎片化的根源是每个程序的大小不一样,这样在空间分配时不存在一致性。 解决的办法自然是将空间按照某种规定的大小进行分配。只要将虚拟内存与物理内存都分成大小一样的部分.我们称为页,然后按页讲行内存分配、就可以克服外部碎片的问题。(页的大小设定很重要)

程序增长有限则是因为一个程序需要全部加载到内存才能运行。而解决的办法就是使程序无需全部加载就可以运行。用分页也可以解决这个问题:只将当前需要的页面放在内存里,其他暂时不用的页面放在磁盘上,这样一个程序同时占用内存和磁盘,其增长空间就大大增加了。 而且,分页后,如果一个程序需要更多的空间,给其分配一个新页即可(而无需像先前将程序倒出倒进,从而大大提高空间增长效率)。

因此,分页,似乎就是我们解决交换缺陷的“不二法门”。

分页内存管理

为了解决交换系统存在的缺陷,出现了分页系统。分页系统的核心就是将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面做为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里。这样,由于物理空间是页面的整数倍,并且空间分配以页面为单位,将不会再产生外部碎片。同时,由于一个虚拟页面可以存放在任何一个物理页面里,空间增长也容易解决,只需要分配额外的虚拟页面,并找到一个闲詈的物理页面存放即可。 在分页系统下,一个程序发出的虚拟地址由页面号,页内偏移值两部分组成

在这里插入图片描述

例如,对于32位寻址的系统,如果页面大小为4KB,则页面号占20位(220)、页内

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值