Programmation d'application dans un environnement Linux (2): allocation de mémoire

I. Aperçu

        De nombreux programmes système ont besoin d'allouer de la mémoire supplémentaire pour les structures de données dynamiques (listes chaînées et arbres binaires). La taille de ces structures de données est déterminée par les informations obtenues lors de l'exécution.

        Le processus peut allouer de la mémoire en augmentant la taille du tas. Ce qu'on appelle le tas est une mémoire virtuelle continue de longueur variable, qui commence à la fin du segment de données non initialisé du processus et augmente ou diminue à mesure que la mémoire est allouée. Généralement, la mémoire actuelle du tas est modifiée. La limite est appelée "interruption de programme".

Deux: allouer de la mémoire sur le tas

1. Ajuster la pause du programme

#include <unistd.h>

int brk(void *addr);

void *sbrk(intptr_t increment);

       Changer la taille du tas revient en fait à demander au noyau de changer la position de pause de programme du processus. Une fois la position de pause de programme augmentée, le programme peut accéder à n'importe quelle adresse de mémoire dans la zone nouvellement allouée alors que la page de mémoire physique n'a pas encore été allouée. Le noyau allouera automatiquement de nouvelles pages de mémoire physique lorsque le processus tentera pour la première fois d'accéder à ces adresses de mémoire virtuelle.

brk: L' appel système définira le saut de programme à la position spécifiée par le paramètre addr. Puisque la mémoire virtuelle est allouée en unités de pages, addr sera en fait arrondi à la limite de page mémoire suivante. Si la valeur addr est inférieure à la valeur initiale et à la fin, cela entraînera un comportement imprévisible.

sbrk: augmentez la taille entrante de l'incrément de paramètre sur l'adresse d'origine de l'interruption de programme et l'appel renvoie avec succès un pointeur vers l'adresse de départ de la mémoire nouvellement allouée.

2. malloc () et free ()

#include <stdlib.h>

void *malloc(size_t size);
void free(void *ptr);

malloc: alloue de la mémoire de la taille de la sous-section de taille de paramètre sur le tas, et renvoie un pointeur vers l'adresse de départ de la mémoire nouvellement allouée. La mémoire allouée n'est pas initialisée.

free: le paramètre ptr pointe vers le bloc mémoire, qui est généralement la valeur de retour de l'appel malloc.

3. Calloc () et realloc ()

void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);

calloc: nmemb spécifie le nombre d'objets alloués et size spécifie la taille de chaque objet. La valeur renvoyée est un pointeur vers la mémoire. Si l'allocation échoue, elle renvoie NULL. La mémoire allouée par calloc a été initialisée à 0.

realloc: ajustez la taille de la mémoire en fonction de la mémoire existante.

Les deux appels de demande de mémoire ci-dessus sont libérés par free ().

4. Allouer de la mémoire alignée: memalign () et posix_memalign ()

#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);


#include <malloc.h>
void *memalign(size_t alignment, size_t size);

Trois: allouer de la mémoire sur la pile

#include <alloca.h>

void *alloca(size_t size);

L'appel alloca () peut également allouer dynamiquement de la mémoire, mais au lieu d'allouer de la mémoire à partir du tas, il l'alloue à partir de la pile en augmentant la taille de la trame de la pile. Vous ne pouvez pas utiliser free to release, il sera libéré automatiquement lorsque le cadre de la pile est supprimé.

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_34968572/article/details/109508117
conseillé
Classement