aix 缓存机制 内存_AIX中的内存分配机制

本文详细介绍了AIX操作系统的三种内存分配策略:默认的Yorktown策略,Watson策略以及malloc 3.1策略。Yorktown策略以笛卡尔二叉搜索树的形式管理内存,而Watson策略利用红黑树按地址和大小双重排序。malloc 3.1策略则将堆内存划分为哈希桶。每种策略都有其适用场景和优缺点,理解这些策略有助于优化应用程序的内存使用和性能。

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

分配策略是指在实现内存管理功能(动态分配,释放和重新分配内存)方面用于表示和管理堆的数据结构和算法集。

AIX malloc子系统支持以下分配策略:

  • 默认(Yorktown)分配策略
  • 沃森分配政策
  • Malloc 3.1分配策略

默认分配策略概述

AIX中的默认分配策略也称为Yorktown策略。 它以笛卡尔二叉搜索树格式将堆中的可用空间保持为节点。

节点按地址从左到右排列(地址从右到右递增),并按长度从上到下排列(这样,没有一个子节点大于其父节点)。

图1.约克镇策略的笛卡尔二进制搜索树
约克镇图

何时使用约克镇

  • 默认情况下,在AIX上启用Yorktown。 它是所有分配策略中使用最广泛,最稳定的,因此几乎适用于所有情况。
  • 由于它被维护为具有变化大小的节点的树,因此对分配块的大小没有限制。

要启用Yorktown,请输入以下命令:

export MALLOCTYPE=Yorktown

可以通过两种方式验证其启用:

  1. 使用DBX子命令malloc
  2. 运行命令echo $MALLOCTYPE

约克镇分配算法

分配的总内存=汇总(n + prefix_size,对齐),其中:

  • n等于用户请求的字节数
  • prefix_size等于元数据信息

首先,从空闲树中删除具有最低地址(大于或等于请求的块大小)的节点。 如果大于所需大小,则将其分为两部分。 多余的坏块将返回到树中,并插入到自由树中的适当位置。 然后将所需的块大小返回给调用方。

约克镇免费算法

释放内存涉及将释放的节点重新插入到空闲树中。 这遵循标准的根插入算法。 与要释放的节点相比,搜索树中的每个节点,如果它在地址方面与任何其他节点相邻,则它将与该节点相连。 相邻节点的这种连接在某种程度上防止了碎片,因为即使许多自由节点相对于地址是相邻的,它们也将分散在树中并且无法用于连续分配。

Yorktown重新分配算法

如果重新分配的块的大小大于原始块的大小,则将原始块返回到自由树,以便与相邻节点发生任何可能的连接。 然后分配一个请求大小的新块。 数据从原始块移动到新块,然后将新块返回给调用方。 旧块已释放,并且不再有效。 如果重新分配的块的大小小于原始块的大小,则会拆分该块,并将多余的块返回到自由树,并将所需的大小块返回给调用方。

Watson分配策略概述

Watson分配策略将堆中的可用空间作为两个单独的“红黑树”中的节点来维护:

  1. 按地址排序
  2. 按大小排序

为了保持一致性和正确性,两棵树都必须正确维护。

图2. Watson分配策略中基于“按地址排序”的红黑树
沃森1图

地址树中的每个节点在其左子树中将具有较少的地址节点,而在其右子树中将具有较高的地址节点。

图3. Watson分配策略中使用的基于“按大小排序”的红黑树
沃森2图

大小树中的每个节点在其左子树中将具有较小的大小节点,而在右子树中将具有较大的节点。

何时使用Watson

由于Watson将其空间保留在红黑树中,因此与其他策略相比,它提供了更有效的树操作,例如插入和搜索。

要启用它,请键入以下命令:

export MALLOCTYPE=Watson

沃森分配算法

与Yorktown策略类似,Watson搜索大小树并找到适合该请求的最小块。 如果在大小树中找到的块恰好是所需的大小,则将从大小和地址树中删除该块,然后将其返回给调用方。

如果在空闲树中找不到足够大的块,则使用sbrk()系统调用扩展进程堆,将扩展大小的块添加到大小和地址树中,并像以前一样继续分配。

沃森免费算法

节点首先从根返回到地址树。 遍历该树以检查该节点是否相对于该地址邻接该树中的任何其他节点。 如果是这样,则将释放的节点与树中的节点合并。 以这种方式连接节点可以防止堆中的内存碎片。

Watson重新分配算法

如果重新分配的块的大小大于原始块的大小,则将原始块返回到自由树,以便与相邻节点发生任何可能的合并。 然后分配一个请求大小的新块,将数据从原始块移到新块,然后将新块返回给调用方。 如果重新分配的块的大小小于原始块的大小,则将块拆分,并将剩余量发送给调用方后,其余部分返回到空闲树。

malloc 3.1分配策略概述

在malloc 3.1中,堆内存被维护为哈希存储桶,其中每个存储桶都指向一个链表,该链表仅具有特定大小的节点或块。 使用以下公式计算块的大小(i标识存储桶编号):

