Gestione Avanzata della Memoria Virtuale: Paginazione, Segmentazione e Algoritmi di Sostituzione

Classificato in Informatica

Scritto il in italiano con una dimensione di 16,74 KB

Strutture Hardware e di Controllo della Memoria

  • Tutti i riferimenti alla memoria all'interno di un processo sono *indirizzi logici* che devono essere tradotti in indirizzi fisici durante l'esecuzione.
  • Un processo può essere diviso in più parti (pagine o segmenti) e non è necessario che siano contigui durante l'esecuzione.
    • Ciò è reso possibile dalla combinazione di traduzione dinamica degli indirizzi e l'uso di tabelle di pagina o di segmento.

Esecuzione di un Programma e Meccanismo di Page Fault

  • Il sistema operativo carica in memoria principale solo pochi frammenti del programma, incluso il frammento contenente l'inizio del programma.
  • Il **set residente** del processo è la parte del processo che è effettivamente in memoria principale.
  • Se il processore rileva un indirizzo che non è in memoria principale (un *page fault*), genera un interrupt.
  • Il sistema operativo pone il processo interrotto nello stato di blocco.
  • Il frammento del processo che ha causato l'errore viene portato in memoria principale, per cui il sistema operativo:
    • Emette una richiesta di lettura I/O su disco.
    • Rilascia un altro processo per l'esecuzione mentre l'operazione di I/O è in corso.
    • Una volta completata la transazione di I/O, viene inviato un interrupt e il sistema operativo modifica lo stato del processo interessato nello stato *Pronto*.

Vantaggi della Memoria Virtuale

  • Più processi possono essere mantenuti nella memoria principale.
    • Vengono caricati in memoria principale solo pochi frammenti del processo.
    • Un uso più efficiente dei processori.

Almeno un processo, tra i molti che sono in memoria principale, sarà nello stato *Pronto*.

  • È possibile che un processo sia più grande dell'intera memoria principale.
    • Con la paginazione o la segmentazione della memoria virtuale, il programmatore non deve preoccuparsi se il suo programma è troppo grande.

Tipi di Memoria in Esecuzione

  • Memoria Reale
    • Memoria Principale
  • Memoria Virtuale
    • Permette una multiprogrammazione efficace.
    • Rimuove i vincoli di dimensione della memoria per l'utente.

Thrashing (Eccessivo Scambio di Pagine)

  • Se un frammento viene espulso poco prima dell'uso, è necessario riportarlo quasi subito.
  • Troppi scambi portano al *thrashing*.
  • Il processore impiega più tempo nello scambio di frammenti che nell'esecuzione delle istruzioni utili.

Principio di Località (Prossimità)

  • I riferimenti ai dati e al programma all'interno di un processo tendono a raggrupparsi (*clustering*).
  • Per brevi periodi di tempo, saranno necessari solo pochi frammenti del processo.
  • Previsioni intelligenti su quali porzioni di un processo saranno necessarie nel prossimo futuro.

Supporto Necessario per la Memoria Virtuale

  • L'hardware deve supportare paginazione e segmentazione.
  • Il sistema operativo deve includere software per gestire i movimenti di pagine o segmenti tra memoria principale e secondaria.

Dettagli sulla Paginazione

  • Ogni processo ha la sua tabella delle pagine.
  • Ogni voce nella tabella delle pagine contiene il numero di *frame* (telaio) della pagina corrispondente in memoria principale.
  • Un **bit** è necessario per indicare se la pagina è in memoria principale o meno (bit di presenza).
  • Un altro **bit** (bit di modifica/dirty bit) viene utilizzato per indicare se il contenuto della pagina è stato modificato da quando è stata caricata in memoria principale. Se non ci sono state modifiche, non è necessario aggiornare la pagina quando viene sostituita.

Tabelle delle Pagine (Page Tables)

  • C'è una tabella delle pagine per ogni processo.
  • Alcune tabelle possono occupare grandi quantità di memoria principale.
  • Le tabelle delle pagine vengono memorizzate in memoria virtuale.
  • Quando un processo è in esecuzione, almeno una parte della tabella delle pagine deve essere in memoria principale.

