La parte del sistema operativo che gestisce la memory hierarchy è chiamato il memory manager. Il suo lavoro è quello di gestire efficientemente la memoria: tenere traccia di quali parti della memoria sono in utilizzo, allocare memoria ai processi quando ne hanno bisogno, e deallocarla quando hanno fatto.

No Memory Abstraction

Il modo più semplice di astrarre la memoria, è quello di non avere astrazioni. Ogni programma vede la memoria fisica.

Anche se il modello della memoria è la memoria fisica, ci sono diverse opzioni disponibili.

image.png

Il sistema operativo potrebbe trovarsi alla fine della memoria nella RAM (a), o potrebbe trovarsi nella ROM in cima alla memoria (b), o i drivers potrebbero trovarsi in cima della memoria in una ROM e il resto del sistema nella RAM al di sotto (c).

Il terzo modello veniva utilizzato dai primi personal computers, dove la porzione del sistema nella ROM viene chiamata BIOS (Basic Input Output System)

Un modo per ottenere parallelismo senza astrazione è quello di creare diversi threads.

Running Multiple Programs Without a Memory Abstraction

Anche senza astrazione è possibile eseguire diversi programmi nello stesso istante. Il sistema operativo deve salvare l’intero contenuto della memoria in un disk file, poi prendere ed eseguire il programma successivo. Finchè c’è solo un programma in memoria non ci sono conflitti.

image.png

Abbiamo due programmi, ognuno di 16KB (a),(b). Il primo è più scuro per indicare che ha una chiave di memoria differente del secondo. Il primo programma inizia andando all’indirizzo 24, il quale contiene una istruzione MOV. Il secondo programma inizia andando nell’indirizzo 28, il quale contiene un’istruzione CMP. Le istruzioni non sono rilevanti. Quando due programmi sono caricati consecutivamente in memoria iniziando dall’indirizzo 0, abbiamo la situazione (c). Assumiamo che il sistema operativo è in alto nella memoria e quindi non viene mostrato.

Dopo che i programmi vengono caricati, possono essere eseguiti. Dato che hanno diverse chiavi di memoria, nessuno può danneggiarsi a vicenda. Ma il problema è un altro. Quando il primo programma inizia, esegue il JMP 24, il quale va alla istruzione come atteso. Questo programma funziona normalmente

Tuttavia, dopo che il primo programma viene eseguito abbastanza, il sistema operativo decide di eseguire il secondo programma, il quale è stato caricato sopra al primo. La prima istruzione eseguita è JMP 28, il quale va all’istruzione ADD nel primo programma, invece che alla CMP come supposto. Il programma crasherà subito.

Ciò che vogliamo è che ogni programma può avere come reference un set privato di indirizzi locali ad esso

A Memory Abstraction: Address Spaces

The Notion of an Address Space

Devono essere risolti due problemi per permettere a più applicazioni di essere in memoria allo stesso momento senza interferire tra loro: protection e relocation.

Una buona soluzione è quella di inventare una nuova astrazione della memoria: lo address space. Proprio come il concetto del processo che crea una specie di CPU astratta per eseguire programmi, l’address space crea una specie di memoria astratta per i programmi in cui vivere.

<aside> ℹ️

L’address space è un insieme di indirizzi che un processo può usare per indirizzare la memoria. Ogni processo ha il suo address space, indipendente da quelli degli altri processi (ad eccezione di alcune circostanze dove i processi vogliono condividere il loro address space)

</aside>