操作系统:8、存储管理之内存分配与回收

操作系统:8、存储管理之内存分配与回收

  • 1、内存分配过程
  • 2、内存回收过程

早期计算机编程并不需要过多的存储管理,但是随着计算机和程序越来越复杂,存储管理就称为了必要。

存储管理主要是为了确保下面的三个问题:

  • 确保计算机有足够内存处理数据;
  • 确保程序可以从可用内存中获取一部分内存使用;
  • 确保程序可以归还使用后的内存以供其他程序使用;

1、内存分配过程

单一连续分配:

	单一连续分配是最简单的内存分配方式;
	只能在单用户、单进程的操作系统中使用;
	单一连续分配将内存分为系统区、用户区,系统区的所有内存都给操作系统使用,所以用户区内存都给用户使用。
	是一种已经过时的方法。

固定分区分配:

固定分区分配是支持多道程序的最简单存储分配方式;
内存空间被划分为若干固定大小的区域;
每个分区只提供给一个程序使用,互不干扰

操作系统:8、存储管理之内存分配与回收_第1张图片
动态分区分配:

操作系统中常用的内存分配方法;
根据进程实际需要,动态分配进程需要的内存空间;
会涉及到相关的数据结构和分配算法

动态分区所涉及到的数据结构:

  • 1、动态分区空闲表数据结构
    假设主存中有若干分区,有些使用了,有些没有被使用,如下图,每个分区有一个标记,0表示没有使用,1表示使用了
    在这里插入图片描述
  • 2、动态分区空闲链数据结构
    使用双向链表保存动态分区里面的空闲区域,所有空闲区用链表首尾相连,行成一个空闲的列表
    操作系统:8、存储管理之内存分配与回收_第2张图片

动态分区分配所使用的算法:

  • 首次适应算法(FF算法)
  • 最佳适应算法(BF算法)
  • 快速适应算法(QF算法)

首次适应算法:

  • 分配内存时从开始位置查找适合内存区(主要使用空闲链数据结构)
  • 若遍历整个空闲链,没有合适的空闲区,则此次分配失败,找到了就把这个空闲区划分给进程使用
    操作系统:8、存储管理之内存分配与回收_第3张图片

首次适应算法每次分配都是从头部开始,会使得头部地址空间不断被划分,或者头部地址被分配多次之后空间已经很小了,很多碎片,每次分配的时候都需要遍历,直到遍历到尾部时才获得相关内存。因此首次适应算法之后提出改进算法,也就是循环适应算法
循环适应算法指的是,每次分配的时候不是从头部开始分配,而是从上次检索结束的位置开始。

最佳适应算法

  • 最佳适应算法要求空闲区链表按照容量大小排序
  • 遍历空闲区链表找到内存节点容量最合适的空闲区
    操作系统:8、存储管理之内存分配与回收_第4张图片

快速适应算法:

  • 快速适应算法要求有多个空闲区链表
  • 每个空闲区链表存储一种容量的空闲区
    操作系统:8、存储管理之内存分配与回收_第5张图片

2、内存回收过程

操作系统:8、存储管理之内存分配与回收_第6张图片
回收区在空闲区后面:

这种情况下回收内存不需要新建空闲链表节点;
只需要把空闲区1的容量增大为空闲区即可;

操作系统:8、存储管理之内存分配与回收_第7张图片
回收区在空闲区前面:

将回收区和空闲区合并起来,成为一个新的节点;
将新的空闲区使用回收区的地址作为新节点地址;

操作系统:8、存储管理之内存分配与回收_第8张图片
回收区夹在两个空闲区之间

将空闲区1、空闲区2、回收区合并
新的空闲区使用空闲区1的地址作为新的节点地址

操作系统:8、存储管理之内存分配与回收_第9张图片
回收区周围没有任何空闲区

为回收区创建新的空闲节点;
将创建的节点插入到相应的空闲区链表中;

你可能感兴趣的:(操作系统)