Development
Comment allouer une grande taille mémoire avec MALLOC
Produit | Langage 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".