早期计算机编程并不需要过多的存储管理,但是随着计算机和程序越来越复杂,存储管理就称为了必要。
存储管理主要是为了确保下面的三个问题:
- 确保计算机有足够内存处理数据;
- 确保程序可以从可用内存中获取一部分内存使用;
- 确保程序可以归还使用后的内存以供其他程序使用;
1、内存分配过程
单一连续分配:
单一连续分配是最简单的内存分配方式;
只能在单用户、单进程的操作系统中使用;
单一连续分配将内存分为系统区、用户区,系统区的所有内存都给操作系统使用,所以用户区内存都给用户使用。
是一种已经过时的方法。
固定分区分配:
固定分区分配是支持多道程序的最简单存储分配方式;
内存空间被划分为若干固定大小的区域;
每个分区只提供给一个程序使用,互不干扰
动态分区分配:
操作系统中常用的内存分配方法;
根据进程实际需要,动态分配进程需要的内存空间;
会涉及到相关的数据结构和分配算法
动态分区所涉及到的数据结构:
- 1、动态分区空闲表数据结构
假设主存中有若干分区,有些使用了,有些没有被使用,如下图,每个分区有一个标记,0表示没有使用,1表示使用了
- 2、动态分区空闲链数据结构
使用双向链表保存动态分区里面的空闲区域,所有空闲区用链表首尾相连,行成一个空闲的列表
动态分区分配所使用的算法:
- 首次适应算法(FF算法)
- 最佳适应算法(BF算法)
- 快速适应算法(QF算法)
首次适应算法:
- 分配内存时从开始位置查找适合内存区(主要使用空闲链数据结构)
- 若遍历整个空闲链,没有合适的空闲区,则此次分配失败,找到了就把这个空闲区划分给进程使用
首次适应算法每次分配都是从头部开始,会使得头部地址空间不断被划分,或者头部地址被分配多次之后空间已经很小了,很多碎片,每次分配的时候都需要遍历,直到遍历到尾部时才获得相关内存。因此首次适应算法之后提出改进算法,也就是循环适应算法
。
循环适应算法
指的是,每次分配的时候不是从头部开始分配,而是从上次检索结束的位置开始。
最佳适应算法
- 最佳适应算法要求空闲区链表按照容量大小排序
- 遍历空闲区链表找到内存节点容量最合适的空闲区
快速适应算法:
- 快速适应算法要求有多个空闲区链表
- 每个空闲区链表存储一种容量的空闲区
2、内存回收过程
回收区在空闲区后面:
这种情况下回收内存不需要新建空闲链表节点;
只需要把空闲区1的容量增大为空闲区即可;
回收区在空闲区前面:
将回收区和空闲区合并起来,成为一个新的节点;
将新的空闲区使用回收区的地址作为新节点地址;
回收区夹在两个空闲区之间
将空闲区1、空闲区2、回收区合并
新的空闲区使用空闲区1的地址作为新的节点地址
回收区周围没有任何空闲区
为回收区创建新的空闲节点;
将创建的节点插入到相应的空闲区链表中;