Phil Bull
philbull@gmail.com 2011
Michael Hill
mdhillca@gmail.com 2011, 2014
La mappa di memoria di un processo può aiutare a diagnosticare alcuni problemi con la memoria.
Davide Ferracin
davide.ferracin@protonmail.com 2022

# Cos'è una mappa di memoria?

La memoria virtuale è una rappresentazione della combinazione della memoria fisica e dello spazio di swap in un sistema. Permette ai processi in esecuzione di accedere a più della memoria fisica esistente, mappando le posizioni in essa su dei file sul disco.

Quando un programma viene eseguito, il sistema gli assegna un identificativo univoco («process id», PID), e le sue istruzioni e i suoi dati vengono caricati nella memoria in pagine. La tabella delle pagine di ogni processo è una mappa della corrispondenza tra le pagine di esso nella memoria virtuale e la rispettiva posizione nella memoria fisica. La mappa della memoria mostra la memoria virtuale complessiva usata dal processo, e può essere usata: per determinare il costo in termini di memoria dell'eseguire un'istanza singola piuttosto che multipla del programma, per assicurarsi di stare usando le librerie condivise corrette, di vedere gli effetti di aver regolato qualche parametro sulle prestazioni, e per diagnosticare problemi come le falle di memoria.

Se sono in esecuzione più copie di un programma, le sue istruzioni (o testo) devono essere caricate nella memoria fisica solo una volta. Ogni volta che si lancia una nuova istanza del programma (come processo distinto, con la sua propria pagina di memoria virtuale), la sua tabella delle pagine collega la posizione del testo nella memoria virtuale alle istruzioni che si trovano nella reale posizione originale all'interno della memoria. Inoltre, ciascuna libreria dinamica condivisa usata dal processo appare come distinta nella memoria virtuale, ma in realtà sono tutte referenze condivise a una singola copia del segmento di testo della libreria nella memoria vera. Nel tenere conto dell'uso complessivo della memoria di un processo, è importante notare che il costo del caricamento in memoria delle librerie condivise può essere spalmato tra tutti i processi che ne fanno correntemente uso.

Quando al sistema servono più pagine di memoria di quante ne abbia a disposizione, alcune delle pagine esistenti vengono spostate nello spazio di swap (in inglese si dice che vengono «paged out»). Le pagine di testo hanno i permessi di lettura ed esecuzione nella memoria, e perciò non devono essere trascritte nello swap dato che possono essere semplicemente ricaricate dalla loro posizione originale sul disco. Le pagine dei dati hanno invece i permessi di lettura e scrittura; se vengono modificate mentre sono nella memoria, sono contrassegnate come «sporche» (dirty) e, se il processo deve essere spostato nello swap, verranno trascritte in quest'ultimo. Quando una pagina nello spazio di swap è richiesta da un processo in esecuzione, deve essere riportata nella memoria prima dell'uso, il che potrebbe rendere necessario spostare nello swap un'altra pagina.