第七章 内存管理

在单道程序设计系统中,内存被划分成两个部分:一部分供操作系统使用(驻留监控程序、内核),一部分供当前正在执行的程序使用。在多道程序设计系统中,必须在内存中进一步细分出“用户”部分,以满足多个进程的要求。细分的任务由操作系统动态完成,这称为内存管理。

有效的内存管理在多道程序设计系统中是至关重要的。如果只有少量进程在内存中,所有进程大部分时间都用来等待IO,这种情况下,处理器也处于空闲状态。因此,必须有效地分配内存来保证有适当数目的就绪进程可以占用这些可用的处理时间。

一、内存管理的需求

1 重定位

在多道程序设计系统中,可用的内存空间通常被多个进程共享。

通常情况下,程序员并不能事先知道在某个程序执行期间会有其他哪些程序驻留在内存中。此外还希望通过提供一个巨大的就绪进程池,能够把活动进程换入或换出内存,以便使处理器的利用率最大。

一旦程序被换出磁盘,当下一次被换入时,需要把进程重定位到内存的不同区域。因此,我们事先不知道程序将会被放置到哪个区域,并且我们必须允许程序通过交换技术在内存中移动。

操作系统需要知道进程控制信息和执行栈的位置,以及该进程开始执行程序的入口点。

2 保护

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

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

3 共享

任何保护机制都必须具有一定灵活性,以允许多个进程访问内存的同一部分。

例如,如果多个进程正在执行同一个程序,则允许每个进程访问该程序的同一个副本要比让每个进程都有单独的副本更有优势。

合作完成同一个任务的进程可能需要共享访问相同的数据结构。

4 逻辑组织

计算机系统中的内存总是被组织成线性的地址空间,并且地址空间是由一系列字节或字组成的。

但这种组织方式并不符合程序构造的典型方法。大多数程序被组织成模块,某些模块式不可修改的,某些模块包含可以修改的数据。

如果操作系统和计算机硬件能够有效的处理以某种模块的形式组织的用户程序和数据,则会带来很多好处。

5 物理组织

系统主要关注的是内存和外存之间信息流的组织。在两极存储器间移动信息的任务应该是一种系统责任,而该任务恰恰就是储存管理的本质所在。

二、内存分区

内存管理最基本的操作是由处理器把程序装入内存中执行。

典型内存管理技术:

1)固定分区

2)动态分区

3)简单分页

4)简单分段

5)虚拟内存分页

6)虚拟内存分段

1 固定分区

在大多数内存管理方案中,可以假定操作系统占据了内存中的某些固定部分,内存的其余部分可供多个用户进程使用。

管理用户内存空间的最简单的方案就是把它分区,从而形成若干边界固定的区域。

对于固定分区的两个难点:

1)程序可能太大而不能放到一个分区中。在这种情况下,程序员必须使用覆盖技术设计程序,使得在任何时候该程序只有一部分需要放到内存中。

2)由于被装入的数据块小于分区大小,从而导致分区内部有空间浪费,这种现象称为内部碎片。

对于大小相等的分区策略,进程在内存中的放置非常简单。只要存在可用的分区,进程就可以装入分区。由于所有的分区大小相等,因而使用哪个分区都没有关系。如果所有的分区都被处于不可运行状态的进程所占据,那么这些进程中的一个必须被换出,从而为新进程让出空间。

对于大小不等的分区策略,有两种方法可以把进程分配到分区。最简单的方法是把美国进程分配到能够容纳它的最小分区。在这种情况下,每个分区都需要维护一个调度队列,用于保存从这个分区换出的进程。

一种更可取的方法是为所有进程只提供一个队列。当需要把一个进程装入内存时,选择可以容纳该进程的最小可用分区。如果所有分区都已被占据,则必须进行交换。

2 动态分区

对于动态分区,分区长度和数目是可变的。当进程被装入内存时,系统会给它分配一块和它所需容量完全相等的内存空间,不多也不少。

动态分区方法在开始时是很好的,但它最终会导致在内存中出现许多小的空洞。随时间的推移,内存中产生了越来越多的碎片,内存利用率随之下降。这种现象称为外部碎片,指在所有分区外的存储空间变成越来越多的碎片。

克服外部碎片的一种技术室压缩:操作系统不时地移动进程,使得进程占用的空间连续,并且使所有空闲空间连成一片。

