Skip to content

3.2 内存管理的需求

Giovanna

About 1578 wordsAbout 5 min

2024-08-31

内存管理要满足的需求

  • 重定位:进程多次在内存切入切出,放置于不同位置的能力

  • 保护:保护进程的程序和数据不被未授权的进程访问和修改(处理器硬件满足)

  • 共享:多个进程访问内存同一区域

  • 逻辑组织:便于模块化编程 -> 段式内存管理

  • 物理组织:两级存储:内存和磁盘间信息流的组织

一、重定位

在多道程序设计系统中,可用的内存空间通常被多个进程共享。通常情况下,程序员无法提前知道某个程序执行期间会有其他哪些程序驻留在内存中。此外,还希望提供一个巨大的就绪进程池,能够把活动进程换入、换出内存,以便使处理器的利用率最大化。一旦程序被换出到磁盘,当下一次换入时,如果必须放在和被换出前相同的内存区域,那么这将会是很大的限制。为了避免这种限制,需要把进程重定位到内存的不同区域。

二、保护

每个进程都应该受到保护,以免被其他进程有意或无意地干涉。因此,该进程外的其他进程中的程序不能未经授权地访问该进程的内存单元。

由于程序在内存中的位置是不可预测的,因此在编译时不可能通过检查绝对地址来确保保护。并且,大多数程序设计语言允许在运行时进行地址的动态计算。必须在运行时检查进程产生的所有内存访问,以确保它们只访问了分配给该进程的内存空间。幸运的是,既支持保护又支持重定位的机制已经存在。

通常,用户进程不能访问操作系统的任何部分,无论是程序还是数据。并且,一个进程中的程序通常不能跳转到另一个进程的指令。如果没有特别的许可,一个进程中的程序也不能访问其他进程的数据区。处理器必须能够终止这样的指令。

Info

注:内存保护的需求必须有处理器硬件来满足,而不是操作系统(软件)来满足。这是因为操作系统不能够预测程序可能产生的所有的内存访问;即使可以预测,提前审查每个进程可能潜在的违法访问也是非常费时的,因此,只能在指令访问内存时来判断这个内存访问是否违法(存取数据或跳转)。为实现这一点,要求处理器有这个能力。

三、共享

任何保护机制都必须具有一定的灵活性,以允许多个进程访问内存的同一部分。因为,如果多个进程在执行同一个程序,则允许每个进程访问该程序的同一个副本比每个进程都有自己的单独的副本更有优势。合作完成一个任务的进程可能需要共享访问相同的数据结构。因此内存管理系统必须允许对内存区域进行受控的访问,而不会损害基本的保护。我们将会看到用于支持重定位的机制也支持共享。

四、逻辑组织

计算机系统中的内存总被组织成线性(或一维)的地址空间,并且地址空间是由一系列字节或者字组成的。外部存储器(磁盘)在物理层也按类似方式组织。这样的组织方式类似于实际的机器硬件,但是它不符合程序构造的典型方法。大多数程序被组织成模块,某些模块是不可修改的(只读、只执行),某些模块可以修改。

如果操作系统和计算机硬件能够有效地处理以某种模块的形式组织的用户程序和数据,将会有以下好处:

  • 可以独立编写和编译模块,系统在运行时解析一个模块到其他模块的所有引用

  • 通过适度的额外开销,可以给不同的模块以不同的保护级别(只读、只执行)

  • 可以引入某种机制,使得模块被多个进程共享。模块级共享的优点在于,它符合用户看待问题的方式,因此可以很容易的指定需要的共享

Info

注:最易满足以上这些需求的是分段。

五、物理组织

计算机存储器至少要分为两级:内存和外存。内存提供快速的访问,成本高,并且内存是易失性的,不能提供永久存储。外存比内存慢且便宜,通常为非易失性的,因此,大容量的外存可以用于长期存储程序和数据,而较小额内存则用于保存当前使用的程序或数据。

在这样的两级方案中,系统主要关注的是内存和外存之间信息流的组织。

可以由程序员负责组织这个信息流,但由于以下两方面原因,导致这种方式是不切实际,也是不合要求的。

  • 可供程序和数据使用的内存可能不足。在这种情况之下,程序员必须使用覆盖(overlaying)技术,来组织程序和数据。不同的模块被分配到内存的同一区域,主程序负责在需要的时间时换入、换出模块。即使有编译程序的帮助,覆盖技术的实现也非常浪费程序员的时间。

  • 多道程序设计环境中,程序员编写代码不能知道可用空间的大小和位置。

因此可知,二级存储器之间的信息移动的任务应该是一种系统责任,这一任务恰恰是存储管理的本质。