GNU/Linux >> Linux Esercitazione >  >> Linux

Gestione della memoria Linux:scambio, cache e VM condivisa

Questo articolo fa parte della nostra serie di panoramiche del kernel UNIX in corso.

Nel precedente articolo della serie del kernel, abbiamo discusso della memoria virtuale di Linux e del paging della domanda.

Sebbene la memoria virtuale e il demand paging siano gli elementi costitutivi del sistema di gestione della memoria Linux, esistono vari altri concetti che rendono la gestione della memoria Linux molto potente.

In questo articolo cercheremo di basarci su alcuni di questi concetti (Swapping, Caching e Memoria virtuale condivisa).

Io. Scambio Linux

Supponiamo che ci sia una situazione in cui un processo deve avere una delle sue pagine virtuali nella memoria fisica ma la memoria fisica non ha spazio per altre pagine da inserire.

Cosa accadrà in questo caso?

Bene, il sistema operativo dovrà gestire questa situazione consentendo a questa pagina di essere nella memoria fisica. Ma affinché ciò avvenga, una pagina già residente nella memoria fisica deve essere eliminata.

Ora, se la pagina da scartare proviene da un'immagine eseguibile o da un file di dati e la pagina non è stata scritta, allora può essere facilmente scartata come quando richiesto, la stessa pagina può essere facilmente riportata nella memoria fisica dallo stesso eseguibile immagine o file di dati.

Ma supponiamo che la pagina che il sistema operativo scarterà sia quella su cui è stata scritta, quindi questo tipo di pagina è noto come pagina sporca.

Una pagina sporca deve essere preservata in modo da poter essere utilizzata in una fase successiva. Quando le pagine sporche vengono eliminate dalla memoria fisica, vengono salvate in un file speciale noto come file di scambio. Questo è noto come scambio .

Il tempo impiegato per accedere a una pagina di scambio è abbastanza consistente rispetto alla velocità del processore.

Quindi vediamo che il sistema operativo dovrebbe avere un buon algoritmo di scambio per decidere se scartare o scambiare. Un algoritmo di scambio inefficiente può portare a un fenomeno in cui il sistema operativo è così impegnato a scambiare file e poi a rileggere nuovamente nella memoria fisica che in realtà dedica molto meno tempo al lavoro reale richiesto dai processi. Questo fenomeno è noto come thrashing .

Inoltre, un insieme di pagine che un processo utilizza continuamente è noto come working set . Un buon algoritmo di scambio raramente permetterebbe al sistema operativo di entrare in crisi e garantirebbe anche che il working set di tutti i processi sia sempre presente nella memoria fisica.

Linux decide quali pagine devono essere conservate in memoria e quali pagine devono essere rimosse utilizzando uno schema di "Usate meno di recente '.

In questo schema, ogni pagina nella memoria fisica ha un'età ad essa associata. L'età cambia con il fatto che si accede o meno alla pagina. Se si accede frequentemente alla pagina, si suppone che quella pagina sia piuttosto giovane, mentre se non si accede a una pagina, quella pagina diventa più vecchia. Le pagine di età più avanzata vengono offerte per essere scambiate/scartate dalla memoria fisica.

II. Cache

Per estrarre il massimo dal sistema, vengono sviluppati processori e sistemi operativi veloci. Anche se questo è positivo, un aspetto che rende il processore, il sistema operativo e la loro interazione più veloci è il concetto di cache.

Alcune delle cache importanti in Linux sono descritte di seguito.

1. Cache di scambio Linux

Come già discusso in precedenza, vengono scambiate solo le pagine sporche poiché è necessario conservare le pagine che sono state modificate. Inoltre, supponiamo che se una pagina è stata modificata ed è stata scambiata, ora se la stessa pagina è stata riportata nella memoria fisica e ora è necessario scambiarla di nuovo ma la pagina non è stata modificata ulteriormente, non è necessario scambiarla pagina. Scartalo semplicemente perché questa versione della pagina è già presente nel file di scambio. Ciò consente di risparmiare una buona quantità di tempo che altrimenti sarebbe stato sprecato.

