内存的连续分配方式

本文介绍内存连续分配方式,包括单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配。详细阐述动态分区分配的数据结构和多种算法,如首次适应、循环首次适应等,还说明了动态重定位分区分配通过“紧凑”思想解决内存分区问题及实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连续分配方式:是指为一个用户程序分配一个连续的内存空间。

连续分配方式可以进一步分为单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配。

单一连续分配

使用这种内存分配方式,内存空间会被分成 系统区 和 用户区 两部分,系统区仅提供给OS使用,系统区外的用户区提供给用户使用。
这种存储管理方式只能用于单用户、单任务的操作系统中。

固定分区分配

固定分区分配是将内存用户空间划分为若干个大小固定的区域,在每个分区只装入一个作业,这是最简单的一种可以运行在多道程序的存储管理方式。

动态分区分配

1.分区分配中的数据结构
(1) 空闲分区表。 (2) 空闲分区链。

2.分区分配算法
1) 首次适应算法(first fit)
以空闲分区链为例,每次从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止,,然后按照作业的大小,从该分区划分出一块大小合适的内存空间给请求者,剩下的内存空间仍在空闲链中。
其缺点是低址部分不断被划分,会留下许多难以利用的、很小的空闲分区。

2) 循环首次适应算法(next fit)
该算法是由首次适应算法演变而成的。不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区。该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销,但这样会缺乏大的空闲分区。

3) 最佳适应算法(best fit)
所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区。为了加快查找速度,该算法要求将所有的空闲分区按其容量从小到大形成一个空闲分区链。
因为每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的小空闲区。

4) 最坏适应算法(worst fit)
该算法与best fit 相反,它每次将最大的一个空闲分区分割给请求着,其优点是可使剩下的空闲区不至于太小,产生碎片的几率最小,对中、小作业有利,同时最坏适应分配算法查找效率很高。最坏适应算法与前面所述的首次适应算法、循环首次适应算法、最佳适应算法一起,也称为顺序搜索法。

5) 快速适应算法(quick fit)
该算法又称为分类搜索法,是将空闲分区根据其容量大小进行分类,空闲分区的分类是根据进程常用的空间大小进行划分,如 2 KB、4 KB、8 KB 等,对于其它大小的分区。该算法的优点是查找效率高。另外该算法在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。该算法的缺点是在分区归还主存时算法复杂,系统开销较大。

动态重定位分区分配

1.动态重定位的引入
在前面动态分区分配中我们可以看到很多情况下一个空闲分区都会被分割,剩下一个较小的分区,有时候甚至遍历完空闲分区之后还找不到一个合适的空闲分区满足请求者。

假设现在有这样一个情况,用户内存空间中有几个较小的空闲分区,但是现在有一个作业请求连续的内存空间,这几个较小的空闲分区任何一个都不能单独满足请求空间的大小。 现在一种可行的办法就是:将内存中的所有作业进行移动,使他们全都相邻接,这样可以把原来分散的较小空闲分区连接成一个较大的空闲分区,这样就达到了作业请求的连续内存空间要求。
这种通过移动内存中的作业位置,将原来分散的小分区拼接成一个大分区的思想就是 “紧凑”。 说的直白一点,动态重定位分区分配就是动态分区分配+紧凑

2.动态重定位的实现
在动态运行时装入方式中,作业装入内存后的所有地址都是相对地址,在程序将要执行的时候,才会将相对地址转换为物理地址。为了不影响指令执行的速度,系统中增设了一个重定位寄存器,用它来存放程序(数据)在内存中的起始地址。
程序真正执行时访问的地址是 重定位寄存器中的地址+相对地址

### 内存连续分配的概念 内存连续分配是指操作系统为进程分配一块物理上相邻接的存储区域。这种方式简化了地址转换过程,因为逻辑地址可以直接映射到物理地址而无需复杂的计算或表查找操作[^1]。 ### 方法与实现 #### 动态分区分配 动态分区分配是一种常见的内存管理策略,在这种机制下,当有新作业请求内存时,系统会根据当前可用空间大小创建适当尺寸的新区段来满足需求。为了提高效率并减少外部碎片化的影响,通常采用首次适应法(First Fit)、最佳适应法(Best Fit)以及最坏适应法(Worst Fit)[^1]。 - **首次适应算法**:从低地址向高地址扫描空闲列表直到找到第一个足够大的空洞为止;这种方法简单易行但可能导致大量小块未利用的空间堆积于高位端。 - **最佳适应算法**:遍历整个链表寻找最小而又刚好能容纳所需容量的那个区间;虽然可以最大限度地节省资源却增加了搜索时间开销。 - **最坏适应算法**:总是挑选最大的那个自由区块进行分割;理论上有助于缓解长期积累下来的细碎空白地带问题但是实际效果未必理想。 #### 连续内存分配中的紧凑技术 随着程序运行过程中不断申请释放不同长度的工作单元,不可避免会产生许多零散的小片断无法再被有效利用形成所谓的“内部”和“外部”碎片现象。为此引入了一种称为紧致化的手段即通过移动正在使用的数据项使得它们尽可能紧密排列在一起从而腾出较大范围供后续调配之需[^2]。 ```c++ void compact_memory() { int i; void *p; /* 假设这是某种方式获取所有活动对象指针数组 */ for (i = 0; i < active_objects_count; ++i) { p = get_active_object(i); move_to_low_address_space(p); // 将对象移至较低地址处 } } ``` ### 应用场景 在某些特定情况下,比如实时操作系统RTOS中对于定时器溢出处理或是硬件驱动层面对设备寄存器读写控制等方面都可能涉及到对一段固定位置且相互连接起来的缓冲池的需求。另外像图像渲染引擎里边用来暂存像素色彩值的大规模线性队列也是典型例子之一[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值