Mode
Slides
Presentation
Remote control
Send
Listen
Press F11 to switch to fullscreen.
C: Cours 7
1
pile
2
malloc
3
mmap
4
mémoire
5
petits systèmes
6
petits systèmes
7
mémoire virtuelle
8
memory manager
9
pmap
10
malloc
11
malloc
12
free
13
background subtraction
14
histogramme couleurs
15
16
Semaine 7
Organisation de la mémoire,
malloc, free
SSIE Programmation en C, Thomas Lochmatter, 2019
1
main temps lireFichier calculerDistance démarrage du programme fin points[1000] sqrt
	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
double * altitudes
	// 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
double * altitudes Fichier "mnt-suisse-romande"
	// 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
Pile (stack) .text Code machine, exécutable char * text = "Hello world!\n"; Constantes Variables globales initialisées Variables globales non-initialisées .rodata .data .bss double pi = 3.14159265358979; int count; Tas (heap)
5
Pile (stack) .text Code machine, exécutable char * text = "Hello world!\n"; Constantes Variables globales .rodata .data, .bss Petits systèmes (microcontrolleurs)
6
32 KiB Flash Memory Code machine, exécutable Constantes Variables globales 2048 bytes SRAM Petits systèmes (microcontrolleurs) Pile (stack) Mesure actuelle 348 bytes 1700 bytes Paramètres de calibration Historique des mesures (reste) 40 bytes 96 bytes 1532 bytes Gérer l'historique des mesures 32 bytes Planifier l'utilisation de la mémoire = 383 mesures à 4 bytes= une mesure toutes les 10 secondes pendant 63 minutes
7
Mémoire virtuelle d'un processus Grands systèmes (avec système d'exploitation) Pile (stack) Bloc allouéavec mmap Bibliothèque Code machine Constantes .rodata .text Variables globales .data, .bss par ex. libc avecprintf, strlen, ... Tableaux allouésavec malloc / calloc 128 TB Tas (heap)
8
Page tableAddress translation Memory manager Mémoire virtuelle d'un processus Grands systèmes (avec système d'exploitation) Mémoire physique de l'ordinateur (16 GB de RAM) Mémoire RSS, physically wired memory 128 TB
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
malloc — stratégies Grands systèmes (avec système d'exploitation) grand tableau petit tableau 128 TB tas (heap) > 128 KiB
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

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