Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

GESTIONE DELLA MEMORIA: LA MEMORIA VIRTUALE

informatica



GESTIONE DELLA MEMORIA: LA MEMORIA VIRTUALE


Questa tecnica può essere applicata sia nell'ambito di una memoria paginata, sia nell'ambito di una memoria segmentata. Noi esamineremo in particolare la tecnica della memoria virtuale applicata alla paginazione.


La memoria (segmentata o paginata che sia) non coincide più con la RAM ma risulta essere fisicamente allocata sulla memoria di massa; solo un sottoinsieme di questa memoria rimane nella RAM. Durante l'esecuzione di un processo, può accadere che lo stesso abbia bisogno di accedere ad una particolare pagina residente non nella RAM ma sul disco; in questo caso il SO deve prevedere un meccanismo automatico che effettui l'arresto del processo, l'ingresso della pagina mancante in memoria e la ripresa del processo, il tutto in maniera completamente trasparente rispetto all'utente.



Un'area più o meno vasta del disco viene dunque ad essere la vera e propria memoria del sistema. Tale zona è concett 848h72i ualmente del tutto distinta dal File System, sebbene alcuni moderni SO la includano al suo interno. In fase di caricamento di un generico processo, esso viene caricato in questa area del disco. Naturalmente però perché il programma possa essere eseguito è indispensabile che le sue istruzioni siano caricate sempre e comunque dalla memoria RAM (ci riferiamo alla fase FETCH); è questo il motivo fondamentale per cui un sottoinsieme della memoria deve trovarsi sempre in RAM. In teoria, sarebbe sufficiente che nella memoria RAM fosse presente la sola istruzione corrente (che cambia di volta in volta) e i dati su cui essa opera. Supponendo di usare la tecnica della paginazione, possiamo più ragionevolmente affermare che tutte le pagine risiedono sul disco, fuorché un sottoinsieme minimo che si trova in RAM; ogni volta che occorre, una intera pagina viene spostata dal disco alla memoria e viceversa.

Anche in questo caso avremo uno spazio logico di indirizzi, ed uno fisico. All'atto della generazione (mapping) dell'indirizzo fisico, può accadere che la pagina logica riferita dall'istruzione su cui stiamo lavorando sia inesistente. In questo caso il meccanismo di traduzione fallisce. Il processo viene allora sospeso e parte il meccanismo di sostituzione, che porta all'interno della memoria la pagina opportuna.

