一、 内存的存储保护
1.1 上、下限寄存器方式:
-
上、下限寄存器(Limit Registers):这是一种硬件级别的内存保护机制。每个进程都有一对上、下限寄存器,用于定义该进程能够访问的内存范围。上限寄存器存储进程能够访问的最高地址,下限寄存器存储进程能够访问的最低地址。当进程尝试访问内存时,CPU会检查该访问是否在合法的范围内,以确保没有越界访问。
-
越界检查:在执行每个内存访问指令之前,CPU会检查目标地址是否在上、下限寄存器定义的范围内。如果越界,CPU将阻止对该地址的访问,触发相应的异常或中断。
1.2 重定位寄存器和界地址寄存器方式:
-
重定位寄存器(Base Register):这个寄存器存储进程的起始物理地址。当进程试图访问内存时,该寄存器中的基地址会被加到逻辑地址上,从而得到物理地址。
-
界地址寄存器(Limit Register):这个寄存器存储了进程的最大逻辑地址。在进行内存访问时,CPU会检查计算出的物理地址是否在合法的范围内,即不超过界地址寄存器定义的最大逻辑地址。
-
越界检查:通过检查计算出的物理地址是否在合法范围内,系统可以防止进程越界访问。
二、 地址转换
-
绝对装入(Absolute Loading):
- 描述:在这种方式中,编译器负责将程序的逻辑地址直接映射到物理地址,生成可执行文件时就已经确定了程序在内存中的位置。
- 特点:适用于单道程序的阶段,通常在没有操作系统的环境中,整个计算机系统只运行一个程序,程序在内存中的位置是固定的,不会发生变化。
-
可重定位装入(Relocatable Loading):
- 描述:在可重定位装入方式中,装入程序(Loader)负责将程序加载到内存,并进行地址转换,使得程序可以被加载到内存的不同位置而不需要重新编译。
- 特点:主要应用于早期多道批处理系统的阶段,允许多个程序在内存中并发执行,每个程序可以独立加载并运行,而不影响其他程序。
-
动态运行时装入(Dynamic Loading):
- 描述:在动态运行时装入方式中,地址转换是在程序运行时由操作系统动态完成的。程序的某一部分在需要执行时才被加载到内存,而且可以加载到内存的任意位置。
- 特点:通常在现代操作系统中应用,允许程序按需加载,减少内存的浪费,提高系统的灵活性和资源利用率。
这三种方式代表了不同的演进阶段和系统设计思想。绝对装入适用于简单的单道程序环境,可重定位装入适用于早期多道批处理系统,而动态运行时装入更适用于现代操作系统,能够支持多任务并灵活利用系统资源。
三、覆盖与交换
3.1 覆盖技术
- 描述:覆盖技术是一种通过将程序的不同部分加载到相同的内存地址上,但在不同的时间点上进行的技术。这样,每次只有一个部分被加载到内存中,而其他部分被保存在外部存储器中。
- 工作原理:当程序执行到需要覆盖的部分时,系统会将当前加载的部分替换为新的部分,从而实现对程序的连续运行。这样做的目的是减少整个程序的内存占用,尤其是在内存较小的环境中,以便让更大的程序能够在有限的内存空间中运行。
- 应用:覆盖技术在早期的计算机系统和操作系统中经常用于处理内存受限的情况,允许运行大型程序而不需要一次性将整个程序加载到内存中。
3.2 交换技术
交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)暂时换出外存等待的进程状态为挂起状态(挂起态,suspend)挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。
- 描述:交换技术涉及将整个进程从内存中移到外部存储器(通常是磁盘),以释放内存空间供其他进程使用。当需要运行被交换出的进程时,它会被重新调入内存。
- 工作原理:系统会定期检查内存中运行的进程,并根据优先级或其他策略,将一些进程交换到外部存储器中,以便为新的进程或高优先级的进程腾出内存空间。
- 应用:交换技术通常用于处理多道程序设计的环境,其中多个进程并发执行,但系统的总内存容量可能无法同时容纳所有进程。
四、 连续分配管理方式
4.1 单一连续分配
4.2 固定分区分配
4.3动态分配分区
五、 动态分区回收
动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。动态分区分配没有内部碎片,但是有外部碎片。内部碎片,分配给某进程的内存区域中,如果有些部分没有用上。外部碎片,是指内存中的某些空闲分区由于太小而难以利用。
情况一:回收区的后面有一个相邻的空闲分区
情况二:回收区的前面有一个相邻的空闲分区
情况三:回收区的前、后各有一个相邻的空闲分区
情况四:回收区的前、后都没有相邻的空闲分区
六、 动态分配算法
1. 首次适应算法
- 描述:首次适应算法是一种简单而直观的回收算法。它从分区链表的头开始查找第一个能够容纳需要回收的内存大小的空闲分区,并将该分区标记为已分配。
- 特点:相对简单,容易实现,但可能导致碎片问题,即分区中剩余的小块空间难以利用。
2. 最佳适应算法
- 描述:最佳适应算法选择能够满足回收内存大小需求的空闲分区中最小的一个。这样可以最小化碎片问题,但可能导致分区链表频繁变动。
- 特点:能够尽量减小碎片,但分区链表可能会变得复杂,且搜索最佳分区可能比较耗时。
3. 最坏适应算法
- 描述:最差适应算法选择能够容纳回收内存大小需求的空闲分区中最大的一个。这种策略有助于减少外部碎片,但可能导致剩余的空闲分区较小。
- 特点:降低了外部碎片,但可能导致空闲空间分布不均匀。
4.邻近适应算法
- 描述:循环首次适应算法类似于首次适应算法,但它从上次结束的位置开始查找。这样可以减少搜索的开销。
- 特点:相对于首次适应算法,减少了搜索的开销,但仍可能导致碎片问题。