Malloc 多堆
缺省情况下,malloc 子系统使用单个的堆或空闲的内存池。
但是,它也提供了可选的多堆能力,使您能够使用空闲内存中的多个堆,而不仅仅是一个堆。
在 malloc 子系统中提供多堆能力的目的在于改善运行于多处理器系统之上的线程式应用程序的性能。 当 malloc 子系统限制为只能使用一个堆时,从运行于不同处理器之上的线程接收到的同时发生的内存分配请求将被串行化。 因此,malloc 子系统在一个时间只能为一个线程提供服务,这导致对多处理器系统的性能产生了严重的影响。
如果启用 malloc 多堆能力,那么 malloc 子系统将创建固定数目的堆供其使用。 在第二个线程启用之后(进程变为多线程),它将开始使用多个堆。 将使用一个可用的堆对每个内存分配请求提供服务。 然后 malloc 子系统可以并行处理内存分配请求,只要同时请求服务的线程数小于等于堆的数目即可。
如果同时请求服务的线程数超出了堆的数目,那么超出的并行请求将被序列化。 除非以上情况不断发生,否则在多处理器环境下,如有多个线程调用 malloc 子例程,malloc 子系统的总体性能将显著提升。
启用 malloc 多堆
malloc 多堆在缺省情况下不启用。 它通过设置环境变量 MALLOCOPTIONS 来启用和配置。 要以缺省设置启用 malloc 多堆,请在进程启动之前设置 MALLOCOPTIONS=multiheap。 以此方式设置 MALLOCOPTIONS 将以缺省配置启用 malloc 多堆,即 32 个堆和快速的堆选择算法。
Malloc 多堆选项
Malloc 多堆选项如下:
- multiheap:n
- considersize
其中的每个选项稍后将在本文档中详细描述。
要设置任何这些选项,使用以下语法:
MALLOCOPTIONS=[multiheap:n] | [considersize]您可以按任意顺序指定这两个选项或仅指定其中的一个,只要如下所示在选项间用逗号分隔即可:
MALLOCOPTIONS=multiheap:3,considersize在上述示例中,将以三个堆和一种尝试将进程大小最小化的较慢的选择算法来启用 malloc 多堆。
在设置 MALLOCOPTIONS 时,每个配置选项应该只被指定一次。 如果每个设置中同一配置选项指定了多次,那么将只应用最后一个实例。
Malloc 多堆选项描述如下:
- multiheap:n
- 缺省情况下,malloc 多堆的最大堆数为 32。 multiheap:n 选项可用于将最大堆数更改为 1 到 32 之间的任何值,其中 n 是堆的数目。 如果 n 设为给定范围以外的值,那么将使用缺省值 32。 仅启用与进程需求所需一样多的堆。 不必要启用的堆可能增加分解片段和浪费的数量。
- considersize
- 缺省情况下,malloc 多堆会选择下一个可用的堆。 如果指定了 considersize 选项,那么 malloc 多堆将使用尝试选择具有足够空间来处理请求的可用堆的备用堆选择算法。 这可能通过减少 sbrk 子例程调用的数目使进程的工作集大小降到最小。 但是,由于需要其他的处理,所以 considersize 堆选择算法会比缺省的堆选择算法稍慢一些。
如果堆无法分配空间,malloc 子例程将返回 NULL 并将错误号设为 ENOMEM。 如果在当前堆中没有可用的内存,那么 malloc 子系统将检查其他的堆以获取可用的空间。