Buffer di Traduzione Avanzato (TLB)

  • Ogni riferimento alla memoria può generare due accessi alla memoria:
    • Per l'accesso alla voce della tabella di pagina.
    • Per ottenere i dati desiderati.
    • Per risolvere questo problema, la maggior parte dei sistemi di memoria virtuale utilizza una cache speciale per le voci della tabella di pagina, chiamata **TLB** (*Translation Lookaside Buffer*).
  • Contiene le voci della tabella delle pagine usate più di recente.
  • Quando il processore riceve un indirizzo virtuale, esamina il TLB.
  • Se la voce della tabella di pagina è presente (TLB hit), ottiene il numero di *frame* e può calcolare l'indirizzo fisico effettivo.
  • Se non trovato, il processore utilizza il numero di pagina come un indice per cercare la tabella delle pagine del processo.
  • Se viene trovato, il bit di presenza attivo indica che la pagina è in memoria principale e il processore può ottenere il numero di *frame* e, di conseguenza, l'indirizzo fisico.
  • Il processore aggiorna il TLB.
  • D'altra parte, se il bit di presenza non è attivo, significa che la pagina non è in memoria principale, causando un difetto di memoria chiamato *page fault*.

Dimensione della Pagina (Page Size)

  • Più piccola è la dimensione della pagina, minore è la frammentazione interna.
  • Più piccola è la pagina, maggiore è il numero di pagine necessarie per ogni processo.
  • Più pagine significano tabelle delle pagine più grandi.
  • Nelle tabelle delle pagine di grandi dimensioni, molte delle tabelle saranno in memoria virtuale.
  • Le caratteristiche fisiche della maggior parte dei dispositivi di memorizzazione secondari sono adatte per dimensioni di pagina più grandi.
  • Pagine di piccola dimensione: minor numero di pagine disponibili in memoria principale.
  • Dopo un po', tutte le pagine in memoria contengono alcuni dei riferimenti recenti del processo. Pertanto, gli errori di pagina saranno minori.
  • Quando la dimensione della pagina aumenta, essa può contenere posizioni di riferimento distanti da quelle recenti, aumentando il rischio di *page fault*.
  • Diverse dimensioni di pagina forniscono una maggiore flessibilità nell'uso del TLB.
  • Le pagine più grandi possono essere assegnate alle istruzioni del programma.
  • Le pagine di piccole dimensioni possono essere assegnate allo *stack* di un *thread*.

Segmentazione

  • La segmentazione consente allo sviluppatore di considerare la memoria come se fosse composta da spazi di indirizzi multipli.
  • I segmenti possono essere di diverse dimensioni, anche in modo dinamico.
  • Gli indirizzi di memoria sono costituiti dal numero del segmento e dallo *spostamento* (offset).
  • Semplifica la gestione di strutture dati in crescita.
  • Consente di modificare e ricompilare i segmenti del programma in modo indipendente.
  • Consente la condivisione di dati tra processi.
  • Permette la protezione.

Tabella dei Segmenti

  • Ogni voce della tabella contiene l'indirizzo iniziale del segmento in memoria principale e la sua lunghezza.
  • Contiene un **bit** che indica se il segmento è già nella memoria principale (bit di presenza).
  • Contiene un **bit** che indica se il segmento è stato modificato da quando è stato caricato in memoria principale (bit di modifica).
  • Contiene altri bit di controllo: protezione e condivisione.

Combinazione di Paginazione e Segmentazione

  • Sfruttando i vantaggi di paginazione e segmentazione.
    • Ogni segmento può essere diviso in pagine di dimensione fissa.
    • Associata a ogni processo c'è una tabella dei segmenti e diverse tabelle delle pagine.

Protezione e Condivisione della Memoria

  • Utilizzo di un sistema basato su *anelli* di protezione (Rings).
  • Gli anelli interni hanno più privilegi.
  • Un programma può accedere ai dati solo degli anelli con privilegi uguali o inferiori.
  • Un programma può effettuare chiamate a servizi che si trovano sullo stesso anello o su anelli con privilegi superiori.

