Più processi possono cooperare per compiere un determinato lavoro. Di solito, condividono dei dati. Processi cooperanti attraverso la condivisione di dati devono agire però in modo ordinato, cioè sincronizzarsi. Infatti, mentre un processo P sta elaborando dati che dovranno essere usati anche da altri processi, non sa quando il sistema opertivo deciderà di toglierlo dalla CPU. Altri processi non devono usare i dati condivisi fino a che la loro elaborazione dal parte di P non è stata completata. Quando devono accedere e modificare dati condivisi, i processi devono sincronizzarsi, in modo che ognuno abbia la possibilità di eseguire completamente le operazioni che deve compiere sui dati condivisi prima che un altro processo abbia il diritto di usare (leggere/modificare) gli stessi dati. Siano dati n processi P1,... Pn, che usano delle variabili condivise. Ogni processo ha normalmente almeno una porzione di codice, detta sezione critica, in cui il processo manipola alcune delle variabili condivise. Quando un processo Pi è dentro alla sua sezione critica (di Pi) , nessun altro processo Pj può eseguire codice della sua sezione critica (di Pj) che usi le stesse variabili condivise. L’esecuzione delle sezioni critiche è quindi mutuamente esclusiva. Notate che mentre Pi sta eseguendo codice dentro la sua sezione critica, potrebbe essere tolto dalla CPU dal SO a causa del normale avvicendamento tra processi. Fino a che Pi non avrà terminato di eseguire il codice della sua sezione critica (e potrebbero volerci più contex switch), nessun altro processo Pj che deve manipolare le stesse variabili condivise potrà eseguire il codice della propria sezione critica! Possiamo definire sezione critica come quella porzione di codice che deve essere eseguito senza intrecciarsi col codice delle sezioni critiche di altri processi che usano le stesse variabili condivise. E’ necessario stabilire un protocollo di comportamento usato dai processi che devono usare le variabili condivise. Un processo deve “chiedere il permesso” per entrare nella sezione critica (entry section), mentre un processo che esce dalla sua sezione critica deve “segnalarlo” agli altri processi (exit section). Quindi un generico processo Pi contenente una sezione critica avrà la seguente struttura:
Naturalmente Pi può avere più sezioni critiche... Per il principio della Mutua esclusione spiegato sopra è chiaro che nella sezione critica deve essere presente al più un processo. Se un processo lascia la sezione critica, deve permettere ad un’altro di entrare. Se la sezione critica è vuota e più processi vogliono entrare uno tra questi deve essere scelto in un tempo finito. Una soluzione potrebbe essere quella di disabilitare gli interrupt quando un processo è dentro la propria sezione critica, in modo da evitare context switch, ma la sezione critica può essere molto lunga. Altre soluzioni al problema della sincronizzazione sono:
Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.