size = 2 ^ (i + 4)
图4.堆内存作为malloc 3.1中的哈希桶
Malloc 3.1图

要启用malloc,请使用以下命令:

export MALLOCTYPE=3.1 for 32 bit programs 
export MALLOCTYPE=3.1_64BIT for 64 bit programs

Malloc 3.1分配算法

首先使用以下公式将请求的字节转换为存储区数组中的索引,从空闲池中分配一个块:

needed = requested + 8
If needed <= 16,
then
bucket = 0
If needed  >16,
then
bucket = (log(needed)/log(2) rounded down to the nearest integer) - 3

存储桶指向的链表中每个块的大小为块大小= 2 ^(存储桶+ 4)。 如果存储桶中的列表为空,则使用sbrk()子例程分配内存,以将块添加到列表中。 如果空闲列表不为空,则列表开头的块将返回给调用方。 然后,列表中的下一个块将成为新头。

Malloc 3.1 Free算法

当内存块返回到空闲池时,存储桶索引的计算与分配操作一样。 然后将要释放的块添加到该存储区的空闲列表的开头。

Malloc 3.1重新分配算法

在重新分配期间,将请求的大小与分配的块的现有大小进行比较。 由于每个存储区处理的大小之间的差异很大,因此新块的大小可以落入与原始块相同的存储区中。 在这种情况下,将返回相同的块。 如果所需大小恰好大于现有块,则释放该块,从新存储桶分配一个新块,然后将数据从旧块移动到新块。

Malloc 3.1的局限性

malloc分配策略的效率比默认策略低,因此不建议在大多数情况下使用。 此策略将分配请求的大小四舍五入到下一个最高可用块。 因此,我们可以分配给我们比所需更多的内存。

有时,应用程序可能在不知不觉中依赖于malloc 3.1分配策略的副作用。 例如,假设有一个程序错误地覆盖了malloc分配的字节数。 使用malloc 3.1策略时,它可能会正确运行,因为从本质上讲,3.1分配的内存可能比其请求的更多。 当同一程序以不同的分配策略运行时,它可能并且应该失败。

但是,在某些情况下,通过减少重新分配过程中数据移动的开销,3.1可能会比其他分配算法更好,因为最初分配给它的内存比实际请求的要多。

其他malloc选项

一些其他的malloc选项是:

  • Malloc多堆
  • 池分配
  • Malloc桶

Malloc多堆

默认情况下,malloc子系统将整个进程堆视为单个实体。 在多线程环境中,多个线程访问同一堆。 在这种情况下,使用单个堆的效率不是很高,因为在服务一个线程并获得堆锁时,其他线程将不得不等待其轮换访问堆。 在这种情况下,此选项可能很有用。

要启用多堆选项,请使用以下命令:

MALLOCOPTIONS=[multiheap:n] | [considersize]

选项说明如下:

  • 多堆:n
    可用于malloc multiheap的最大堆数为32。您可以在1到32之间指定“ n”个堆数以供malloc使用。
  • 考虑大小
    默认情况下,malloc multiheap选择下一个可用堆。 如果选项considersize是,malloc的multiheap会使用不同的算法,并选择具有足够的可用空间来处理请求的堆。

Malloc多堆限制

  • 由于单个堆实际上被划分为许多堆(最多32个),因此不必要启用malloc multiheap会导致严重的碎片。 它还可能会导致系统似乎内存不足的情况,因为可用内存是零散的并且不是连续可用的。
  • 由于考虑大小选项需要一些额外的处理,因此使用此选项可能会在一定程度上减慢该过程。
  • malloc 3.1和用户定义的分配策略不支持Multiheap选项。

池分配

当内存大小小于或等于512字节时,AIX malloc为malloc的实际后端功能提供了更有效的前端。 池分配为每个线程创建了自己的malloc池,从而避免了与其他线程的锁争用。 目前,此分配器的每个进程的最大池大小限制为512MB。

要启用池分配,请使用以下命令:

MALLOCOPTIONS=pool<:max_size>

这基本上会创建固定数量的池,并且池的大小会不断增加。 对于32位应用程序,可以有128个池,对于64位应用程序,可以有64个池。

如果应用程序的一个线程分配了内存,而其他线程释放了内存,则池分配将无法有效地工作。

Malloc桶

Malloc存储桶是Yorktown分配策略的扩展。 当应用程序需要大量的小分配请求时,更常用malloc存储桶。 它只能与Yorktown malloc策略一起使用。

要启用malloc存储桶,请使用以下命令:

MALLOCOPTIONS=buckets,number_of_buckets:n

存储桶分配器只能为不超过512字节的分配请求提供服务,任何更大的请求都将自动转发到Yorktown malloc。

结论

本文介绍了各种AIX内存分配方案的实质及其显着特征。 对各种分配方案有一个整体的了解,可以帮助您决定在执行效率和性能方面最适合您的应用程序的分配方案。


翻译自: https://www.ibm.com/developerworks/aix/library/au-memoryallocation/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值