放置算法:当把一个进程装入或换入内存时,如果内存中有多个足够大的空闲块,则操作系统必须确定要为此进程分配哪个空闲块。可供考虑的有三种放置算法:最佳适配、首次适配、下次适配。

换置算法:在使用动态分区的多道程序设计系统中,有时候会出现内存中的所有进程都处于阻塞态,并且即使进行了压缩,对一个新的进程仍没有足够的内存空间。为了避免由于等待一个活动进程解除阻塞状态引起的处理器时间浪费,操作系统将把一个阻塞的进程换出内存,给新进程或处于就绪-挂起态的进程让出空间。因此,操作系统必须选择要替换哪个进程。

3 伙伴系统

固定分区方案限制了活动进程的数目,并且,如果可用分区的大小与进程大小非常不匹配,则内存空间的利用率非常低。

动态分区的维护特别复杂,并且引入了进行压缩的额外开销。

伙伴系统是一个合理的这种方案,它客服了固定分区和可变分区方案的缺陷。但在当前的操作系统中,基于分页和分段机制的虚拟内存更先进。

4 重定位

当进程被换入或在内存中移动时,指令和数据单元的位置会发生改变。

逻辑地址是指与当前数据在内存中的物理分配地址无关的访问地址,在执行对内存的访问之前必须把它转换成物理地址。相对地址是逻辑地址的一个特例,是相对于某些一直点的存储单元。物理地址或绝对地址是数据在内存中的实际位置。

首先,基址寄存器中的值假设相对地址产生一个绝对地址;然后得到的结果与接线寄存器的值想比较,如果这个地址在界限范围内,则继续该指令的执行。

三、分页

假如内存被划分称为大小固定相等的块,且块相对比较小,每个进程也被分成同样大小的小块,那么进程中称为页的块可以指定到内存中称为页框的可用块。

简单扉页类似于固定分区,他们的不同之处在于:采用分页技术的分区相当小,一个程序可以占据多个分区,并且这些分区不需要是连续的。

使用页大小为2的幂的页的结果是双重的。首先,逻辑地址方案多编程者、汇编器和链接是透明的。程序的每个逻辑地址(页号,偏移量)与它的相对地址是一致的。第二,用硬件实现运行时动态地址转换的功能相对比较容易。

总之,采用简单分页技术,内存被分成许多大小相等且很小的页框,每个进程被划分成同样大小的页;较小的进程需要较少的页,较大的进程需要较多的页;当一个进程被装入时,它的所有页都被装入到可用页框中,并且建立一个页表。

四、分段

采用分段技术,可以把程序和其相关的数据划分到几个段中。尽管段有一个最大长度限制,但并不要求所有程序的所有段的长度都相等。和分页一样,采用分段技术时的逻辑地址也是由两部分组成:段号和偏移量。

与动态分区不同的是,在分段方案中,一个程序可以占据多个分区,并且这些分区不要求是连续的。分段消除了内部碎片,但是和动态分区一样,它会产生外部碎片,不过由于进程被分成多个小块,因此外部碎片也会很小。

分页对程序员来说是透明的,而分段通常是可见的,并且作为组织程序和数据的一种方便手段提供给程序员。

类似于分页,在简单的分段方案中,每个进程都有一段表,系统也会维护一个内存中的空闲块列表。每个段表象必须给出相应的端在内存中的起始地址,还必须指明段的长度,以确保不会使用无效地址。

总之,采用简单分段技术,进程被划分成许多段,段的大小不需要相等;当一个进程被调入时,它的所有段都被装入内存的可用区域,并建立一个段表。

五、安全问题

最明显的安全需求是防止进程的内存中的内容遭受到未授权访问。

如果进程未生命共享其他部分内存,则其他程序不得访问这部分内存内容。

如果进程生命其某些部分内存可以被指定程序共享,那么操作系统的安全服务必须保证只有这些指定进程可以访问这部分内存。

六、小结

内存管理是操作系统中最重要、最复杂的任务之一。内存管理把内存视为一个资源,可以分配给多个活动进程,或者由多个活动进程共享。为有效地使用处理器和IO设备,需要在内存中保留尽可能多的进程。此外,程序员在进程程序开发时最好能不受程序大小的限制。

内存管理的基本工具是分页和分段。采用分页技术,每个进程被划分成相对比较小的、大小固定的页。采用分段技术可以使用大小不同的块。还可以再一个单独的内存管理方案中把分页技术和分段技术结合起来使用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/yangquanhui/p/4937489.html