链表表示法
文章插图
? 将分配单元按照是否闲置链接,P代表这个空间被占用,H代表这个这是一片闲置空间 。为了方便遍历查询,每个程序空间的结点接着一个空闲空间的结点每个链表结点还有一个起始地址,与分配单元的大小,用代码表示为
enum Status{P=0,H=1};struct LinkNode{enum Status status;//P表示程序,H表示空闲struct LinkNode *begin_address;//起始地址size_t size;//闲置空间大小struct LinkNode *next;};
- 特点空间成本:取决于程序数量时间成本:链表不停的遍历速度很慢,同时还要进行链表的插入和删除修改 。有一定的容错能力,可以通过程序空间结点和空闲空间结点相互验证 。
OS通过上面两种跟踪方法知道内存空闲容量,而现在操作系统一般都以链表的形式进行内存空闲容量跟踪 。如果有新的程序需要读入内存,可变分区就要对空闲的分区进行内存分配 。
内存分配使用两张表:已分配分区表和未分配分区表 。用C++描述如下:
//未分配分区表struct FreeBlock {int id;// 内存分区号int address;// 该分区的首地址unsigned length;// 分区长度};//已分配分区表struct AllocatedBlock {int id;// 内存分区号int address;// 该分区的首地址int pid;// 进程 IDunsigned length;// 分区长度};
然后OS用双向链表将所有未分配分区表进行串联struct{FreeBlock data;Node* prior;Node* next;}Node;
未分配分区表在整个系统空间上的结构如下:文章插图
基于 顺序搜索 的分配算法:这里我们介绍四种基于顺序搜索的寻找空闲存储空间的算法:
- 首次适应算法( First Fit ) :每个空白区按其地址顺序连在一起,从这个空白区域链的始端开始查找,选择第一个足以满足请求的空白块 。
- 下次适应算法( Next Fit ) :将存储空间中空白区构成一个循环链,每次为存储请求查找合适的分区时,总是从上次查找结束的下一个空闲块开始,只要找到一个足够大的空白区,就将它划分后分配出去 。
- 最佳适应算法( Best Fit ) : 为一个作业选择分区时,总是寻找其大小最接近(小于等于)于作业所要求的存储区域 。
- 最坏适应算法( Worst Fit ) :为作业选择存储区域时,总是寻找最大的空白区 。
系统中空闲分区表如下按照地址递增次序排列,现有三个作业分配申请内存空间100K,30K,7K 。
区号大小地址状态132K20K未分配28K52K未分配3120K60K未分配4331K180K未分配
- 首次适应:从上到下寻找合适的大小申请作业100K,从低地址到高地址找到3号分区,分配完后3号分区起始地址变为100K+60K=160K,剩余空间为120K-100K=20K申请作业30K,从低地址到高地址找到1号分区,分配完后1号分区起始地址变为20K+30K=50K,剩余空间为32K-30K=2K申请作业7K,从低地址到高地址找到2号分区,分配完后2号分区起始地址变为52K+7K=59K,剩余空间为8K-7K=1K结论:优先利用内存低地址部分的空闲分区 。但由于低地址部分不断被划分,留下许多难以利用的很小的空闲分区(碎片或零头),而每次查找又都是从低地址部分开始,增加了查找可用空闲分区的开销 。
- 下次适应申请作业100K,找到3号分区,分配完后3号分区起始地址变为100K+60K=160K,剩余空间为120K-100K=20K申请作业30K,从3号分区后继续出发,找到4号分区,分配完后4号分区起始地址变为180K+30K=210K,剩余空间为331K-30K=301K申请作业7K,从4号分区后继续出发,找到1号分区,分配完后1号分区起始地址变为20K+7K=27K,剩余空间为32K-7K=25K结论:使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端,但这会导致缺乏大的空闲分区 。
- 最佳适应算法申请作业100K,找到最适合的3号分区,分配完后3号分区起始地址变为100K+60K=160K,剩余空间为120K-100K=20K申请作业30K,找到最适合的1号分区,分配完后1号分区起始地址变为20K+30K=50K,剩余空间为32K-30K=2K申请作业7K,找到最适合的2号分区,分配完后1号分区起始地址变为52K+7K=59K,剩余空间为8K-7K=1K结论:若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只划分比作业稍大的空闲分区,从而保留了大的空闲分区 。最佳适应算法往往使剩下的空闲区非常小,从而在存储器中留下许多难以利用的小空闲区(碎片)。
推荐阅读
- Apollo配置中心管理后台的详解
- 你平时是怎么管理 Docker 容器的?还在使用一大堆的窗口和命令吗
- ipad pro要买16g吗?ipad pro内存容量有6GB的嘛?
- Linux系统 JDK的多种安装方式与多版本管理工具
- 关于内存的那些知识误区盘点
- 世界排名前十的超级计算机 全球超级计算机排名
- 谷歌|小内存手机要起飞了!安卓13彻底干掉杀后台
- Linux 系统管理员的 10 份速查表 | Linux 中国
- 量子计算机阅读答案 科学家认为,量子计算机将会成为未来
- 教师|管理者树立威信,牢记这“6字诀”!