Sistema operativo - Gestione della memoria

La gestione della memoria è la funzionalità di un sistema operativo che gestisce o gestisce la memoria primaria e sposta i processi avanti e indietro tra la memoria principale e il disco durante l'esecuzione. La gestione della memoria tiene traccia di ogni singola posizione di memoria, indipendentemente dal fatto che sia assegnata a un processo o che sia gratuita. Controlla la quantità di memoria da allocare ai processi. Decide quale processo otterrà la memoria a che ora. Tiene traccia ogni volta che una parte della memoria viene liberata o non allocata e di conseguenza aggiorna lo stato.

Questo tutorial ti insegnerà i concetti di base relativi alla gestione della memoria.

Spazio degli indirizzi del processo

Lo spazio degli indirizzi del processo è l'insieme di indirizzi logici a cui fa riferimento un processo nel proprio codice. Ad esempio, quando si utilizza l'indirizzamento a 32 bit, gli indirizzi possono variare da 0 a 0x7fffffff; ovvero 2 ^ 31 numeri possibili, per una dimensione teorica totale di 2 gigabyte.

Il sistema operativo si occupa di mappare gli indirizzi logici agli indirizzi fisici al momento dell'allocazione della memoria al programma. Esistono tre tipi di indirizzi utilizzati in un programma prima e dopo l'allocazione della memoria:

SN Indirizzi di memoria e descrizione
1

Symbolic addresses

Gli indirizzi utilizzati in un codice sorgente. I nomi delle variabili, le costanti e le etichette delle istruzioni sono gli elementi di base dello spazio degli indirizzi simbolici.

2

Relative addresses

Al momento della compilazione, un compilatore converte gli indirizzi simbolici in indirizzi relativi.

3

Physical addresses

Il caricatore genera questi indirizzi nel momento in cui un programma viene caricato nella memoria principale.

Gli indirizzi virtuali e fisici sono gli stessi negli schemi di associazione degli indirizzi in fase di compilazione e in fase di caricamento. Gli indirizzi virtuali e fisici differiscono nello schema di associazione degli indirizzi in fase di esecuzione.

L'insieme di tutti gli indirizzi logici generati da un programma è indicato come a logical address space. L'insieme di tutti gli indirizzi fisici corrispondenti a questi indirizzi logici è denominato aphysical address space.

La mappatura del runtime dall'indirizzo virtuale a quello fisico viene eseguita dall'unità di gestione della memoria (MMU) che è un dispositivo hardware. MMU utilizza il seguente meccanismo per convertire l'indirizzo virtuale in indirizzo fisico.

  • Il valore nel registro di base viene aggiunto a ogni indirizzo generato da un processo utente, che viene trattato come offset nel momento in cui viene inviato in memoria. Ad esempio, se il valore del registro di base è 10000, un tentativo da parte dell'utente di utilizzare la posizione dell'indirizzo 100 verrà riallocato dinamicamente alla posizione 10100.

  • Il programma utente si occupa di indirizzi virtuali; non vede mai i veri indirizzi fisici.

Caricamento statico vs dinamico

La scelta tra caricamento statico o dinamico deve essere effettuata al momento dello sviluppo del programma per computer. Se devi caricare il tuo programma in modo statico, al momento della compilazione, i programmi completi verranno compilati e collegati senza lasciare alcun programma esterno o dipendenza dal modulo. Il linker combina il programma oggetto con altri moduli oggetto necessari in un programma assoluto, che include anche indirizzi logici.

Se stai scrivendo un programma caricato dinamicamente, il tuo compilatore compilerà il programma e per tutti i moduli che desideri includere dinamicamente, verranno forniti solo i riferimenti e il resto del lavoro verrà svolto al momento dell'esecuzione.

Al momento del caricamento, con static loading, il programma assoluto (ei dati) vengono caricati in memoria per avviare l'esecuzione.

Se stai usando dynamic loading, le routine dinamiche della libreria vengono archiviate su un disco in forma rilocabile e vengono caricate in memoria solo quando sono necessarie al programma.

Collegamento statico vs dinamico