Al solito, l'indirizzo logico può essere quello di un dato oppure di una istruzione, come nell'esempio dell'istruzione di salto (ad un'altra istruzione) jump 1000. Consideriamo quest'ultimo caso. Si può pensare di effettuare il mapping soltanto all'atto dell'accesso in memoria (FETCH riferita all'istruzione memorizzata nell'indirizzo 1000). Nel PC viene ad essere caricato l'indirizzo logico 1000 (si carica dunque nel PC un indirizzo logico, anziché fisico). In questo caso la trap che segnala l'impossibilità di trovare la pagina richiesta viene innescata quindi in fase di FETCH. Se invece la corrispondenza indirizzo logico - fisico viene fatto prima di caricare il PC, l'eventuale trap sarà innescata preventivamente in fase di EXECUTE (EXECUTE riferita all'istruzione jump 1000).



500 jump 1000    1000: nop

TRAP : indirizzo inesistente

 
FETCH    FETCH

OPERAND ASSEMBLY OPERAND ASSEMBLY

TRAP : indirizzo inesistente

 
EXECUTE  EXECUTE




Notiamo che in questo caso la trap (detta di page fault) non provoca un abort del processo, bensì il travaso di una pagina dalla memoria di massa alla RAM o viceversa. Naturalmente è possibile che questo travaso, chiamiamolo (per pura comodità) Swap in, comporti preventivamente un trasferimento inverso, ovvero uno Swap out da RAM a disco, perché potrebbe non esserci memoria RAM a sufficienza per effettuare il solo Swap in. Il trasferimento che abbiamo denominato Swap out può essere fatto subito prima dello Swap in o in un altro precedente momento. Alcune macchina lavorano 'a pagine libere', altre 'a pagine piene'. Il secondo sistema prevede che una frame passi dalla RAM al disco ogni volta che le esigenze del programma richiedano che un'altra pagina effettui il trasferimento opposto. Si parla allora di lazy swapping (swapping 'pigro') o di paginazione su richiesta. Nel primo caso, invece, c'è sempre una altissima probabilità di trovare dello spazio libero, perché il sistema opera lo Swap out non all'atto dello Swap in ma periodicamente. Ad esempio, UNIX costruisce un 'serbatoio di pagine libere' mediante un'interruzione periodica.

Indipendentemente dal criterio adottato, saranno necessari degli opportuni algoritmi per selezionare le pagine da trasferire su disco. Da notare che lo swap out delle pagine fisiche può anche essere evitato: ci si può limitare in certi casi a sovrascrivere un frame giù occupato da un altro processo grazie al criterio dell'avvenuta modifica. Ad ogni frame si associa un bit di modifica che, inizializzato a zero, viene posto a 1 nel momento in cui si scrive nella pagina una sia pur minima informazione. Se il bit di modifica di un frame è zero, vuol dire che quella pagina non è stata mai modificata; essa è identica alla copia che risiede sul disco, e pertanto è inutile effettuare lo swap out.


Vediamo ora come avviene la traduzione degli indirizzi. Il procedimento è simile a quello della paginazione: occorre una tabella delle pagine. Di nuovo, una parte di quest'ultima si trova in memoria associativa. L'indirizzo di pagina fisica viene ricercato nella memoria associativa e parallelamente il registro speciale effettua la sua ricerca nella tabella completa residente in memoria, come indicato in precedenza. La tabella presenta però una struttura leggermente diversa. In particolare, un apposito bit di validità specifica se la corrispondente pagina logica è 'valida' o meno. Che una pagina logica sia considerata non valida significa che ad essa non corrisponde alcuna pagina fisica (cfr. fig. pagina seguente). Se il bit di validità non è 'okay' si genera una trap di page fault; interviene il kernel che effettua il demand paging, ovvero il travaso dalla memoria di massa della pagina richiesta [1]. Si potrebbe scegliere di memorizzare l'indirizzo della pagina su disco nella stessa tabella delle pagine.













 











 















Ovviamente, può ancora presentarsi il caso che l'indirizzo logico sia del tutto illegale, nel senso che ad esso corrisponde una locazione di memoria che è al di fuori della tabella delle pagine. (In altre parole, a quell'indirizzo logico non corrisponde alcuna pagina fisica). Di questa situazione si occupa il solito registro di controllo fence, che fissa il limite della tabella delle pagine. Si può quindi generare una trap di indirizzo scorretto (anziché di page fault), con conseguente abort del processo, nel caso in cui si tenti di accedere ad una pagina di indirizzo logico maggiore del consentito.

Il supporto hardware di un sistema a memoria virtuale deve realizzare nel modo più semplice ed efficiente possibile tutte questi meccanismi.

Un'ultima osservazione, prima di chiudere la lezione. Abbiamo detto che il meccanismo di sostituzione di una pagina residente in memoria con una del disco parte per effetto del fallimento di un'operazione di traduzione indirizzi. Il programma deve essere temporaneamente sospeso, per ripartire (a sostituzione avvenuta) dall'istruzione che ha provocato quella sospensione. Si noti per inciso che se l'interruzione si è verificata in fase di OPERAND ASSEMBLY, in occasione della successiva ripartenza occorre ripetere anche il precedente prelievo dell'istruzione (FETCH). Questo genera dei comprensibili problemi per quelle particolari istruzioni che modificano molte variabili in memoria. Il Silberschatz-Galvin propone (pag. 288) l'esempio dell'istruzione macchina MVC che consente di spostare fino a 256 byte per volta da un punto all'altro della memoria. Potrebbe darsi che uno dei blocchi di origine o destinazione fuoriesca dal confine di una pagina, generando una page fault e costringendo a ricominciare daccapo il trasferimento. Inoltre, MVC consente anche di sovrapporre i due blocchi, e se effettivamente si verifica una sovrapposizione del blocco destinazione sul blocco origine evidentemente non ci si può limitare a riavviare l'istruzione. Problemi come questo devono essere prevenuti in fase di progetto del processore. Ad esempio, si possono utilizzare dei registri temporanei di memoria per conservare i valori delle locazioni sovrascritte. In caso di page fault e subito prima che si verifichi la corrispondente trap, tutti i vecchi valori vengono risistemati nel blocco origine.




Nel Silberschatz-Galvin (pag.283 sgg) si afferma che il bit di validità segnala anche la condizione di 'indirizzo illecito' (non corrispondente ad una pagina fisica accessibile al processo). Pertanto, tale bit può essere 'non okay' per due diversi motivi: indirizzo illecito, pagina residente su disco (sarà poi il SO a discriminare fra i due casi). De Carlini non ha menzionato questo aspetto durante la lezione. La figura di pagina 179 è stata modificata (rispetto a quella del libro, che sta a pag.285) in base alla spiegazione di De Carlini.






Privacy




Articolo informazione


Hits: 1893
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024