Torna alla pagina di Sistemi Operativi
:: Appunti caotici ::
Lezione 3
Comunicazione con memoria condivisa
Pag 2
Condivisione di variabili globali
In figura posso vedere che ho due processi P e Q, i quali possediono nella memoria il loro stack, il loro heap ecc., ma possiedono un blocco di memoria che è condiviso da entrambi i processi. Tale condivisione viene creata affinchè i due processi possano comunicare. Con la condivisione della memoria però ho diversi problemi da risolvere, uno di questi è la possibilità di avere delle inconistenze nelle informazioni lette dal processo ricevente. Tali incosistenze si verificano a causa di un accesso da parte del processo ricevente durante la scrittura dei dei dati da parte del processo mittente, questo porta ad una lettura di informazione errata. Per risolvere questo problema devo poter inserire delle politiche di sincronizzazione degli accessi da parte dei processi.
Utilizzando questo metodo posso tollerare questi incovenienti a patto che ci sia una rigida separazione fra i due processi e in secondo luogo perchè la porzione di memoria condivisa è abbastanza limitata. Un altro motivo che mi porta ad poter tenere in considerazione questo metodo è che comunque le altre zone di memoria sono protette da tentativi di accesso, quindi non possono modificare zone importanti come quelle che contengono il codice del sistema operativo.
Problemi della condivisione di variabili globali
I problemi che possono sorgere nell'utilizzare la condivisione delle variabili globali sono:
- Dato che la comunicazione è diretta i due processi che vogliono comunicare devono conoscersi;
- Devo evitare inconsistenze nei dati che voglio condividere, quindi i dati devono essere validi;
- Devo quindi rispettare delle politiche di sincronizzazione per evitare inconsistenze nei dati;
Pag 3
Realizzazione con area comune copiata dal sistama operativo
Con questa tecnica dedico un'area di memoria temporanea. I due processi P e Q, che si trovano in memoria per comunicare devono appellarsi al sistema operativo, in quanto i processi hanno visibilità limitata al loro proprio spazio di indirizzamento, sempre per evitare che facciano danni permanenti. Il sistema operativo dunque copia il blocco di memoria del processo mittente contente l'informazione e lo copia in un blocco della sua memoria, la quale è temporanea. Una volta acquisito tutto il blocco dal processo mittente il sistema operativo lo copia all'interno del processo ricevente, dando così l'impressione di uno spazio di memoria condivisa. Si ricorre al sistema operativo in quanto lui svolge tutte le operazioni in modalità superuser.
Il problema sorge quando il processo ricevente effettua una modifica dell'informazione acquisita. Il problema che sorge è appunto che il sistema operativo deve rieffetuare delle operazioni di lettura e scrittura sprecando un sacco di tempo. Queste operazioni sono relativamente veloci se la parola da copiare è corta, la situazione si aggrava se le parole di memoria aumentano (è un rapporto direttamte proporzionale, aumenta l'una aumenta anche l'altro). Per risolvere questo problema devo devo dimensionare accuratamente lo spazio di memoria che voglio condividere. L'idea di fondo è che piuttosto di crare uno spazio condiviso enorme (che mi porta al problema di prima), creo diversi spazi di memoria che condividerò solo più piccoli.
Realizzazione con area comune fisicamente condivisa
L'alternativa al metodo precedente è dedicare fisicamente una porzione di memoria. Per far questo devo poter garantire l'accesso, da parte dei due processi, a questa zona di memoria condivisa. Questo lo realizzo facendo rientrare l'indirizzo della memoria condivisa fra quelli a cui i processi possono accedere, dando di fatto i permessi per l'accesso. Utilizzando questo metodo risparmio un sacco di tempo evitanto accessi in lettura e scrittura da parte del sistema operativo in quanto i due processi vi possono accedere liberamente. Devo stare attento solo alle politiche di sincronizzazione degli accessi per evitare inconsistenze nei dati.
Pag 4
Condivisione di buffer(1)
Il processo mittente scriverà le sue informazioni all'interno del buffer, informazioni che verranno poi lette dal processo ricevente. Il buffer conterrà solo le informazioni, e non quindi tutte le variabili globali, anche se ho diversi problemi.
Condivisione di buffer(2)
I problemi che sorgono sono sempre quelli relativi alla sincronizzazione per evitare inconsistenze nei dati. L'unico vantaggio è che si tratta di una zona di memoria il cui spazio è limitato, quindi le operazioni di copiatura dell'informazione sono abbastanza veloci.
Pag 5
Produttore-Consumatore (1)
...
Produttore-Consumatore (2)
...
Pag 6
Produttore-Consumatore (3)
Utilizzo un buffer circolare (dal punto di vista logico, dato che fisicamente deve essere ovviamente realizzato in modo lineare) in cui P mette dentro uno dopo l'altro i propri messaggi e Q andrà a tirar fuori le informazioni che gli servono.
Produttore-Consumatore (4)
...
Torna alla pagina di Sistemi Operativi