venerdì 5 marzo 2010

Memoria Virtuale

Memoria Virtuale.
Le tecniche di gestione della memoria prevedono la suddivisione degli spazi fisici e logici dei processi per conservarli in memoria centrale in modo da migliorare efficientemente la multiprogrammazione lavorando pero' sugli spazi logici, e' possibile evitare di dover tenere un processo completamente in memoria e trarne diversi vantaggi.
Infatti e' possibile eseguire un processo che non e' caricato completamente poiche' il codice potrebbe contenere riferimenti a routines di gestione di errori che verrebbero richiamate di rado, oppure verrebbero utilizzate variabili che occupano spazi inutilizzati, come array di dimensione esagerate rispetto all'utilizzo necessario.
I vantaggi che riguardano un caricamento parziale di un processo sono stimabili in termini di spazio, poiche' meno frame fisici sono utilizzati, quindi occupati. Un secondo vantaggio e' il grado di multiprogrammazione, possono essere tenuti piu' programmi in memoria visto che occuerebbero meno, ed infine il sistema sarebbe piu' veloce, poiche' ci sarebbero meno operazioni di i/o per caricare un programma utente (meno pagine logiche!).
Nella tecnica di memoria virtuale lo swapping, la tecnica che prevede di caricare processi in memoria centrale dalla memoria secondaria e viceversa, viene sostituito con il lazy swapping, che carica solo alcune pagine logiche del processo.
Il pager e' il modulo che affronta questo tipo di lavoro.
Un processo, per come e' strutturato, puo' infatti sugerire al pager quali pagine caricare e di quali routine, librerie e funzioni ha bisogno per essere eseguito.
Questo puo' essere ben compreso attraverso lo spazio degli indirizzi, un'espressione che fa riferimento al modo di memorizzazione logica, quindi apparentemente contigua, di un processo.
Parte da un determinato indirizzo, e presenta un segmento dedicato al codice, uno dedicato ai dati, poi heap e stack, ma tra questi ultimi c'e' uno spazio che permette all'heap e allo stack di crescere.
Questo spazio libero necessita di pagine fisiche, quindi frames, solo se l'heap o lo stack crescono.
La funzione del buco e' sia di lasciare spazio ai segmenti adiacenti (come gia' detto heap e stack) ma anche di permettere collegamenti dinamici a librerie che il processo potrebbe richiedere all'istante.
Quindi e' un punto di forza per la condivisione della memoria, sia per le librerie che per l'ipc.

Il pager carica solo le pagine necessarie.
Per identificarle, nella page table di ogni processo queste sono segnate come "valide", ossia che appartengono allo spazio di indirizzi logici e sono presenti in memoria.
Un processo nell'esecuzione richiede accesso alle pagine, se il riferimento in memoria non e' valido il processo termina, altrimenti la pagina deve essere caricata.
Un accesso a pagina mancante si chiama PAGE FAULT.
Quindi si individua un frame libero, si aggiornano le tabelle e continua l'esecuzione.
Cosa accade se non c'e' un frame libero? In questo caso si parla di sostituzione, ossia si scegli un frame vittima, si scrive la pagina richiesta nel frame, si modificano le tabelle delle pagine e si prosegue con l'esecuzione.
Quindi si hanno due cambiamenti di pagine, nel frame e nella memoria.
Si puo' evitare associando un bit (dirty bit) ad un apagina, che segnala che quella pagina e' stata modificata, quindi deve essere scritta sul disco.
Gli algoritmi di sostituzione delle pagine si basano sulla frequenza di page fault. Si studiano in base a successioni di riferimenti che si ottengono attraverso successioni di numeri casuali.
Un primo algoritmo e' affrontare la successione calcolando il numero di page fault tramite la sostituzione di pagine in modo FIFO, un secondo algoritmo e' la sostituzione ottimale, per il quale si sostituisce la pagina mancante con quella che non si iusera' per il periodo piu' lungo.
Ma non e' realizzabile, poiche' dovrebbe essere noto l'utilizzo futuro delle pagine.
L'LRU invece, usa sostituire la pagina con quella che non e' stata usata per il tempo piu' lungo.

Sono poche le architetture che sfruttano un algoritmo di sostituzione LRU, ma puo' essere approssimato, ad esempio un algoritmo FIFO puo' essere aiutato da un bit di riferimento nel seguente modo:
inizialmente tutte le pagine hanno un bit impostato a zero, quando il sistema fa riferimenteo ad una pagina imposta il bit a 1, in modo tale che in ogni istante si conoscono le pagine utilizzate. Tuttavia non si puo' conoscere l'ordine in cui sono state utilizzate.

Nessun commento:

How to deploy Podman images to OpenShift Container Platform (CRC on localhost)

I have a microservice on localhost and I want to deploy its Podman image on OCP, which I am running using CRC on localhost.       1. Get the...