# Gestore della memoria

In informatica il gestore della memoria (memory manager in inglese) è un componente del sistema operativo dedicato alla gestione della memoria primaria disponibile sul computer. Il gestore si preoccupa di allocare, deallocare e gestire la memoria che viene assegnata agli applicativi e allo stesso sistema operativo.

## Descrizione

Tutti i moderni sistemi operativi sono dotati di memoria virtuale. Il gestore della memoria si preoccupa di decidere quali blocchi di memoria sono poco utilizzati dal sistema e quindi possono essere spostati sull'unità a disco senza deprimere eccessivamente le prestazioni del sistema.
Altri compiti molto importanti di questo modulo sono:

### garantire la protezione

    poiché in memoria possono risiedere contemporaneamente processi utente e moduli sistema, è necessario evitare che, per qualsiasi malfunzionamento, dati o istruzioni di un processo possano sovrapporsi a quelle del supervisore o di un altro processo utente, creando situazioni anomale e spesso disastrose

### garantire trasparenza

    l'operazione di allocazione deve essere invisibile al processo, il cui avanzamento deve essere indipendente dalla posizione dello spazio degli indirizzi assegnati dalla memoria. Ciò consente di rimandare in stato di disponibilità un processo e successivamente ricaricarlo in memoria in un'altra area, senza che il fatto sia di alcun impedimento al suo avanzamento

### garantire allocazione logica

    in generale l'immagine di un processo è logicamente composta da sezioni (codice e dati) che, anche se fisicamente poste in aree disgiunte di memoria, devono essere viste dal processo come contigue

### consentire la condivisione del codice

    in un sistema multiprogrammato, più utenti possono utilizzare contemporaneamente gli stessi programmi quindi occorre un sistema che permetta di condividere il codice (gli applicativi software) ma di tenere separati i dati.

### Tipi di allocazione

L'allocazione a singola partizione prevede che la memoria centrale venga suddivisa in due partizioni principali:
* una relativa al sistema operativo (kernel space)
* una relativa allo spazio per i programmi degli utenti (spazio utente)
Questa tecnica non è però mai stata presa in forte considerazione poiché permette di far caricare in memoria un solo programma, oltre al sistema operativo. Già dai primi sistemi si è pensato di introdurre delle partizioni anche nello user space. Una prima soluzione fu quella delle partizioni fisse o statiche.
Con questa tecnica, lo user space veniva diviso in un numero prefissato di partizioni, di uguale dimensione o di dimensioni diverse e ad ogni processo viene assegnato, in modo esclusivo, una partizione. Anche questa tecnica presenta forti limiti. Infatti, lo spazio lasciato libero da un processo non potrà mai essere utilizzato da altri, rimanendo inutilizzato. Nel contempo, processi più pesanti della partizione più ampia non possono essere caricati e quindi eseguiti.
Successivamente, si è pensato di modificare questa tecnica creando delle partizioni dinamiche. In questa organizzazione, non esistono partizioni di dimensioni predefinite; nuove partizioni vengono create in base alla richiesta dei processi, prelevandole da una tabella delle partizioni di memoria libere. Se esistono due partizioni libere attigue vengono fuse in un'unica partizione. In pratica, all'arrivo di un processo di una certa dimensione, viene caricato in memoria in una partizione libera, ma lo spazio che avrà lasciato potrà essere usato da un altro processo.
Per decidere la partizione in cui un processo sarà caricato, esistono tre strategie: la first fit, la best fit e la worst fit. La strategia first fit mette il processo nella prima partizione libera in memoria centrale grande abbastanza per contenerlo. Questa strategia può però lasciare dei frammenti, ovvero parti di memoria non utilizzata, piuttosto numerosi. La strategia best fit prevede che il nuovo processo venga inserito nella partizione con dimensione più vicina alla dimensione del processo. In questo modo, si tende a lasciare frammenti sempre più piccoli. L'ultima strategia, la worst fit, è invece meglio funzionante. Essa prevede che il nuovo processo venga allocato nella partizione di memoria più grande disponibile. Questo è giustificato dal fatto che nei frammenti lasciati, che saranno di grandi dimensioni, potranno essere allocati altri processi.

### La memoria virtuale

Con il passare del tempo, tuttavia, i processi da eseguire diventavano sempre più pesanti e le memorie centrali non bastavano più a contenerli. È nata dunque la memoria virtuale, ossia uno spazio di memoria di massa che viene utilizzato come se fosse una parte della memoria centrale. Essa può essere allocata in una partizione del disco fisso dedicata a questo, come avviene con la swap in Linux, oppure può essere una parte della partizione del sistema operativo, come succede in Windows con il file di paging. Con l'avvento della memoria virtuale sono state ideate altre due tecniche che permettono di sfruttare al meglio questa tecnica: la paginazione e la segmentazione.
Secondo la tecnica della paginazione, la memoria centrale, compresa anche quella virtuale, è divisa in blocchi di uguale dimensioni, solitamente abbastanza piccole, mentre i processi in arrivo vengono divisi in pagine della stessa dimensione dei blocchi. In questo modo, il processo viene allocato in diversi blocchi che, per la prima volta, possono essere anche non contigui. Se una pagina di cui si ha bisogno per l'elaborazione è caricata in memoria virtuale, essa viene spostata in memoria centrale. nel caso non ci siano pagine libere, viene presa una pagina caricata in memoria centrale e scambiata con quella da usare. Quest'operazione è chiamata di swapping.