Multiheap Malloc
Por padrão, o subsistema malloc usa um único heap, ou piscina de memória livre.
No entanto, ele também fornece uma capacidade de multiheap opcional para permitir o uso de múltiplos heaps de memória livre, em vez de apenas um.
O propósito de fornecer capacidade de múltiplos heap no subsistema malloc é melhorar o desempenho dos aplicativos encadeados rodando em sistemas multiprocessador. Quando o subsistema malloc é limitado a usar um único heap, os pedidos simultâneos de alocação de memória recebidos de threads em execução em processadores separados são serializados. O subsistema malloc pode, portanto, apenas atender uma thread por vez, resultando em um impacto sério no desempenho do sistema multiprocessador.
Com o recurso multiheap malloc ativado, o subsistema malloc cria um número fixo de heaps para seu uso. Ele começará a usar múltiplos heaps após o segundo encadeamento ser iniciado (processo torna-se multiencadeado). Cada solicitação de alocação de memória será atendida usando um dos heaps disponíveis. O subsistema malloc pode então processar solicitações de alocação de memória em paralelo, desde que o número de threads simultaneamente solicitantes de serviço seja menor ou igual ao número de heaps.
Se o número de threads requisitando simultaneamente serviço exceder o número de heaps, solicitações simultâneas adicionais serão serializadas. A menos que isso ocorra em uma base contínua, o desempenho geral do subsistema malloc deve ser significativamente melhorado quando várias threads estão fazendo chamadas para a subroutine malloc em um ambiente multiprocessador.
Habilitando o multiheap malloc
O multiheap Malloc não é ativado por padrão. Ele é ativado e configurado configurando a variável de ambiente MALLOCOPTIONS . Para ativar o multiheap malloc com as configurações padrão, configure MALLOCOPTIONS=multiheap antes da inicialização do processo. A configuração MALLOCOPTIONS desta maneira habilitará o multiheap malloc em sua configuração padrão, com 32 heaps e o algoritmo de seleção de heap rápido.
Opções de multiheap Malloc
As opções Malloc Multiheap são as seguintes:
- multiheap: n
- atencioso
Cada uma dessas opções é descrita em detalhes posteriormente neste documento.
Para configurar qualquer uma dessas opções, use a sintaxe a seguir:
MALLOCOPTIONS=[multiheap:n] | [considersize]Uma ou ambas as opções podem ser especificadas em qualquer ordem, desde que as opções sejam separadas por vírgula, como no exemplo a seguir:
MALLOCOPTIONS=multiheap:3,considersizeNo exemplo anterior, o multiheap malloc seria ativado com três heaps e um algoritmo de seleção de heap um pouco mais lento que tenta minimizar o tamanho do processo.
Cada opção de configuração deve ser especificada apenas uma vez ao configurar MALLOCOPTIONS. Se uma opção de configuração for especificada mais de uma vez por configuração, apenas a instância final se aplicará.
As opções Malloc Multiheap são descritas da seguinte forma:
- multiheap: n
- Por padrão, o número máximo de heaps disponíveis para o multiheap malloc é de 32. A opção multiheap: n pode ser usada para alterar o número máximo de heaps para qualquer valor de 1 até 32, onde n é o número de heaps. Se n for configurado para um valor fora do intervalo determinado, será usado o valor padrão de 32. Apenas habilitar tantos heaps quanto necessários para os requisitos do processo. Os saltos desnecessariamente habilitados podem aumentar a quantidade de fragmentação e de resíduos.
- considerado tamanho
- Por padrão, o multiheap malloc seleciona o próximo heap disponível. Se a opção considersize for especificada, o multiheap malloc usará um algoritmo de seleção de heap alternativo que tenta selecionar um heap disponível que tenha espaço livre suficiente para tratar a solicitação. Isso pode minimizar o tamanho do conjunto de trabalhos do processo, reduzindo o número de chamadas de subroutine sbrk . No entanto, por causa do processamento adicional necessário, o algoritmo de seleção de heap considersize é um pouco mais lento do que o algoritmo de seleção de heap padrão.
Se os heaps não conseguirem alocar espaço, a subroutine malloc retornará NULL e configure o errno para o ENOMEM. Se não houver memória disponível no heap atual, o subsistema malloc verificará os outros heaps para o espaço disponível.