内存管理笔记五、固定分区的内存管理

内存管理笔记五、固定分区的多道编程

引言:多道编程可以克服单道编程的缺点,提高CPU和内存的利用效率,改善用户的响应时间。本文将介绍多道编程下固定分区的内存管理。后续文章会介绍非固定分区、分页、分段、段页式管理方式。


一、固定分区的加载方式

1.1、固定分区概念

  为了克服单道编程的缺点,提高CPU和内存的利用率,有了多道编程的概念。虽然多道编程可以极大地改善CPU和内存的效率,改善用户响应时间,但是操作系统的复杂性也随之上升。就内存管理而言,无法将程序总是加载到固定的内存地址上。
  多道编程固定分区的内存管理,即将内存分为固定的几个区域,每个区域的大小固定。最上面的分区为操作系统占用(高地址3G - 4G),其他分区由用户程序使用。这些分区大小可以一样,也一可以不一样。考虑程序大小不一的实际情况,分区的大小通常各不相同。

1.2、共享队列及分开队列

  如下图1所示,为共享队列的固定分区。在共享队列的固定分区模式下,当一个新程序想要运行,必须排在一个共同的队列里等待。当有空闲分区时,才能进行加载。

这里写图片描述

图1、共享队列的固定分区

共享队列的弊端:由于程序大小和分区大小不一定匹配,有可能形成一个小程序占用大分区的情况,从而造成内存里面虽然有小分区闲置,但无法加载大程序的情况。

  考虑到共享队列的弊端,我们想到也就可以采用多个队列,即给每个分区一个队列。程序按照大小排在响应的队列里面。如下图2所示:

这里写图片描述
图2、分开队列的固定分区

扫描二维码关注公众号,回复: 2103368 查看本文章

分开队列的弊端:这样不同程序有不同的队,好像在不同型号的车辆放置于不同类型的车库。但是这样也有缺点,就是如果还有空闲分区,但等待的程序不在该分区的等待列表上,就将造成有空间而不能运行程序的尴尬处境。(小车库已经满了,大车库还有空闲,但是都在小车库那里排队。)

1.3、固定分区的优点及缺点分析

优点:
简单,直截了当。最大的分区就是能容纳程序的分区。

缺点:
1)、程序的大小和分区大小匹配不令人满意
2)、很僵硬,如有有个程序比最大的分区大怎么办
3)、地址空间无法增长,程序很可能在运行时有更大的内存需求

二、动态地址翻译

2.1、动态地址翻译概念

  在多道编程的环境下,无法将程序加载到固定的内存地址上,也就是无法使用静态地址翻译,这样我们就必须在程序加载完毕后才能计算物理地址,也就是在程序运行时进行地址翻译,这种翻译称为动态地址翻译。如下图3所示:

这里写图片描述
图3、动态地址翻译:用户进程发出的虚拟地址由MMU翻译成物理地址

2.2、动态地址翻译较静态翻译方式的优点

  动态地址翻译虽然增加了系统消耗,不如静态地址翻译效率高,但其带来的优点远远超过静态地址翻译。有以下三点:

1) 灵活:动态地址翻译可以将程序加载到任意地方
2) 便于实施地址保护:要进行地址保护,就必须对每个访问地址进行检查,动态翻译可以做到这一点。
3)实现虚拟内存的概念:虚拟内存的根本就是将内存扩展到磁盘上,将磁盘作为内存的一部分,我们可以将程序一般放在主存上,一般放在磁盘上,动态地址翻译可以判定地址指向的数据是在内存上还是磁盘上。

2.3、固定分区动态地址翻译方式

  当程序加载到内存事先规划好的某片区域,而且该程序整个加载进去,该程序里面的虚地址(从0开始的)加上其所占区域的起始地址即可获得物理地址。因此翻译过程很简单:

物理地址 = 虚拟地址 + 程序躲在区域的起始地址

这里写图片描述
图四、固定分区的动态地址翻译

  程序所在区域的起始地址称为基址,对于保护也很简单,只要访问的地址不超过这片连续区域,即为合法访问。需要满足:

程序所在区域的起始地址<= 有效地址 <=程序所在区域的起始地址 + 程序长度

  由此可见,我们只需要设置两个端值:基址和极限,分别放于基址寄存器和极限寄存器。即可达到地址翻译和地址保护的目的。在固定分区下,基址就是固定分区中各个区域的起始内存地址,极限则是所加载程序的长度(不是各个分区上限)。

  这样,每次程序发出的地址需要和极限比较大小,若大于极限,则属于非法访问,进行异常处理。否则将基址加上偏移获得物理地址,就可以访问这个物理地址。如果要却换程序,只要将保存基址和极限的寄存器的值,按照新程序的情况重新设置即可。

参考资料:
《操作系统之哲学原理》 邹恒明著

纠错与建议
邮箱:[email protected]


猜你喜欢

转载自blog.csdn.net/XD_hebuters/article/details/79485470