Come spiegato sopra, quando viene utilizzato il collegamento statico, il linker combina tutti gli altri moduli necessari a un programma in un unico programma eseguibile per evitare qualsiasi dipendenza dal runtime.

Quando viene utilizzato il collegamento dinamico, non è necessario collegare il modulo o la libreria effettivi con il programma, piuttosto viene fornito un riferimento al modulo dinamico al momento della compilazione e del collegamento. Le librerie di collegamento dinamico (DLL) in Windows e gli oggetti condivisi in Unix sono buoni esempi di librerie dinamiche.

Scambio

Lo scambio è un meccanismo in cui un processo può essere scambiato temporaneamente dalla memoria principale (o spostato) nella memoria secondaria (disco) e rendere tale memoria disponibile per altri processi. In un secondo momento, il sistema ripristina il processo dalla memoria secondaria alla memoria principale.

Sebbene le prestazioni siano generalmente influenzate dal processo di scambio, aiuta a eseguire più e grandi processi in parallelo e questo è il motivo Swapping is also known as a technique for memory compaction.

Il tempo totale impiegato dal processo di scambio include il tempo necessario per spostare l'intero processo su un disco secondario e quindi per copiarlo di nuovo in memoria, nonché il tempo impiegato dal processo per recuperare la memoria principale.

Supponiamo che il processo dell'utente abbia una dimensione di 2048 KB e che su un disco rigido standard in cui verrà eseguito lo scambio abbia una velocità di trasferimento dati di circa 1 MB al secondo. Il trasferimento effettivo del processo 1000K alla o dalla memoria richiederà

2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds

Considerando ora il tempo di entrata e uscita, ci vorranno 4000 millisecondi completi più altre spese generali in cui il processo compete per riguadagnare la memoria principale.

Allocazione della memoria

La memoria principale di solito ha due partizioni:

  • Low Memory - Il sistema operativo risiede in questa memoria.

  • High Memory - I processi utente sono tenuti in una memoria elevata.

Il sistema operativo utilizza il seguente meccanismo di allocazione della memoria.

SN Allocazione e descrizione della memoria
1

Single-partition allocation

In questo tipo di allocazione, lo schema del registro di rilocazione viene utilizzato per proteggere i processi degli utenti l'uno dall'altro e dalla modifica del codice e dei dati del sistema operativo. Il registro di rilocazione contiene il valore dell'indirizzo fisico più piccolo mentre il registro limite contiene un intervallo di indirizzi logici. Ogni indirizzo logico deve essere inferiore al registro limite.

2

Multiple-partition allocation

In questo tipo di allocazione, la memoria principale è suddivisa in un numero di partizioni di dimensioni fisse in cui ciascuna partizione dovrebbe contenere un solo processo. Quando una partizione è libera, un processo viene selezionato dalla coda di input e viene caricato nella partizione libera. Quando il processo termina, la partizione diventa disponibile per un altro processo.

Frammentazione

Quando i processi vengono caricati e rimossi dalla memoria, lo spazio di memoria libero viene suddiviso in piccoli pezzi. A volte succede che i processi non possono essere assegnati ai blocchi di memoria considerando le loro piccole dimensioni e i blocchi di memoria rimangono inutilizzati. Questo problema è noto come frammentazione.

La frammentazione è di due tipi:

SN Frammentazione e descrizione
1

External fragmentation

Lo spazio di memoria totale è sufficiente per soddisfare una richiesta o per risiedervi un processo, ma non è contiguo, quindi non può essere utilizzato.

2

Internal fragmentation

Il blocco di memoria assegnato al processo è più grande. Una parte della memoria viene lasciata inutilizzata, poiché non può essere utilizzata da un altro processo.

Il diagramma seguente mostra come la frammentazione può causare uno spreco di memoria e una tecnica di compattazione può essere utilizzata per creare più memoria libera dalla memoria frammentata -

La frammentazione esterna può essere ridotta mediante la compattazione o il contenuto della memoria casuale per collocare tutta la memoria libera in un unico blocco di grandi dimensioni. Per rendere fattibile la compattazione, il trasferimento dovrebbe essere dinamico.

