第三章 内存管理 五、动态分区分配算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

目录

一、首次适应算法

1、算法思想:

2、如何实现:

3、两种常用的数据结构:

(1)空闲分区表、空闲分区链

4、例子

二、最佳适应算法

1、算法思想:

2、如何实现:

3、例子:

三、最坏适应算法

1、算法思想:

2、如何实现:

3、例子

4、缺点

四、临近适应算法

算法思想:

如何实现:

五、总结


一、首次适应算法

1、算法思想:

每次都从低地址开始查找,找到第一个能满足大小的空闲分区。

2、如何实现:

空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

3、两种常用的数据结构:

(1)空闲分区表、空闲分区链

4、例子

(1)假设我们要插入一个大小为15MB的内存,它会比较空闲区的大小,第一次遇到的空闲区为20MB,所以直接放入。

二、最佳适应算法

1、算法思想:

由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当"大进程"到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。

2、如何实现:

空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

3、例子:

(1)若我们要插入一个为9MB的进程,就从小到大找空闲区。

(2)插入后,我们要重新对空闲区链表进行排序

三、最坏适应算法

1、算法思想:

算法思想:为了解决最佳适应算法的问题――即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。

2、如何实现:

空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

3、例子

(1)我们要将大小为3MB的进程插入内存,找到最大的空闲区并存入

4、缺点

每次都选最大的分区进行分配,虽然可以让分配后留下的空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被迅速用完。如果之后有"大进程"到达,就没有内存分区可用了。

四、临近适应算法

算法思想:

首次适应算法每次都从链头开始查找的。

这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。

如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

如何实现:

空闲分区以地址递增的顺序排列((可排成一个循环链表)。

每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

五、总结

相关推荐
武子康1 天前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
SelectDB2 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康2 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
IvanCodes2 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康3 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
字节跳动数据平台4 天前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康4 天前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
字节跳动数据平台5 天前
代码量减少 70%、GPU 利用率达 95%:火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
得物技术5 天前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
武子康5 天前
大数据-238 离线数仓 - 广告业务 Hive分析实战:ADS 点击率、购买率与 Top100 排名避坑
大数据·后端·apache hive