Politiche del Sistema Operativo per la Memoria Virtuale

La progettazione della gestione della memoria in un sistema operativo dipende da tre aree:

  • Se vengono utilizzate o meno tecniche di memoria virtuale.
  • L'uso combinato di segmentazione e paginazione.
  • Gli algoritmi per la gestione della memoria.

Le prime due voci dipendono dalla piattaforma hardware disponibile. Il terzo punto è di competenza del software del sistema operativo.

Algoritmi per la Gestione della Memoria

  • Performance: l'obiettivo è minimizzare il *page fault* (errore di memoria).
    • Un difetto di memoria comporta un *overhead* del software.

Il sistema operativo deve:

  • Sostituire le pagine.
  • Pianificare un altro processo per l'esecuzione.
  • La probabilità di riferirsi a una pagina mancante deve essere minima.

Politica di Caricamento (Fetch Policy)

  • Riguarda la decisione su quando caricare una pagina in memoria principale.
    • **Demand Paging** (Paginazione a Richiesta)

La pagina viene portata in memoria solo quando si fa riferimento a una posizione al suo interno.

Quando un processo viene eseguito per la prima volta, ci saranno molti *page fault*.

  • **Prepaging** (Caricamento Anticipato)

Vengono caricate pagine diverse da quelle richieste a causa di un *page fault*.

Se le pagine sono caricate in sequenza, è più efficiente portare in memoria un blocco di pagine contigue dalla memoria secondaria.

  • Il *prepaging* non deve essere confuso con lo *swapping*. Quando un processo viene scaricato dalla memoria e passa allo stato sospeso, tutte le pagine residenti vengono rimosse.

Politica di Posizionamento (Placement Policy)

  • Determina dove le parti del processo devono risiedere in memoria principale.
  • Per la segmentazione pura: *best fit*, *first fit* e *next fit*.
  • Nella combinazione di segmentazione con paginazione, la posizione è irrilevante.

Politica di Sostituzione (Replacement Policy)

  • Selezione della pagina da sostituire durante il caricamento di una nuova pagina.
  • Obiettivo: Sostituire la pagina che ha la minore probabilità di essere referenziata nel prossimo futuro.
  • Si cerca di prevedere il futuro basandosi sul passato.

Blocco del Frame (Frame Locking)

  • Restrizione alla politica di sostituzione.
    • Quando un *frame* è bloccato, la pagina caricata al suo interno non può essere sostituita.
  • Il sistema operativo di base e le strutture di controllo fondamentali risiedono in *frame* bloccati.
  • Un **bit** di blocco è associato a ogni *frame*.

Algoritmi di Sostituzione

  • **Politica Ottimale (OPT)**
    • Seleziona per la sostituzione la pagina che dovrà attendere il maggior tempo prima di essere referenziata nuovamente.
    • Il sistema operativo richiede una precisa conoscenza di eventi futuri.
    • Viene utilizzato come standard per confrontare altri algoritmi.
  • **Politica LRU** (*Least Recently Used*)
    • Sostituisce la pagina che non è stata referenziata per il maggior tempo.
    • Secondo il principio di località, è la pagina che avrà meno probabilità di essere referenziata nel prossimo futuro.
    • L'implementazione richiede di etichettare ogni pagina al momento del suo ultimo riferimento, il che comporta un *overhead*.
  • **Politica FIFO** (*First-In, First-Out*)
    • Tratta i *frame* assegnati a un processo come un buffer circolare.
    • Le pagine vengono rimosse dalla memoria secondo la tecnica del sistema di rotazione.
    • Semplice da implementare.
    • Obiettivo: sostituire la pagina che è stata in memoria per il tempo più lungo.
    • Ampiamente usato per i dati che vengono caricati più volte ed espulsi.
  • **Politica Clock (Second Chance)**
    • Richiede un **bit** aggiuntivo associato a ciascun *frame*, chiamato **bit di utilizzo** (Use Bit).
    • Quando una pagina viene caricata per la prima volta in un *frame*, il bit di utilizzo viene azzerato (0).
    • Quando si fa riferimento alla pagina, il bit viene impostato a 1.
    • Quando è il momento di sostituire una pagina, il primo *frame* incontrato con il bit di utilizzo a 0 viene sostituito.
    • Durante la ricerca, ogni bit di utilizzo che è 1 viene modificato a 0.
  • **Buffer delle Pagine**
    • Utilizza il criterio FIFO.
    • La pagina sostituita viene assegnata a una delle due liste:
  • Pagine Libere (se non sono state modificate).
  • Pagine Modificate (*Dirty Pages*).

