Estratto del documento

Lezione 25 662

Abbiamo visto la gestione del processore e la gestione dei processi. Abbiamo visto come il SO garantisca l’esecuzione dei processi andando a virtualizzare sia il processore che la memoria. La virtualizzazione del processore e della memoria vanno nella direzione di semplificare la programmazione.

Il programmatore non dovrà quindi preoccuparsi di allocare il processore e di proteggere ed allocarsi la memoria, sarà il SO che si preoccuperà di virtualizzare il processore e di gestire l’avvicendamento dei processi in modo del tutto trasparente e dovrà preoccuparsi di virtualizzare la memoria in modo che ogni processo abbia uno spazio di indirizzamento e la gestione e la protezione deve essere trasparente ai processi. Vediamo quindi come un SO faccia questa virtualizzazione e come riesca a garantire ad ogni processo un proprio spazio di indirizzamento e nel contempo come riesca a proteggere questo spazio di indirizzamento da accessi illeciti da parte di altri processi.

Per essere eseguito un programma necessita di un processore e di una memoria e quindi per garantire l’esecuzione dei processi un SO ha bisogno di virtualizzare la CPU e la memoria.

Parametri principali per la gestione della memoria

Vediamo quali sono gli aspetti ed i parametri principali per la gestione di una memoria.

Possiamo avere un supporto hardware perché fondamentalmente alcune architetture hardware, come il PC tradizionale danno un supporto hardware alla gestione della memoria. Per quanto riguarda la dimensione della memoria virtuale abbiamo che la memoria virtuale è lo spazio di indirizzamento allocato al processo e in certi SO come quelli che usiamo è possibile che lo spazio di indirizzamento di un processo sia maggiore della dimensione fisica della memoria. Possiamo quindi ammettere nel sistema processi con uno spazio di indirizzamento maggiore di quello della memoria RAM.

Quelli sotto riportati in figura sono gli aspetti caratterizzanti per la gestione della memoria. 663

I parametri che ne derivano dalla gestione della memoria sono la rilocazione che può essere statica e dinamica, per rilocazione intendiamo l’associazione tra gli indirizzi virtuali di un processo e gli indirizzi fisici dove dobbiamo andare ad allocare un processo. L’organizzazione logica della memoria virtuale ci consente di andare ad organizzare uno spazio virtuale in uno spazio virtuale unico/segmentato, con l’organizzazione fisica possiamo andare ad allocare in memoria pezzi di immagine di un processo o tutta l’immagine di un processo e quindi contigua o non contigua, se ammettiamo che lo spazio di indirizzamento di un processo possa essere maggiore della dimensione fisica allora dobbiamo andare a rilassare un vincolo che per essere eseguito un processo deve essere tutto caricato in memoria. 664

Indirizzi logici e indirizzi fisici

Il processo di solito ha un proprio spazio di indirizzamento che inizia dall’indirizzo 0 e finisce all’indirizzo n. Questi indirizzi prendono il nome di indirizzi logici in quanto sono tutti gli indirizzi con il quale lavora il processore, in ogni locazione ci possono essere delle istruzioni. Un processo in qualche modo deve essere allocato in una memoria fisica e quindi abbiamo indirizzamenti logici che devono andare a confluire in indirizzamenti fisici. Lo schema più semplice che possiamo avere è quello per il quale andiamo a prendere tutto il processo e lo andiamo ad allocare in una certa zona di memoria dall’indirizzo che chiameremo ad esempio P fino a P+N, questa prende il nome di allocazione contigua.

Andremo a studiare le varie tecniche di gestione della memoria, queste tecniche ci dicono ad esempio come organizzare l’indirizzamento logico che ad esempio può essere:

  • Contiguo -> il programma viene ad essere allocato in un’unica porzione di memoria o in posizioni contigue di memoria
  • Non contiguo -> il programma viene ad essere allocato in porzioni di memoria ed il programma può essere visto come porzioni di programma che prendono il nome di segmenti

L’organizzazione dell’allocazione fisica è quella che gestisce gli indirizzi fisici e quindi che ci consente di andare ad allocare o in un’unica porzione di memoria o in varie porzioni di memoria.

Sia per l’organizzazione degli indirizzi logici che per l’organizzazione dello spazio fisico abbiamo che possono essere organizzati in modo contiguo o non contiguo e nell’ultimo caso si parla di paginazione. Per gestire alcune tecniche bisogna capire come andare a gestire l’associazione tra indirizzo logico ed indirizzo fisico.

Se abbiamo un programma quello che possiamo fare tipicamente è andare a convertire gli indirizzi logici in indirizzi fisici, se abbiamo chiamato gli indirizzi con P, a tutti gli indirizzi 0 andremo ad associare P mentre a tutti gli indirizzi i dovremmo andare ad associare P+i; P è sostanzialmente una costante di allocazione.

