Torna alla pagina di Sistemi Operativi
:: Appunti caotici ::
Lezione 1
Processi concorrenti
Pag 1
Sommario
Per processi concorrenti si intende processi che vogliono accedere a risorse condivise.
Pag 2
Concorrenza
La concorrenza deve consentire l'accesso a risorse condivise usabili solo in mutua esclusione, in modo da garantire la consistenza delle informazioni, che potrebbero non essere più risultato della corretta computazione del processo.
La mutua esclusione implica che finché un processo detiene l'uso della risorsa condivisa, nessun altro potrà accedervi. Ad esempio, se un processo ha mandato una richiesta di stampa alla stampante, nessun altro processo potrà stampare altro finché non ha finito il primo. Devo perciò permettere solo quelle azioni compatibili tra loro, ad esempio vietando operazioni contemporanea di lettura e scrittura sulla stessa risorsa condivisa dai processi.
Sincronizzazione per l'uso di risorse condivise
Ricordiamo fino alla nausea che sia le risorse fisiche che informative condivise vanno sempre usate in modo mutualmente esclusivo
Pag 3
Problema del produttore-consumatore
Il problema consiste nel sincronizzare due processi, uno (il produttore) che vuole inviare informazioni sui suoi prodotti e l'altro (il consumatore) che vuole leggerli. O comunque, una situazione simile.
Entrambi i processi potrebbero sfruttare un buffer circolare per deporre e prelevare informazioni. Il produttore inserirà le informazioni nel primo spazio vuoto, incrementando poi di uno il contatore di elementi; il consumatore se trova il buffer vuoto aspetta, altrimenti legge l'informazione e decrementa di 1 il contatore degli elementi nel buffer e incrementa di uno il puntatore out delle posizioni ancora da leggere.
Dove nasce il problema? Se ad esempio scade il time slice del processo produttore proprio nel momento in cui sta per incrementare il contatore, avrei risultati inconsistenti, dato che il consumatore avrà un valore sballato di quest'ultimo e accederà dunque a informazioni non corrette
Corse critiche
Le corse critiche sono quelle operazioni che possono portare a inconsistenza delle informazioni in caso di processi concorrenti. Notare come queste non conducano sempre ad errori ad ogni esecuzione, ma potrebbero farlo, dunque bisogna evitarle. Prevenire è meglio che curare.
Nell'esempio del produttore-consumatore queste non sono dovute ai soliti problemi legate a operazioni contemporanee di lettura e scrittura (dato che ognuna avviene nello spazio di indirizzamento del proprio processo), ma ai possibili errori nell'aggiornamento dei puntatori del buffer. Tale operazione è infatti realizzata con una sequenza di istruzioni assembler, interrompibile proprio in quanto sequenza e quindi corsa critica.
Bisogna sempre garantire che la sequenza di operazione sia eseguita in modo corretto.
Pag 4
Sezione critica
La sezione critica è una porzione di codice che può generare errori se eseguita in modo concorrente; se infatti fosse eseguita da processi separati funzionerebbe correttamente.
Condizioni da soddisfare:
- mutua esclusione, in modo da essere certo di non usare in modo scorretto le varie risorse
- progresso
- attesa limitata, ovvero non devo avere processi che attendono in modo indefinito di evolversi
Sincronizzazione di processi cooperanti
I processi cooperanti, lo dice il nome stesso, non competono ma lavorano insieme per uno scopo comune. Per realizzarli si rende però necessaria la sincronizzazione dell'evoluzione della computazione.
Nello schema, P1 svolge delle operazioni e a un certo punto vuole fare sapere al processo P2 (prima di eseguire una determinata istruzione) a che punto dello stato di computazione si trova. Analogamente P2 avrà un punto del codice in cui smetterà di computare, fino a quando non gli arriva da P1 le informazioni sul suo stato di computazione. In questo modo i due processi si sincronizzano, dal momento che sanno con esattezza quali blocchi di operazioni sono già stati eseguiti dall'uno e dall'altro.
Torna alla pagina di Sistemi Operativi