Suporte de grande programa
Este tópico fornece informações sobre o uso dos modelos de espaço de endereço grande e muito grande para acomodar programas que requerem áreas de dados maiores do que as fornecidas pelo modelo de espaço de endereço padrão.
O modelo de espaço de endereço grande está disponível no AIX 4.3 e posterior. O modelo de espaço de endereço muito grande está disponível no AIX 5.1 e mais recente
O espaço de endereço virtual de um processo de 32-bit é dividido em áreas de 16256 megabyte (ou segmentos), cada uma endereçada por um cadastro de hardware separado. O sistema operacional refere-se ao segmento 2 (endereços virtuais 0x20000000-0x2FFFFFFF) como o segmento process-private . Por padrão, esse segmento contém a pilha de usuários e dados, incluindo o heap. O segmento de processo-privado também contém o u-block do processo, que é usado pelo sistema operacional e não é legível por um aplicativo.
Como um único segmento é usado para ambos os dados do usuário e pilha, seu tamanho máximo agregado é um pouco menor que 256 MB. Certos programas, no entanto, requerem grandes áreas de dados (inicializados ou não inicializados), ou precisam alocar grandes quantidades de memória com o subroutine malloc ou sbrk . Os programas podem ser construídos para usar o modelo de espaço de endereço grande ou muito grande, permitindo que eles usem até 2 GB de dados.
É possível utilizar o modelo de espaço de endereço grande ou muito grande com um programa existente, fornecendo um valor de maxdata maxdatadiferente de zero. O valor maxdata é obtido a partir da variável de ambiente LDR_CNTRL ou de um campo no arquivo executável. Alguns programas possuem dependências no modelo de espaço de endereço padrão, e quebrarão se forem executados usando o modelo de grande espaço de endereço.
Entendendo o modelo de espaço de endereço grande
O modelo de espaço de endereço grande permite que programas especificados utilizem mais de 256 MB de dados. Outros programas continuam a usar o modelo de espaço de endereço padrão. Para permitir que um programa use o modelo grande de endereço-espaço, especifique um valor de maxdata diferente de zero. Você pode especificar um valor de maxdata diferente de zero usando o comando ld quando estiver construindo o programa, ou exportando a variável de ambiente LDR_CNTRL antes de executar o programa.
Quando um programa usando o modelo grande de endereço-espaço é executado, o sistema operacional reserva-se como muitos segmentos de 256 MB bits conforme necessário para manter a quantidade de dados especificados pelo valor maxdata . Em seguida, começando com o segmento 3, os dados inicializados do programa são lidos do arquivo executável em memória. A leitura de dados começa no segmento 3, mesmo se o valor de maxdata for menor que 256 MB. Com o modelo de espaço de endereço grande, um programa pode ter no máximo 8 segmentos ou 2 GB ou 3.25 GB de dados, respectivamente.
No modelo padrão de endereço-espaço, 12 segmentos estão disponíveis para uso pelas subroutines shmat ou mmap . Quando o modelo de grande endereço-espaço é usado, o número de segmentos reservados para dados reduz o número de segmentos disponíveis para as subroutines shmat e mmap . Como o tamanho máximo de dados é de 2 GB, pelo menos dois segmentos estão sempre disponíveis para as subroutines shmat e mmap .
A pilha de usuários permanece no segmento 2 quando o modelo de espaço de endereço grande é utilizado. Como resultado, o tamanho da pilha é limitado a um pouco menos de 256 MB. No entanto, um aplicativo pode realocar sua pilha de usuários em um segmento de memória compartilhada ou em memória alocada.
Enquanto o tamanho de dados inicializados em um programa pode ser grande, ainda há uma restrição no tamanho do texto. No arquivo executável para um programa, o tamanho da seção de texto mais o tamanho da seção do carregador deve ser menor que 256 MB. Isso é necessário para que essas seções se encaixem em um segmento único e de leitura (segmento 1, o segmento TEXT). Você pode usar o comando dump para examinar tamanhos de seção.
Entendendo o modelo de espaço de endereço muito grande
O modelo de espaço de endereço muito grande possibilita grandes programas de dados em muito da mesma forma que o grande modelo de endereço-espaço, embora existam várias diferenças entre eles. Para permitir que um programa use o modelo de espaço de endereço muito grande, você deve especificar um valor maxdata e a propriedade de alocação de segmento dinâmico (dsa). Use o comando ld ou a variável de ambiente LDR_CNTRL para especificar um valor maxdata e a opção DSA .
Se um valor maxdata for especificado, o modelo de espaço de endereço muito grande segue o modelo de espaço de grande endereço, na medida em que os dados de um programa são lidos em memória começando com o segmento 3, e ocupa-se como muitos segmentos, conforme necessário. Os segmentos de dados restantes, no entanto, não são reservados para a área de dados em tempo de execução, mas são obtidos dinamicamente. Até que um segmento é necessário para uma área de dados de um programa, ele pode ser usado pelas subroutines shmat ou mmap . Com o modelo de espaço de endereço muito grande, um programa pode no máximo 13 segmentos ou 3.25 GB de dados. Destes 13 segmentos, 12 segmentos ou 3 GB, estão disponíveis para fins de subroutine shmat e mmap .
Quando um processo tenta expandir sua área de dados em um novo segmento, a operação faz sucesso enquanto o segmento não estiver sendo usado pelas subroutines shmat ou mmap . Um programa pode chamar o subroutine shmdt ou munmap para parar de usar um segmento para que o segmento possa ser usado para a área de dados. Depois de um segmento ter sido usado para a área de dados, no entanto, ele não pode mais ser usado para qualquer outra finalidade, mesmo que o tamanho da área de dados seja reduzido.
Se um valor maxdata não for especificado (maxdata = 0) com a propriedade dsa, uma pequena variação do comportamento acima é obtida. O processo terá seus dados e pilha no segmento 2, similiar a um processo regular. O processo não terá acesso às bibliotecas compartilhadas globais, assim, todas as bibliotecas compartilhadas usadas pelo processo serão carregadas privadamente. A vantagem de executar dessa forma é que um processo terá todos os treze segmentos (3.25 GB) disponíveis para uso pelas sub-rotinas shmat e mmap ..
Para reduzir as chances de que as subroutines shmat ou mmap usarão um segmento que poderia ser usado para a área de dados, o sistema operacional usa uma regra diferente para a escolha de um endereço a ser devolvido (se um endereço específico não for solicitado). Normalmente, as subroutines shmat ou mmap retornam um endereço no segmento mais baixo disponível. Quando o modelo de espaço de endereço muito grande for usado, essas subroutines retornarão um endereço no segmento mais alto disponível. Uma solicitação para um endereço específico terá sucesso, desde que o endereço não esteja em um segmento que já tenha sido utilizado para a área de dados. Este comportamento é seguido para todo o processo que especifica a propriedade dsa.
Com o modelo de espaço de endereço muito grande, pode ser especificado um valor de maxdata de zero ou um valor de até 0xD0000000 . Se um valor maxdata maior que 0xAFFFFFFF for especificado, um programa não usará bibliotecas compartilhadas globalmente carregadas. Em vez disso, todas as bibliotecas compartilhadas serão carregadas privadamente. Isso pode afetar o desempenho do programa.
Habilitando os modelos de espaço de endereço grande e muito grande
O modelo de espaço de endereço grande é usado se qualquer valor diferente de zero é especificado para o valor maxdata e a propriedade de alocação de segmentos dinâmicos (dsa) não é especificada. O modelo de espaço de endereço muito grande é usado se qualquer valor maxdata é dado e a propriedade dsa é especificada. Use o comando ld com a bandeira -bmaxdata para especificar um valor maxdata e para configurar a propriedade dsa.
cc -bmaxdata:0x80000000 sample.o cc -bmaxdata:0xD0000000/dsa sample.o cc -bmaxdata:0xD0000000/dsa sample.o LDR_CNTRL=MAXDATA=0x80000000 a.outLDR_CNTRL=MAXDATA=0x80000000@DSA a.out0x80000000, use o comando a seguir:/usr/ccs/bin/ldedit -bmaxdata:0x80000000 a.out/usr/ccs/bin/ldedit -bmaxdata:0x80000000/dsa a.outVocê pode usar o comando dump para examinar o valor maxdata , ou para determinar se um programa tem a propriedade dsa.
Alguns programas possuem dependências no modelo de endereço padrão-espaço. Esses programas finalizam se um valor de maxdata diferente de zero foi especificado, modificando-se o arquivo executável do programa ou configurando a variável de ambiente LDR_CNTRL .
Executando programas com grandes áreas de dados
Ao executar um programa que usa o modelo de espaço de endereço grande, o sistema operacional tenta modificar o limite de soft em tamanho de dados, se necessário, para aumentá-lo para combinar com o valor maxdata . Se o valor maxdata for maior do que o limite rígido atual em tamanho de dados, ou o programa não executará se a variável de ambiente XPG_SUS_ENV tiver o valor configurado como ON, ou o limite suave será definido para o limite rígido atual.
Se o valor maxdata for menor do que o tamanho dos dados estáticos do programa, o programa não executará.
Depois de colocar os dados inicializados e não inicializados do programa em segmentos 3 e além, o valor de quebra é computado. O valor de quebra define o fim dos dados estáticos do processo e o início de seus dados dinamicamente alocáveis. Usando o subroutine malloc, brk ou sbrk , um processo pode mover o valor de quebra para aumentar o tamanho da área de dados.
Por exemplo, se o valor maxdata especificado por um programa for 0x68000000, então o valor de quebra máximo fica no meio do segmento 9 (0x98000000). A subroutine brk amplia o valor de quebra nos limites do segmento, mas o tamanho da área de dados não pode ultrapassar o atual limite de dados suaves.
A subroutine setrlimit permite que um processo configure seu limite de dados soft para qualquer valor que não exceda o limite de dados rígidos. O tamanho máximo da área de dados, no entanto, limita-se ao valor original maxdata , arredondado para um múltiplo de 256 MB.
A maioria das subroutines não é afetada por grandes programas de dados. As subroutines shmat e mmap são as mais afetadas, pois possuem menos segmentos disponíveis para uso. Se um grande programa de modelo de endereço de dados forca, o processo filho herda os limites de recursos de dados atuais.
Considerações especiais
Programas com grandes espaços de dados requerem uma grande quantidade de espaço de paginação. Por exemplo, se um programa com um espaço de endereço de 2-GB tentar acessar cada página em seu espaço de endereço, o sistema deverá ter 2 GB minutos de espaço de paginação. O sistema operacional finaliza processos quando o espaço de paginação corre baixo. Os programas com grandes espaços de dados são finalizados primeiro porque geralmente consomem uma grande quantidade de espaço de paginação.
Programas de depuração usando o modelo de dados grande não são diferentes do que depurar outros programas. O comando dbx pode depurar esses grandes programas ativamente ou a partir de um core dump. Um dump de núcleo completo a partir de um programa de Big Data pode ser bem grande. Para evitar arquivos de núcleos truncados, tenha certeza que o limite de recursos coredump é grande o suficiente, e certifique-se de que há espaço livre suficiente no sistema de arquivos onde seu programa está em execução.
Alguns programas de aplicativos podem ser escritos de tal forma que eles contam com características do modelo de espaço de endereço padrão. Esses programas podem não funcionar se eles executam usando o modelo de espaço de endereço grande ou muito grande. Não configure a variável de ambiente LDR_CNTRL quando você executar esses programas.
Os processos que utilizam o modelo de espaço de endereço muito grande devem fazer alterações de código em seus programas a fim de mover o valor de quebra da morada-espaço em chunks maiores que 2 GB. Esta é uma limitação da chamada de sistema sbrk que leva um valor assinado como o parâmetro. Como um workaround, um programa pode chamar sbrk mais de uma vez para mover o valor de quebra para a posição desejada.