逻辑地址

物理地址

重定位

虚拟存储器

碎片

分区

固定分区

分区分配是为支持多道程序运行而设计的一种最简单的存储管理方式。 :::danger 在这种方式下,除操作系统占用内存的某个固定分区(通常是低址部分)外,把其余内存供用户程序使用,并且划分成若干分区,每个分区里容纳一个作业。 ::: 按照分区的划分方式,可分为固定分区法和动态分区法两种常见的分配方法。
固定分区就是内存中分区的个数固定不变,各个分区的大小也固定不变,但不同分区的大小可以不同。
※※每个分区只可装入一个进程
image.png
划分分区大小有两种方式:

  • 一种是等分方式,即各分区都有同样大小;
  • 另一种是差分方式,即不同分区有不同大小。

等分方式有明显的缺点,如浪费大,可能无法装入大程序等。
所以,实际运行的系统大多采用差分方式,即有些分区容量较小,适于存放小程序:有些分区容量较大,适于存放大程序。
为了便于内存分配,系统建立一张分区说明表
每个分区对应表中的一项。各表项包含每个分区的起始地址、分区大小以及状态(是否正被使用),如图5-9所示。
image.png
当某个用户进程要装入内存时,向系统提出分配内存的申请,同时给出需要的内存空间是多大。系统按照用户的申请表去检索分区说明表,从中找出一个能满足要求的,并且是空闲(即未使用)的分区,将它分给该进程,然后修改分区说明表中该表项的状态栏,即把状态置为“正使用”。如果找不到大小足够的分区,则拒绝为该用户进程分配内存。
当一个用户进程执行完,不再使用分给它的分区,就释放相应的内存空间。系统根据分区始址或分区号在分区说明表中找到相应的表项,把它的状态改为“未使用”。
当一个用户进程执行完,不再使用分给它的分区,就释放相应的内存空间。系统根据分区始址或分区号在分区说明表中找到相应的表项,把它的状态改为“未使用”。
固定分区法管理方式简单,所需操作系统软件和处理开销都小
它的缺点是:
①内存空间利用率不高,有时浪费情况会相当严重,即存在碎片问题。
②要在系统生成时指定分区的个数,这就限制了系统中处于活动(不是阻塞的)状态的进程数目;另外,在多数情况下,并不能预先知道所有作业对内存的需求,而分区大小是在系统生成时确定的。

分配算法

(1)最先适应算法

在这种算法中,空闲表是按地址排列的,即空闲分区起始地址小的分区在表中的序号也小。当要为进程分配内存空间时,就从该表的开头向下查,在各空闲分区中查找满足大小要求的可用分区。只要找到第一个足以满足要求的空闲分区就停止查找,并把它分配出去;

  • 如果该空闲分区与所需内存的大小一样,则从空闲表中取消该项;
  • 如果该空闲分区大于所需内存,那么分出所需内存空间后还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。

这种算法的优点是:便于释放内存时进行合并,且为大进程预留高地址部分的大空闲区。
缺点是:内存高地址部分和低地址部分的利用不均衡,且会出现许多很小的空闲分区,影响内存效率。

(2)最佳适应算法

这种算法的空闲表是以空闲分区的大小为序、按增量形式排列的,即小分区在前,大分区在后。
它在满足需要的前提下,尽量分配最小的空闲分区。
这种算法产生的剩余空闲分区是最小的,但它不便于释放内存时与邻接空闲分区的合并,也同样会出现许多难以利用的小空闲分区。

(3)循环适应算法

这种算法是最先适应算法的变种。
它不从空闲表的开头查找,而从上次找到的可用分区的下一个空闲分区开始查找,从中选择满足大小要求的第一个空闲分区
该算法能使内存中的空闲分区分布得更均匀,减少查找空闲分区的开销。
在实现时设置一个指针,用于指示下一次搜索的起始位置。它无法为大作业预留大的空闲分区。

分段

页面

页表