内存管理跟踪每个内存位置的状态,无论是已分配还是空闲。它根据程序的请求动态地为程序分配内存,并在不再需要时将其释放以供重用。内存管理旨在满足我们应该牢记的一些要求。
内存管理的这些要求是:
- 重定位——可用内存通常由多道程序系统中的多个进程共享,因此不可能提前知道在执行程序时哪些其他程序将驻留在主内存中。将活动进程交换进出主内存使操作系统能够拥有更大的准备执行进程池。当程序被换出到磁盘内存时,当它被换回主内存时,它并不总是可能占据先前的内存位置,因为该位置可能仍被另一个进程占用。我们可能需要将进程重新定位到不同的内存区域。因此,由于交换,程序可能会在主存储器中移动。
该图描绘了一个过程映像。进程映像占用了主内存的一个连续区域。操作系统需要知道很多事情,包括进程控制信息的位置、执行堆栈和代码入口。在一个程序中,在各种指令中有内存引用,这些被称为逻辑地址。将程序加载到主内存后,处理器和操作系统必须能够将逻辑地址转换为物理地址。分支指令包含要执行的下一条指令的地址。数据引用指令包含所引用数据的字节或字的地址。
- 保护 –当我们同时拥有多个程序时,总是存在危险,因为一个程序可能会写入另一个程序的地址空间。因此,当其他进程试图在进程中写入时,无论是偶然的还是偶然的,都必须保护每个进程免受不必要的干扰。在搬迁和保护要求之间发生权衡,因为搬迁要求的满足增加了满足保护要求的难度。预测程序在主内存中的位置是不可能的,这就是为什么在编译时检查绝对地址以确保保护是不可能的。大多数编程语言允许在运行时动态计算地址。内存保护要求必须由处理器而不是操作系统来满足,因为操作系统在占用处理器时几乎无法控制进程。因此可以检查内存引用的有效性。
- 共享——保护机制必须允许多个进程访问主内存的同一部分。允许每个进程访问程序的相同副本而不是拥有自己的单独副本具有优势。例如,多个进程可能使用同一个系统文件,很自然地在主内存中加载文件的一个副本并让这些进程共享它。内存管理的任务是在不影响保护的情况下允许对内存的共享区域进行受控访问。机制用于支持重定位支持的共享功能。
- 逻辑组织 –主存储器被组织成线性,或者它可以是由字节或字序列组成的一维地址空间。大多数程序都可以组织成模块,其中一些是不可修改的(只读、只能执行),而其中一些包含可以修改的数据。为了有效地处理用户程序,操作系统和计算机硬件必须支持一个基本模块,以提供所需的保护和共享。它具有以下优点:
- 模块是独立编写和编译的,从一个模块到另一个模块的所有引用都由系统在运行时解析。
- 不同的模块具有不同的防护等级。
- 存在可以在进程之间共享模块的机制。可以在模块级别上提供共享,让用户指定所需的共享。
- 物理组织 –计算机内存的结构有两个级别,称为主内存和二级内存。与辅助存储器相比,主存储器相对非常快且成本高。主存储器是易失性的。因此,提供二级存储器用于长期存储数据,而主存储器保存当前使用的程序。主存储器和辅助存储器之间的主要系统问题是信息流,程序员理解这一点是不切实际的,原因有两个:
- 当程序可用的主存储器及其数据可能不足时,程序员可能会从事一种称为覆盖的做法。它允许将不同的模块分配到相同的内存区域。一个缺点是它对程序员来说很耗时。
- 在多道程序设计环境中,程序员不知道在编码时有多少可用空间以及该空间将位于内存中的什么位置。
参考:内部结构和设计原则,William Stallings 第 7 版