Soluzione 1:
In breve:
-
Dimensione virtuale: è la quantità di spazio degli indirizzi che un processo sta gestendo. Lo spazio degli indirizzi virtuali contiene tutto ciò a cui il processo può accedere tramite puntatori (riferimenti di indirizzi di memoria). Ad esempio, se il tuo programma ottiene l'accesso al framebuffer della tua scheda video, quella memoria viene mappata allo spazio virtuale del processo e riceve un indirizzo che viene memorizzato in un puntatore. Anche i file mappati in memoria e i mapping anonimi vengono presi in considerazione nella dimensione dello spazio degli indirizzi virtuali. Praticamente tutto è nella dimensione virtuale. Se riassumi le dimensioni di tutti gli intervalli di indirizzi elencati in
/proc/<pid>/maps
, dovrebbe restituire all'incirca lo stesso valore della dimensione virtuale. -
Dimensione residente: è la quantità di memoria che appartiene specificamente a quel processo che è attualmente residente in memoria. Ciò significa, la quantità di memoria che non è in swap. Si noti che parti del processo possono trovarsi nella memoria di scambio anche quando il processo è in esecuzione. Il sistema operativo estrarrà queste regioni dallo scambio quando il processo tenterà di accedervi. Ciò dovrebbe includere l'heap, gli stack di tutti i thread e altri mapping privati. Se guardi in
/proc/<pid>/maps
, il[stack]
,[heap]
e altre mappature anonime (quelle senza percorsi di file) vengono scambiate o contabilizzate nella dimensione residente. -
Dimensione condivisa: è la quantità di memoria che può appartenere a più processi. Ad esempio, se hai quattro istanze della stessa applicazione caricate in memoria, avrai quattro istanze dell'heap e almeno quattro stack, uno per ogni processo (questa è la memoria residente), ma avrai solo un'istanza di il codice binario del programma e le sue librerie. Questo è lo spazio condiviso. Non solo include il codice binario del programma e le sue librerie, ma anche file di localizzazione, dati di programma in sola lettura, segmenti di memoria condivisa SysV e POSIX, semafori, ecc... Se guardi in
/proc/<pid>/maps
, la maggior parte delle mappature legate alla libreria e ai file di programma sono condivise.
Si noti che VIRT contiene l'unione di RSS e SHR e sarà sempre maggiore di ciascuno di essi. Potrebbero esserci regioni contabilizzate sia come RSS che come SHR.
Soluzione 2:
A Juliano rispondi:
Nota che RSS + SHR <=VIRT, sempre.
Questo è solo falso.SHR contiene tutta la memoria virtuale che potrebbe essere condivisa con altri processi e RSS contiene tutta la memoria fisicamente nella RAM utilizzata dal processo.
Pertanto tutta la memoria condivisa attualmente nella RAM viene conteggiata sia in SHR che in RSS, quindi SHR + RSS non ha significato poiché può contenere conteggi duplicati.
Per costruire un processo con RSS + SHR> VIRT, basta mmapare un file di grandi dimensioni (1GB), quindi leggerlo completamente:il file mmaped verrà caricato nella RAM, e VIRT, SHR e RSS saranno ciascuno leggermente più grande di 1GB, quindi SHR + RSS> VIRT.