La pagina non viene fisicamente spostata dalla memoria principale, ma viene eliminata solo la sua voce nella tabella delle pagine.

Gestione del Set Residente

Dimensione del Set Residente

  • Il sistema operativo deve decidere la quantità di memoria principale da allocare a un certo processo.

Più basso è il numero di *frame* assegnati a un processo, maggiore è il numero di processi che possono risiedere in memoria principale.

Se c'è un piccolo numero di pagine, il tasso di *page fault* è maggiore.

L'allocazione di memoria aggiuntiva a un particolare processo non avrà effetti rilevanti sulla percentuale di errori di pagina (oltre un certo limite).

Allocazione Fissa

  • Assegna al processo un determinato numero di *frame*.
  • Se si verifica un *page fault*, è necessario sostituire una pagina del processo stesso.

Allocazione Variabile

  • Permette che il numero di *frame* assegnati cambi dinamicamente.
  • Nel caso in cui si verifichino molti *page fault*, verranno assegnati più *frame*.

Ambito della Sostituzione (Scope)

  • L'ambito di una strategia di sostituzione può essere classificato in globale o locale.
    • **Globale**: Considera tutte le pagine in memoria come candidate alla sostituzione.
    • **Locale**: Considera solo le pagine del processo che ha causato il *page fault*.

Controllo del Carico (Load Control)

  • Determina il numero di processi che possono risiedere in memoria principale (grado di multiprogrammazione).
  • Se ci sono pochi processi in memoria, a volte possono essere tutti bloccati e si passa molto tempo nello *swapping*.
  • D'altra parte, se ci sono troppi processi in memoria, aumentano le possibilità di *page fault*. Il risultato è il *thrashing*.

Sospensione del Processo (Process Suspension)

  • Se si vuole ridurre il grado di multiprogrammazione, è necessario sospendere uno o più processi residenti in memoria principale.
    • Processi con priorità più bassa.
    • Processi con frequenti *page fault*.
    • Ultimo processo attivato.
    • Processo con il set residente più piccolo.
    • Il processo più vecchio.
    • Processo con il maggior tempo residuo (tempo rimanente).

Riepilogo dei Vantaggi della Memoria Virtuale

  • Migliore utilizzo del processore.
  • Rimuove la limitazione delle dimensioni nello sviluppo del software.
  • Traduzione degli indirizzi logici in indirizzi fisici durante l'esecuzione.

Questo permette ai processi di essere in qualsiasi posizione di memoria principale e la posizione cambia nel tempo.

  • Divisione di un processo in frammenti (pagine/segmenti).

Non è necessario che i frammenti siano contigui.

Non è necessario che tutti i frammenti siano in memoria principale.

  • Gli approcci di base sono la paginazione e la segmentazione della memoria virtuale.
  • Un sistema di gestione della memoria richiede il supporto hardware e software.
    • **Hardware**: Fornito dal processore.

Traduzione degli Indirizzi Virtuali

Generazione di un interrupt in caso di *page fault*.

  • **Software**: Algoritmi per la gestione della memoria.
  • Problemi di progettazione relativi ai sistemi operativi che forniscono supporto per la gestione della memoria:
    • Politica di Caricamento (Fetch Policy)
    • Politica di Posizionamento (Placement Policy)
    • Politica di Sostituzione (Replacement Policy)
    • Gestione del Set Residente
    • Politica di Scarico
    • Controllo del Carico (Load Control)

Voci correlate: