Esercitazioni 3 e 4
Transcript
Esercitazioni 3 e 4
Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002 Sistemi Operativi Corsi A e B Esercitazioni 3 e 4 Sincronizzazione dei Processi (2a parte) n Problemi classici di sincronizzazione n Regioni critiche n Monitor Sistemi Operativi P.Trunfio – R.Ortale 1 Problemi classici di sincronizzazione n Problema del Bounded-Buffer n Problema dei Lettori e degli Scrittori n Problema dei Cinque Filosofi Sistemi Operativi P.Trunfio – R.Ortale Problema del Bounded-Buffer n Dati condivisi: Semaforo full, empty, mutex; Inizialmente: full = 0, empty = n, mutex = 1 Sistemi Operativi P.Trunfio – R.Ortale 2 Bounded-Buffer: Processo Produttore while (true) { … produce un item in nextp … wait(empty); wait(mutex); … aggiunge nextp al buffer … signal(mutex); signal(full); } Sistemi Operativi P.Trunfio – R.Ortale Bounded-Buffer: Processo Consumatore while (true) { wait(full); wait(mutex); … rimuove un item dal buffer e lo inserisce in nextc … signal(mutex); signal(empty); … consuma l’item in nextc … } Sistemi Operativi P.Trunfio – R.Ortale 3 Problema dei Lettori-Scrittori n Dati condivisi: Semaforo mutex, wrt; int readcount; Inizialmente: mutex = 1, wrt = 1, readcount = 0 Sistemi Operativi P.Trunfio – R.Ortale Lettori-Scrittori: Processo Scrittore wait(wrt); … scrive … signal(wrt); Sistemi Operativi P.Trunfio – R.Ortale 4 Lettori-Scrittori: Processo Lettore wait(mutex); readcount++; if (readcount == 1) wait(wrt); signal(mutex); … legge … wait(mutex); readcount--; if (readcount == 0) signal(wrt); signal(mutex); Sistemi Operativi P.Trunfio – R.Ortale Problema dei Cinque Filosofi n Dati condivisi: Semaforo chopstick[] = new Semaforo [5]; Inizialmente tutti i semafori valgono 1 Sistemi Operativi P.Trunfio – R.Ortale 5 Problema dei Cinque Filosofi n Filosofo i: while (true) { wait(chopstick[i]); wait(chopstick[(i+1) % 5]); … mangia … signal(chopstick[i]); signal(chopstick[(i+1) % 5]); … pensa … } Sistemi Operativi P.Trunfio – R.Ortale Regioni critiche n Costrutto di sincronizzazione di alto livello. n Una variabile condivisa v di tipo T, è dichiarata come: v: shared T n La variabile v viene acceduta solo dentro uno statement: region v when B do S dove B è una espressione booleana. n Mentre lo statement S è in esecuzione , nessun altro processo può accedere la variabile v. Sistemi Operativi P.Trunfio – R.Ortale 6 Regioni critiche n Regioni che fanno riferimento alla stessa variabile condivisa si escludono reciprocamente . n Quando un processo prova ad eseguire lo statement della regione critica, l’espressione booleana B viene valutata. Se B è true, S viene eseguita. Se è false, il processo viene ritardato fintanto che B diventa true e nessun altro processo si trova nella regione critica associata con v. Sistemi Operativi P.Trunfio – R.Ortale Esempio: Bounded-Buffer n Dati condivisi: class buffer { int pool[] = new int[n]; int count, in, out; } Sistemi Operativi P.Trunfio – R.Ortale 7 Bounded-Buffer: Processo Produttore n Il processo produttore inserisce nextp nel buffer condiviso: region buffer when (count < n) do { pool[in] = nextp; in = (in+1) % n; count++; } Sistemi Operativi P.Trunfio – R.Ortale Bounded-Buffer: Processo Consumatore n Il processo consumatore rimuove un item dal buffer condiviso e lo inserisce in nextc: region buffer when (count > 0) do { nextc = pool[out]; out = (out+1) % n; count--; } Sistemi Operativi P.Trunfio – R.Ortale 8 Implementazione di “region x when B do S” (1) n Associamo alla variabile condivisa x, le seguenti variabili: Semaforo mutex, firstDelay, secondDelay; int firstCount, secondCount; n L’accesso in mutua escusione alla sezione critica è garantito da mutex. n Se un processo non può entrare nella sezione critica perchè il valore dell’espressione booleana B è false, esso aspetta prima sul semaforo firstDelay; successivamente viene spostato sul semaforo secondDelay prima che possa rivalutare B. Sistemi Operativi P.Trunfio – R.Ortale Implementazione di “region x when B do S” (2) n firstCount e secondCount tengono conto rispettivamente del numero di processi in attesa sui semafori firstDelay e secondDelay. n L’algoritmo assume un ordinamento FIFO nell’accodamento dei processi nei semafori. n Per una modalità di accodamento arbitraria è necessaria una implementazione più complessa. Sistemi Operativi P.Trunfio – R.Ortale 9 Monitor n Costrutti di sicronizzazione di alto livello che consentono la condivisione sicura di un tipo di dati astratto tra processi concorrenti. monitor monitor-name { dichiarazione di variabili condivise procedure entry P1 (…) { ... } procedure entry P2 (…) { ... } procedure entry Pn (…) { ... } { codice di inizializzazione } } Sistemi Operativi P.Trunfio – R.Ortale Monitor n Per consentire ad un processo di attendere all’interno di un monitor, si deve dichiarare una variabile condition: condition x, y; n Una variabile condition può essere manipolata solo attraverso le operazioni wait e signal. F L’operazione x.wait(); sospende il processo che la invoca fino a quando un altro processo non invoca: x.signal(); F L’operazione x.signal risveglia esattamente un processo. Se nessun processo è sospeso l’operazione di signal non ha effetto. Sistemi Operativi P.Trunfio – R.Ortale 10 Rappresentazione concettuale di un Monitor Sistemi Operativi P.Trunfio – R.Ortale Monitor con variabili condition Sistemi Operativi P.Trunfio – R.Ortale 11 Cinque Filosofi (1) class filosofi // una classe monitor { final int thinking=0, hungry=1, eating=2; int state[] = new int[5]; // gli elementi valgono 0, 1 o 2 condition self[] = new condition[5]; void pickup(int i) // lucidi seguenti void putdown(int i) // lucidi seguenti void test(int i) // lucidi seguenti void init() { for (int i = 0; i < 5; i++) state[i] = thinking; } } Sistemi Operativi P.Trunfio – R.Ortale Cinque Filosofi (2) void pickup(int i) { state[i] = hungry; test(i); if (state[i] != eating) self[i].wait(); } void putdown(int i) { state[i] = thinking; // controlla i vicini a destra e a sinistra test((i+4) % 5); test((i+1) % 5); } Sistemi Operativi P.Trunfio – R.Ortale 12 Cinque Filosofi (3) void test(int i) { if ( (state[(i + 4) % 5] != eating) && (state[i] == hungry) && (state[(i + 1) % 5] != eating) ) { state[i] = eating; self[i].signal(); } } Sistemi Operativi P.Trunfio – R.Ortale Implementazione dei Monitor (1) Implementazione dei monitor tramite semafori: n Variabili: Semaforo mutex; Semaforo next; int nextCount = 0; // (inizialmente = 1) // (inizialmente = 0) n Ciascuna procedura atomica F deve essere sostituita da: wait(mutex); … corpo di F; … if (nextCount > 0) signal(next); else signal(mutex); n La mutua esclusione all’interno di un monitor è così assicurata. Sistemi Operativi P.Trunfio – R.Ortale 13 Implementazione dei Monitor (2) n Per ciascuna variabile condition x, abbiamo: Semaforo xSem; int xCount = 0; // (inizialmente = 0) n L’operazione x.wait() può essere implementata come: xCount++; if (nextCount > 0) signal(next); else signal(mutex); wait(xSem); xCount--; Sistemi Operativi P.Trunfio – R.Ortale Implementazione dei Monitor (3) n L’operazione x.signal() può essere implementata come: if (xCount > 0) { nextCount++; signal(xSem); wait(next); nextCount--; } Sistemi Operativi P.Trunfio – R.Ortale 14 Implementazione dei Monitor (4) n Costrutto wait con priorità: x.wait(c); F c: espressione intera valutata quando l’operazione wait viene eseguita. F Il valore di c (un numero di priorità) memorizzato con il nome del processo che è sospeso. F Quando viene eseguito x.signal, il processo che ha il più basso numero di priorità viene svegliato. n Verifica due condizioni per stabilire la correttezza del sistema: F I processi utente devono sempre effettuare le invocazioni sui metodi del monitor secondo una sequenza corretta. F Occorre assicurare che i processi non cooperanti non tentino di accedere alle variabili condivise direttamente, bypassando la mutua esclusione fornita dai monitor. Sistemi Operativi P.Trunfio – R.Ortale 15