La gestione della memoria è una delle attività più complesse svolte dal kernel Linux. Ha vari concetti/problemi ad esso associati.
Questo articolo fa parte della nostra serie di panoramiche del kernel UNIX in corso.
Nel precedente articolo della serie del kernel, abbiamo discusso della panoramica del processo UNIX e dei kernel rientranti.
In questo articolo cercheremo di toccare le basi della memoria virtuale e della richiesta di paging poiché questi sono alcuni dei concetti importanti relativi alla gestione della memoria.
Memoria virtuale
Il concetto di memoria virtuale è uno degli aspetti più potenti della gestione della memoria. Fin dall'era iniziale dei computer si è sentito il bisogno di memoria più della memoria fisica esistente. Nel corso degli anni sono state utilizzate molte soluzioni per superare questo problema e quella di maggior successo è stata il concetto di memoria virtuale.
La memoria virtuale fa sembrare il tuo sistema come se avesse più memoria di quanta ne abbia effettivamente. Questo può sembrare interessante e potrebbe suggerire come è possibile. Quindi, cerchiamo di capire il concetto.
- Per iniziare, dobbiamo prima capire che la memoria virtuale è uno strato di indirizzi di memoria mappati su indirizzi fisici.
- Nel modello di memoria virtuale, quando un processore esegue un'istruzione di programma, legge l'istruzione dalla memoria virtuale e la esegue.
- Ma prima di eseguire l'istruzione, converte prima l'indirizzo della memoria virtuale in un indirizzo fisico.
- Questa conversione viene eseguita in base alla mappatura degli indirizzi da virtuali a fisici eseguita in base alle informazioni di mappatura contenute nelle tabelle delle pagine (che sono mantenute dal sistema operativo).
La memoria virtuale e fisica è divisa in blocchi di lunghezza fissa noti come pagine. In questo modello paginato, un indirizzo virtuale può essere diviso in due parti:
- Un offset (12 bit più bassi)
- Un numero di frame di pagina virtuale (il resto dei bit)
Ogni volta che il processore incontra un indirizzo virtuale, ne estrae il numero di frame della pagina virtuale. Quindi traduce questo numero di frame di pagina virtuale in un numero di frame di pagina fisico e le parti di offset lo aiutano a raggiungere l'indirizzo esatto nella pagina fisica. Questa traduzione degli indirizzi avviene tramite le tabelle delle pagine.
Teoricamente possiamo considerare una tabella di pagina per contenere le seguenti informazioni:
- Un flag che descrive se la voce è valida o meno
- Il numero di frame fisico della pagina come descritto da questa voce
- Accedi alle informazioni relative alla pagina (come sola lettura, lettura-scrittura ecc.)
È possibile accedere a una tabella delle pagine tramite il numero di frame della pagina virtuale utilizzandolo come offset per le voci nella tabella delle pagine. Ad esempio, un numero di frame di pagina virtuale di "2" punta alla voce "1" nella tabella delle pagine (i numeri di voce iniziano con "0").
Nell'immagine qui sotto, VPFN sta per Virtual page frame number e PFN indica il numero fisico di frame della pagina.
Può accadere che un processore vada a una voce della tabella delle pagine dei processi con un numero di frame di pagina virtuale e trovi la voce non valida. In questo caso è responsabilità del processore passare il controllo al kernel e chiedergli di risolvere il problema. Processori diversi passano il controllo in modi diversi, ma questo fenomeno è noto come "errore di pagina". Ma se la voce era valida, il processore prende il numero di frame della pagina fisica, lo moltiplica per la dimensione della pagina per ottenere l'indirizzo di base della pagina fisica e quindi aggiunge l'offset per ottenere l'indirizzo fisico esatto.
Quindi ora capiamo che attraverso il concetto di memoria virtuale, ogni processo pensa di avere a sua disposizione tutta la gamma di indirizzi virtuali e quindi questi concetti fanno sembrare il sistema come se avesse più memoria fisica di quella effettivamente disponibile.
Richiesta cercapersone
Nella sezione precedente abbiamo appreso che se il processore va alla tabella delle pagine dei processi con un numero di frame di pagina virtuale per il quale non era presente alcuna voce nella tabella, si verificano due casi.
- O il processo ha tentato di accedere a un indirizzo di memoria non valido
- La pagina fisica corrispondente all'indirizzo virtuale non è stata caricata nella memoria fisica
Dei due casi precedenti, il caso 1 è il caso in cui il processo tenta di memorizzare un indirizzo che non è consentito. In questo caso viene generato un errore di pagina e il kernel termina il processo.
Mentre nel caso '2', come già spiegato, la pagina fisica corrispondente all'indirizzo virtuale non è ancora caricata nella memoria fisica. In questo caso viene generato anche un errore di pagina e il kernel prova quindi a portare la pagina di memoria richiesta nella memoria fisica dal disco rigido.
Poiché questa operazione di portare una pagina dal disco rigido alla memoria fisica richiede molto tempo, a questo punto si verifica un cambio di contesto tra i processi e viene eseguito un altro processo. Nel frattempo la pagina del processo precedente viene portata nella memoria fisica e le tabelle delle pagine vengono aggiornate e quindi questo processo viene riportato nuovamente in esecuzione dalla stessa istruzione che ha causato l'errore di pagina.
Questo è noto come paginazione della domanda in cui tutte le pagine di memoria corrispondenti a un processo non sono presenti nella memoria fisica in un dato momento. Ciò evita che la memoria fisica si ostruisca con pagine di memoria non richieste mentre, quando necessario, queste pagine possono essere trasferite nella memoria fisica a causa di un errore di pagina (come spiegato sopra).