Usando ps, posso vedere la dimensione, il vsize (lo stesso di VIRT di top?) E l'rss (lo stesso di RES di top?). (Un altro che vedo in cima è SHR.)
Qualcuno potrebbe riassumere per me cosa significano questi diversi campi?
Usando ps, posso vedere la dimensione, il vsize (lo stesso di VIRT di top?) E l'rss (lo stesso di RES di top?). (Un altro che vedo in cima è SHR.)
Qualcuno potrebbe riassumere per me cosa significano questi diversi campi?
Risposte:
In breve:
Dimensione virtuale: è la quantità di spazio degli indirizzi gestita da un processo. Lo spazio di indirizzi virtuali contiene tutto ciò a cui il processo può accedere tramite puntatori (riferimenti di indirizzi di memoria). Ad esempio, se il programma accede al framebuffer della scheda video, tale memoria viene mappata allo spazio virtuale di processo e riceve un indirizzo memorizzato in un puntatore. Anche i file mappati in memoria e i mapping anonimi vengono calcolati nella dimensione dello spazio degli indirizzi virtuali. Praticamente tutto è nella dimensione virtuale. Se si somma la dimensione 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 che la quantità di memoria che non è in scambio. Si noti che alcune parti del processo possono essere nella memoria di scambio anche quando il processo è in esecuzione. Il sistema operativo estrarrà queste aree dallo scambio quando il processo tenta di accedervi. Ciò dovrebbe includere l'heap, le pile di tutti i thread e altri mapping privati. Se si guarda /proc/<pid>/maps
, i [stack]
, [heap]
e le altre mappature anonimi (senza quei percorsi di file) sono o scambiati o contabilizzati 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, una per ogni processo (questa è la memoria residente), ma avrai solo un'istanza di il codice binario del programma e delle sue librerie. Questo è lo spazio condiviso. Non solo include il codice binario del programma e le sue librerie, ma anche i file di localizzazione, i dati del programma di sola lettura, i segmenti di memoria condivisa SysV e POSIX, i semafori, ecc ... Se guardi dentro /proc/<pid>/maps
, la maggior parte dei mapping associati alla libreria e ai file di programma sono condivisa.
Nota che VIRT contiene l'unione di RSS e SHR e sarà sempre maggiore di ognuna di esse. Ci possono essere regioni considerate sia RSS che SHR.
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 alcun significato poiché può contenere conteggi duplicati.
Per costruire un processo con RSS + SHR> VIRT, basta mmap un file di grandi dimensioni (1 GB), quindi leggerlo completamente: il file mmaped verrà caricato in RAM e VIRT, SHR e RSS saranno leggermente più grandi di 1 GB, quindi SHR + RSS> VIRT.