La frammentazione interna può essere ridotta assegnando efficacemente la partizione più piccola ma abbastanza grande per il processo.

Paging

Un computer può indirizzare più memoria rispetto alla quantità fisicamente installata nel sistema. Questa memoria extra è in realtà chiamata memoria virtuale ed è una sezione di un disco impostato per emulare la RAM del computer. La tecnica di paging gioca un ruolo importante nell'implementazione della memoria virtuale.

Il paging è una tecnica di gestione della memoria in cui lo spazio degli indirizzi del processo viene suddiviso in blocchi chiamati della stessa dimensione pages(la dimensione è una potenza di 2, tra 512 byte e 8192 byte). La dimensione del processo viene misurata nel numero di pagine.

Allo stesso modo, la memoria principale è suddivisa in piccoli blocchi di memoria (fisica) di dimensioni fisse chiamati frames e la dimensione di un frame è mantenuta uguale a quella di una pagina per avere un utilizzo ottimale della memoria principale ed evitare la frammentazione esterna.

Traduzione di indirizzi

Viene chiamato l'indirizzo della pagina logical address e rappresentato da page number e il offset.

Logical Address = Page number + page offset

Viene chiamato l'indirizzo del frame physical address e rappresentato da a frame number e il offset.

Physical Address = Frame number + page offset

Una struttura dati chiamata page map table viene utilizzato per tenere traccia della relazione tra una pagina di un processo e un frame nella memoria fisica.

Quando il sistema assegna un frame a una pagina, traduce questo indirizzo logico in un indirizzo fisico e crea una voce nella tabella delle pagine da utilizzare durante l'esecuzione del programma.

Quando un processo deve essere eseguito, le sue pagine corrispondenti vengono caricate in qualsiasi frame di memoria disponibile. Supponiamo che tu abbia un programma di 8Kb ma la tua memoria possa contenere solo 5Kb in un dato momento, quindi il concetto di paging entrerà in scena. Quando un computer esaurisce la RAM, il sistema operativo (OS) sposta le pagine di memoria inattive o indesiderate nella memoria secondaria per liberare RAM per altri processi e le ripristina quando necessario dal programma.

Questo processo continua durante l'intera esecuzione del programma in cui il sistema operativo continua a rimuovere le pagine inattive dalla memoria principale e le scrive sulla memoria secondaria e le riporta quando richiesto dal programma.

Vantaggi e svantaggi del cercapersone

Ecco un elenco di vantaggi e svantaggi del cercapersone:

  • Il paging riduce la frammentazione esterna, ma soffre ancora di frammentazione interna.

  • Il paging è semplice da implementare e considerato una tecnica di gestione della memoria efficiente.

  • A causa della stessa dimensione delle pagine e dei frame, lo scambio diventa molto facile.

  • La tabella delle pagine richiede spazio di memoria aggiuntivo, quindi potrebbe non essere adatta per un sistema con una piccola RAM.

Segmentazione

La segmentazione è una tecnica di gestione della memoria in cui ogni lavoro è suddiviso in più segmenti di dimensioni diverse, uno per ogni modulo che contiene pezzi che svolgono funzioni correlate. Ogni segmento è in realtà uno spazio di indirizzi logici diverso del programma.

Quando un processo deve essere eseguito, la sua segmentazione corrispondente viene caricata nella memoria non contigua sebbene ogni segmento venga caricato in un blocco contiguo di memoria disponibile.

La gestione della memoria di segmentazione funziona in modo molto simile al paging, ma qui i segmenti sono di lunghezza variabile mentre, come nel paging, le pagine sono di dimensione fissa.

Un segmento di programma contiene la funzione principale del programma, le funzioni di utilità, le strutture di dati e così via. Il sistema operativo mantiene un filesegment map tableper ogni processo e un elenco di blocchi di memoria liberi insieme ai numeri di segmento, la loro dimensione e le posizioni di memoria corrispondenti nella memoria principale. Per ogni segmento, la tabella memorizza l'indirizzo iniziale del segmento e la lunghezza del segmento. Un riferimento a una posizione di memoria include un valore che identifica un segmento e un offset.