Questa associazione tra indirizzi logici ed indirizzi fisici dobbiamo decidere se farla a tempo di compilazione o a tempo di esecuzione. Se l’andiamo a farla a tempo di compilazione si parlerà di locazione statica e quindi in questo caso abbiamo che la conversione tra indirizzi logici ed indirizzi fisici verrà ad essere fatta una tantum. Se invece l’andiamo a fare a tempo di esecuzione avremo necessità di un supporto hardware e quindi di un supporto che a runtime dato un indirizzo i lo vada a convertire in un indirizzo fisico P+i o in generale un indirizzo f dove sostanzialmente potremmo trovare l’istruzione o il dato a cui si vuole arrivare.

Tutti questi parametri che abbiamo introdotto ci consentono di spiegare quali sono le tecniche più importanti per la gestione della memoria. 665

Tecniche per la gestione della memoria

Le tecniche per la gestione della memoria sono di diverso tipo e sono indicate nella figura sopra con il rettangolo in rosso. Queste tecniche di gestione si differenziano a seconda di che tipo di rilocazione utilizzano e quindi dal metodo in cui gli indirizzi logici vengono ad essere tradotti in indirizzi fisici, che tipo di allocazione fisica utilizzare e quale tipo di organizzazione dello spazio virtuale utilizzare.

Quando ad esempio la rilocazione è dinamica e quindi l’associazione tra indirizzi logici e fisici la facciamo a tempo di esecuzione e l’allocazione in memoria è non contigua abbiamo che tutte le tecniche a disposizione prendono il nome di paginazione. Se lo spazio virtuale è unico e quindi possiamo mettere tutto il processo in memoria abbiamo che questa è la paginazione di tipo classica, se invece ammettiamo che lo spazio di indirizzamento logico è maggiore dello spazio di indirizzamento fisico della nostra memoria RAM abbiamo che la paginazione sarà un tipo di paginazione a domanda (demand paging), con questa tecnica non si intende caricare tutto il processo per l’esecuzione ma solo una parte del processo e questo perché assumiamo che lo spazio di indirizzamento logico sarà così grande che non potrà essere contenuto nella memoria principale. Se lo spazio virtuale non è organizzato come tutto uno e quindi in modo contiguo ma sarà segmentato allora otterremo la segmentazione con paginazione, questa ad esempio è quella che viene ad essere utilizzata dai processori Intel. Se invece l’allocazione in memoria è contigua e quindi non viene ad essere usata la paginazione, possiamo avere solo lo spazio virtuale segmentato.

Lo spazio virtuale tutto unico non è una scelta che viene ad essere adoperata in quanto può portare problemi di frammentazione. Tipicamente viene ad essere usato un tipo di spazio virtuale segmentato dando luogo alla segmentazione là dove carichiamo tutto il processo prima di eseguirlo o una segmentazione a domanda lì dove contempliamo la possibilità di non caricare l’intero processo in memoria ma solo parte di esso e quindi solo alcuni segmenti.

Quando l’allocazione è statica abbiamo che la traduzione tra indirizzi logici e fisici non è fatta a runtime ma a tempo di compilazione e abbiamo che quella che viene ad essere tipicamente utilizzata è un tipo di allocazione contigua; abbiamo che quando lo spazio virtuale è unico si hanno partizioni fisse o variabili, quando lo spazio virtuale è segmentato abbiamo partizioni multiple. 666

Rilocazione statica e dinamica

N.B una domanda che spesso viene ad essere fatta all’esame è che cosa è la rilocazione e perché nel caso di rilocazione dinamica si ha bisogno di un supporto hardware.

La rilocazione abbiamo più volte detto riguarda la traduzione di indirizzi logici in indirizzi fisici, questa traduzione può avvenire in varie fasi; in fase di compilazione come ad esempio accade in vari sistemi a microcontrollore come nelle lavatrici, nelle lavastoviglie abbiamo che non viene ad essere generato codice virtuale e poi c’è un SO che fa la traduzione, in questi casi con il microcontrollore tipicamente abbiamo che già nella fase di compilazione viene ad essere generato un programma con codice assoluto e quindi viene ad essere generato un programma in cui gli indirizzi del programma in linguaggio macchina sono già indirizzi assoluti e quindi indirizzi di memoria. La rilocazione durante la compilazione abbiamo che avviene soltanto in sistemi di nicchia come ad esempio sistemi a microcontrollore dove il compilatore già conosce la mappa di memoria e quindi già sa che indirizzi dovrà andare a produrre.

