Home Product Support IT Modernization Comment allouer une grande taille mémoire avec MALLOC

Comment allouer une grande taille mémoire avec MALLOC

Résolution de l'erreur 12 (ENOMEM) retournée sur l'allocation d'une grande taille par la fonction MALLOC.

 

ProduitLangage C
Version 8.0
OS

Aix


Problème

La fonction MALLOC gère un espace mémoire, alloué dans une zone appelée "user data area" ou "user heap".

Cette zone est située dans l'espace d'adresse de l'application (segment de données ou segment 2).

La valeur par défaut de la taille de cette zone de données est positionnée à 262144 blocks de 512 octets (soit 131 072 Koctets) dans le fichier /etc/security/limits (paramètre data).

Elle est également définie (sous root) sous: "smit user" --> "Change / Show Characteristics of a User" --> rubrique "Soft DATA segment".

Elle est retournée par la commande "ulimit":

# ulimit -a

time(seconds) unlimited
file(blocks) unlimited
data(kbytes) 131072
stack(kbytes) 32768
memory(kbytes) 32768
coredump(blocks) 2097151
nofiles(descriptors) 2000

L'erreur 12 (ENOMEM) est retournée lorsque MALLOC tente d'allouer une zone de taille égale ou supérieure à la taille de la zone de données.


Solution

Pour résoudre cette erreur, positionner MAXDATA à une valeur non nulle:
MAXDATA permet de réserver 1 (maxdata=0x10000000) à 8 segments (maxdata=0x80000000) pour la zone des données.



Exemple

Cet exemple a été testé sur Aix 5.3, avec le compilateur C V8

Le programme mallotest.c suivant alloue une taille de 134 217 728 octets (131072 koctets, soit la taille du segment de données):

#include
<stdlib.h>
#include <stdio.h
#define SIZE 134217728
extern int errno;
main()
{
char *p1;
if (NULL == ( p1=(char *)malloc(SIZE))) {
puts("Impossible d'allouer la mémoire.");
printf("erreur malloc = %d\n", errno);
exit(1);
}
free ( p1 );
printf("erreur free = %d\n", errno);
}


Le programme est compilé par la commande:

cc -o malloctest malloctest.c 

Son exécution retourne l'erreur:

Impossible d'allouer la mémoire.
erreur malloc = 12

(errno 12 correspond à "ENOMEM": Not enough space)


L'erreur est résolue:

- soit en positionnant la variable d'environnement LDR_CNTRL avant l'exécution du programme.

   export LDR_CNTRL=MAXDATA=0x20000000

- soit au moment du link, en compilant par la commande:

   cc -o malloctest -bmaxdata:0x20000000 malloctest.c 


Documentation

Se référer au "man" de la commande ld

Documentation "AIX 5.3 General Programming Concepts - Writing and Debugging Programs", chapitre "Large Program Support".

— filed under:
Assistance request
Create and track
Bull Search