Semaine 7
Organisation de la mémoire,
malloc, free
malloc, free
SSIE Programmation en C, Thomas Lochmatter, 2019
1
int lireFichier(char * fichier, struct GpsPoint * tableau, int longueur) { ... } int main(int argc, char * argv[]) { struct GpsPoint points[1000]; int nbPoints = lireFichier("ulagan.csv", points, 1000); ... return 0; }
Allocation sur la pile (stack). Limité à ~1 MB. Mémoire libérée automatiquement quand la fonction retourne.
2
// HIDE #include <stdlib.h> // SHOW // Allocation sur le tas (heap) double * altitudes = malloc(2501 * 3601 * sizeof(double)); ... // Libérer la mémoire free(altitudes);
Allocation sur le tas (heap) avec
malloc
, calloc
ou realloc
. Libération manuelle avec free
.3
// HIDE #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> // SHOW // Allocation sur le tas (heap) avec un fichier int fd = open("mnt-suisse-romande", O_RDONLY); int taille = 2501 * 3601 * sizeof(double); void * altitudes = mmap(NULL, taille, PROT_READ, MAP_PRIVATE, fd, 0); close(fd); ... // Libérer la mémoire munmap(altitudes, taille);
Allocation d'un block de mémoire avec un fichier. Libération manuelle avec
munmap
.4
5
6
7
8
9
pmap -x PID
Address Kbytes RSS Dirty Mode Mapping 000055b1a2f34000 4 4 0 r---- mon-programme header 000055b1a2f35000 4 4 0 r-x-- mon-programme code machine 000055b1a2f36000 4 4 0 r---- mon-programme init 000055b1a2f37000 4 4 4 r---- mon-programme constantes 000055b1a2f38000 4 4 4 rw--- mon-programme var. globales 000055b1a3f58000 132 4 4 rw--- [ anon ] heap 00007fa1ca81a000 2097156 4 4 rw--- [ anon ] mmap 2 GiB 00007fa24a83d000 1312 872 0 r-x-- libc-2.28.so 00007fa24a985000 304 64 0 r---- libc-2.28.so 00007fa24a9d6000 8 8 8 rw--- libc-2.28.so ... 00007fa24aa48000 4 4 4 rw--- [ anon ] 00007ffd96ef8000 132 16 16 rw--- [ stack ] stack 00007ffd96f50000 12 0 0 r---- [ anon ] vvar 00007ffd96f53000 8 4 0 r-x-- [ anon ] vdso ---------------- ------- ------- ------- total kB 2099432 1332 88
10
11
malloc — stratégies d'allocation
Petits tableaux
Trouver une place libre dans le heap
malloc
free
Grand tableaux (à partir de ~128 KiB)
Créer un nouveau bloc avec mmap
12
Libérer la mémoire
Manuel
Appeler free
pour libérer un tableau.
Oubli = fuite de mémoire.
ARC: Automatic Reference Counting
Compter le nombre de références vers un objet. Libérer l'object dès qu'il n'a plus de références (refcount = 0).
Ne fonctionne pas avec des références circulaires.
GC:
Garbage Collection
Garbage Collection
Suivre les références pour déterminer les objets qui ne sont plus en utilisation.
Lourd.
Escape analysis
Analyser le code source pour déterminer quand a object peut être libéré lors de la compilation.
Ne fonctionne pas dans tous les cas.
13
Background subtraction
-
=
14
Histogramme des couleurs
rouge-vert
bleu-vert
15
Documentation
C dynamic memory allocation sur Wikipedia
Virtual memory sur Wikipedia
Virtual address space sur Wikipedia
Page table sur Wikipedia
Memory leak sur Wikipedia
16