Una soluzione forse più ricorrente che è adoperata in alcuni sistemi embedded e in alcune schede programmabili è quella con caricamento, la parola caricamento fa intendere che esista un modulo proposto di un SO seppur minimale che sia in grado di prendere il programma eseguibile generato in fase di compilazione e di tradurre gli indirizzi logici in indirizzi fisici, questa traduzione viene ad essere fatta una tantum e quindi all’atto del caricamento il programma avrà i suoi indirizzi fisici e quindi il processore potrà tranquillamente lavorare con gli indirizzi fisici.

Il caricatore è una soluzione più adottata e più flessibile perché è un modulo del SO che conosce in quel momento qual è la memoria libera, conosce quali sono i pezzi di memoria che può allocare ed avendo in ingresso il codice fornito dal compilatore che viene detto rilocabile conosce quali sono le aree di memoria libera e quindi saprà tradurre gli indirizzi logici in indirizzi assoluti. La traduzione è fatta una tantum. 667

La rilocazione è un po’ più articolata, ci consente di fare swapping, abbiamo che la traduzione tra indirizzi logici e fisici avviene a tempo di esecuzione e in questo caso si parla di rilocazione dinamica cioè la traduzione si ritarda fino all’accesso in memoria e quindi il processore lavorerà solo con gli indirizzi logici.

N.B domande su questi argomenti sono fatte ai colloqui.

Il processore abbiamo che lavora solo con gli indirizzi logici che nei primi due casi di rilocazione statica sono anche gli indirizzi fisici, nel terzo caso abbiamo che sono indirizzi logici che poi saranno convertiti in indirizzi fisici.

Se prendiamo l’immagine di un processo possiamo osservare che 0 ed N sono indirizzi che chiameremo logici, tali indirizzi sono contenuti anche all’interno del programma; ad esempio possiamo osservare come call A vuol dire di andare a chiamare la funzione Fun all’indirizzo logico A, abbiamo quindi un’operazione di salto ed A rappresenta l’indirizzo di un’istruzione. Con l’istruzione move 3, B abbiamo che viene chiesto di andare a spostare 3 all’indirizzo B che rappresenta quindi un indirizzo di tipo dati.

Un’operazione di return in assembly (istruzione rtr) non fa altro che andare a caricare nel Program Counter (PC) l’indirizzo contenuto nello stack che era stato caricato quando viene fatta una call, chi fa una call infatti farà un push nello stack dell’indirizzo di memoria e poi fa la chiamata alla funzione.

Quando viene ad essere fatta una return viene fatta una copia di questo indirizzo nel PC.

Quando parliamo di codice rilocabile si dice che anche all’interno dell’immagine ci deve essere tutto codice che dobbiamo andare a sostituire. Quando vogliamo fare ad esempio una rilocazione statica con una costante di spiazzamento quello che facciamo è portare gli indirizzi che vanno da 0 ad N da un indirizzo che va da X ad X+N; per rilocabile intendiamo che è possibile andare dentro il codice e riconoscere tutti gli indirizzi e possiamo andare a sostituire ad un indirizzo Y un indirizzo Y+X dove X rappresenta la costante di spiazzamento. 668

Abbiamo quindi che gli indirizzi nel codice generati dal compilatore devono essere riconoscibili altrimenti non potranno essere rilocati.

Ricapitolando possiamo dire che con:

  • Rilocazione statica -> intendiamo quel tipo di rilocazione in cui la traduzione da indirizzo logico ad indirizzo fisico avviene una tantum e può essere espletata o nella fase di compilazione in cui il compilatore assolutizza il codice oppure nella fase di caricamento. Nella fase di caricamento abbiamo che il SO deve avere un caricatore che conosce qual è la mappa di memoria libera in modo che può decidere quali sono gli indirizzi e gli deve essere fornito un codice generato dal compilatore che prende il nome di codice rilocabile, per il caricatore deve quindi essere facile riconoscere quali sono gli indirizzi e poi andarli a tradurre in indirizzi fisici.
  • Rilocazione dinamica -> la traduzione tra indirizzi logici ad indirizzi fisici avviene a tempo di esecuzione. 669

Swapping e utilizzo della memoria

La rilocazione dinamica è quella più utilizzata e questo tipo di rilocazione permette lo swapping.

Per aumentare il livello di multiprogrammazione abbiamo che il SO tende a spostare i processi bloccati nella memoria fisica dello storage. Abbiamo quindi uno swapper che identifica il processo sospeso e lo rimuove portandolo su un disco. Questo swapper fa sì che quando un processo che era in attesa di un segnale e questo segnale arriva è in grado di localizzare il processo che era stato precedentemente swappato sul disco ed è in grado di riportarlo in memoria. Lo swapper abbiamo quindi che in conclusione possiamo dire essere capace di rimuovere e di caricare un processo.