Ora, per implementare il concetto di cui sopra, Linux fa uso della cache di scambio.

  • Una cache di scambio non è altro che un elenco di voci della tabella delle pagine con una voce per pagina fisica.
  • Ogni voce corrisponde a una pagina scambiata insieme alle informazioni sul file di scambio in cui è conservata la pagina insieme alla sua posizione esatta nel file di scambio.
  • Se una qualsiasi voce della tabella delle pagine nella cache di scambio è diversa da zero, rappresenta una pagina che si trova in un file di scambio e quella pagina non è stata ulteriormente modificata.
  • Se una pagina ha la sua voce nella cache di scambio e viene ulteriormente modificata, la sua voce dalla cache di scambio viene rimossa.
  • In questo modo la cache contiene informazioni solo su quelle pagine che non sono state modificate dall'ultimo scambio.

Quindi vediamo che la cache di scambio aiuta molto ad aumentare l'efficienza del meccanismo di scambio.

2. Cache hardware

Come abbiamo già discusso nell'articolo precedente, un processore legge le voci della tabella delle pagine per convertire l'indirizzo virtuale in indirizzo fisico. Di solito un processore memorizza le informazioni delle voci della tabella delle pagine in una cache hardware .

Questa cache hardware è composta da Buffer traslazionali o TLB s.

Ogni volta che un processore deve tradurre un indirizzo virtuale, tenta di recuperare le informazioni sulla voce della tabella delle pagine dai TLB. Se trova la voce, procede ulteriormente, ma se il processore non è in grado di trovare alcuna voce di questo tipo, comunica al sistema operativo che si è verificato un errore TLB e chiede al sistema operativo di sistemare le cose.

Per fornire queste informazioni di TLB miss al sistema operativo, viene utilizzato un qualche tipo di meccanismo di eccezione che dipende dal processore. Ora, il sistema operativo trova la voce corretta e aggiorna la voce TLB con essa. Quando l'eccezione viene cancellata (dopo che il sistema operativo ha risolto il problema), il processore prova nuovamente a cercare la voce nei TLB e questa volta trova una voce valida.

3. Buffer Cache Linux

Una cache del buffer contiene i buffer di dati utilizzati dai driver del dispositivo a blocchi.

Un driver di dispositivo a blocchi è un driver che opera su blocchi di dati, ovvero è possibile accedervi leggendo o scrivendo blocchi o blocchi di dati fissi. Viene indicizzata una cache del buffer. L'identificatore del dispositivo viene utilizzato ai fini dell'indicizzazione.

La cache del buffer rende la lettura/scrittura molto efficiente e veloce. Si consideri ad esempio un dispositivo a blocchi, ad esempio un disco rigido. La lettura/scrittura di un disco rigido richiede l'I/O di file che è piuttosto costoso se lo eseguiamo sul disco rigido ogni volta che viene eseguita una lettura o una scrittura. Questa cache del buffer che si trova in mezzo, fa risparmiare tempo mentre le letture e le scritture vengono eseguite su questo e il resto è curato dalla cache.

Per visualizzare l'attività di swap, memoria, pagina, block IO, trap, dischi e CPU, puoi utilizzare strumenti come vmstat o sar.

III. Memoria virtuale condivisa

Quando il codice viene scritto, gli sviluppatori prestano molta attenzione affinché nessun pezzo di codice venga ripetuto inutilmente. Ad esempio, le funzioni vengono utilizzate nei programmi in modo che lo stesso pezzo di codice possa essere chiamato in qualsiasi momento dall'interno del codice.

Un gruppo di funzioni che possono essere usate comunemente sono raggruppate nelle biblioteche. Da lì arriva il concetto di memoria condivisa che una volta viene caricata in memoria e può essere utilizzata da più processi.

Memoria virtuale semplifica la condivisione della memoria tra i processi, ciò è dovuto al fatto che l'indirizzo fisico è mappato tramite tabelle di pagina ed è molto probabile che lo stesso numero di frame di pagina fisica possa essere mappato nella tabella delle pagine di più processi. Questo concetto è noto come memoria virtuale condivisa .


Linux
  1. Come utilizzare la memoria condivisa con Linux in C

  2. Cosa sono la pagina mappata in memoria e la pagina anonima?

  3. Cosa sono la memoria alta e la memoria bassa su Linux?

  4. Come configurare swappiness in Linux Memory Management?

  5. Linux esegue lo scambio opportunistico o è un mito?

CPU Plesk e monitoraggio della memoria

Come controllare la memoria condivisa di Linux usando il comando ipcs

Gestione dei pacchetti Linux con YUM e RPM

Gestione della memoria Linux:memoria virtuale e paginazione della domanda

Memoria condivisa di Linux:shmget() vs mmap()?

Memoria inattiva di Linux