GNU/Linux >> Linux Esercitazione >  >> Linux

Come viene riportato l'utilizzo della memoria in Linux?

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.


Linux
  1. Come controllare l'utilizzo della memoria in un server basato su Linux

  2. Picco di utilizzo della memoria di un processo Linux/Unix

  3. Recuperare l'utilizzo della CPU e l'utilizzo della memoria di un singolo processo su Linux?

  4. Limitazione dell'utilizzo della memoria/CPU del processo su Linux

  5. Limita l'utilizzo della memoria per un singolo processo Linux

Come uccidere un processo in Linux

Come controllare l'utilizzo della memoria in Linux

Come cancellare la memoria di scambio in Linux

Come ottenere l'utilizzo della CPU di un singolo processo in Linux

Utilizzo della memoria del processo grafico su Linux

Ubuntu Linux:elabora la memoria di scambio e l'utilizzo della memoria