Lo swapper per quanto detto non possiamo realizzarlo con la rilocazione statica o meglio potremmo andarlo a realizzare ma poi non potrebbe essere modificato in quanto gli indirizzi saranno sempre gli stessi una volta assegnati e questo causerebbe un inefficiente utilizzo della memoria.

Supponiamo ad esempio di avere un processo lungo 10 locazioni e supponiamo che venga ad essere allocato in memoria dalla posizione 20 alla posizione 30. Supponiamo di fare un esempio di rilocazione statica, per rilocazione statica intendiamo che una volta che abbiamo convertito gli indirizzi questi saranno stati assolutizzati e quindi saranno compresi tra 20 e 30, quando facciamo uno swap-out del processo e quindi il processo P1 viene ad essere portato sul disco, abbiamo che la memoria viene ad essere liberata. 670

Supponiamo che sopraggiunga un altro processo P3. Quando altri processi finiscono e si libera la memoria, supponiamo che la memoria si liberi da 30 a 40, nel caso in esame abbiamo memoria libera, se P1 aveva fatto una wait su un semaforo e qualcuno gli ha fatto una signal, P1 dovrebbe essere riportato in uno stato ready ma se la rilocazione è statica P1 dovrà essere riallocato dall’indirizzo 20 all’indirizzo 30 che in questo esempio è in parte occupato dal processo P3 e quindi questo ci fa capire come non abbia proprio senso lo swapping in un tipo di rilocazione statica e questo potrebbe causare un inefficiente utilizzo della memoria in quanto la memoria potrebbe essere tutta libera tranne le locazioni che ci servono e quindi ciò che accade è che il sistema viene ad essere bloccato per attendere che le locazioni che ci servono diventino libere per poter nuovamente allocare in memoria il processo swappato.

Se invece usiamo la rilocazione dinamica abbiamo che P1 non avrà più gli indirizzi fisici ma avrà sempre indirizzi logici e in questo caso abbiamo che quando P1 viene riportato in memoria questo potrà essere riallocato nella locazione di memoria libera e ci saranno dei registri dove vengono ad essere memorizzate le locazioni dove P1 è stato allocato in questo modo ogni volta che il processore sta eseguendo P1 e fa accesso ad un indirizzo i di P1 ad i si andrà a sommare una costante di spiazzamento pari a 30 ma tutto questo viene fatto a tempo di esecuzione.

L’allocazione dinamica serve quindi per lo swapping e per gestire in modo più efficiente la memoria.

Senza l’allocazione dinamica quanto descritto sopra non potremmo farlo. Vediamolo nel dettaglio 671

CPU, memoria e MMU

Gli indirizzi logici sono gli indirizzi che vengono ad essere visti dalla CPU, la CPU quindi quando esegue un processo sostanzialmente genera sempre indirizzi logici. Gli indirizzi fisici sono quelli che vengono ad essere visti dalla memoria. Là dove stiamo utilizzando un tipo di rilocazione statica CPU e memoria hanno una stessa visione e vedono indirizzi fisici, là dove invece stiamo usando una rilocazione di tipo dinamico abbiamo che la CPU guarderà solo gli indirizzi logici mentre la memoria guarderà solo gli indirizzi fisici.

La CPU genera indirizzi logici perché esegue il processo e quindi gioca con gli indirizzi logici, quando ad esempio la CPU deve fare MOVE 3, B e quindi chiede l’indirizzo B, questo indirizzo non può essere risolto solo in software ma sarà sempre necessario un MMU che prende B in ingresso e fornisce l’indirizzo f per l’accesso in memoria e quindi consente di spostargli dentro il 3. Per poter far sì che la CPU abbia la sua visione degli indirizzi logici che prendono anche il nome di indirizzi virtuali e per far sì che l’associazione tra indirizzo logico e fisico sia fatta a run time abbiamo bisogno di un supporto hardware dell’architettura che nel momento in cui la CPU accede in memoria gestisca l’accesso in memoria traducendo l’indirizzo logico in indirizzo fisico. Questo oggetto hardware (MMU) fa sì che la CPU continui a lavorare con indirizzi logici ma disaccoppi

Anteprima
Vedrai una selezione di 10 pagine su 155
Appunti Sistemi operativi - parte 6 Pag. 1 Appunti Sistemi operativi - parte 6 Pag. 2
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 6
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 11
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 16
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 21
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 26
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 31
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 36
Anteprima di 10 pagg. su 155.
Scarica il documento per vederlo tutto.
Appunti Sistemi operativi - parte 6 Pag. 41
1 su 155
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Ingegneria industriale e dell'informazione ING-INF/05 Sistemi di elaborazione delle informazioni

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Dadox94 di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di Napoli Federico II o del prof Cotroneo Domenico.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community