Il semaforo. Strumento linguistico di basso livello per risolvere problemi di sincronizzazione.

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Il semaforo. Strumento linguistico di basso livello per risolvere problemi di sincronizzazione."

Transcript

1 Il semaforo 1

2 Il semaforo Strumento linguistico di basso livello per risolvere problemi di sincronizzazione. Il meccanismo semaforico e` normalmente utilizzato a livello di macchina concorrente per realizzare strumenti di sincronizzazione di più alto livello. Disponibile in librerie standard per la realizzazione di programmi concorrenti con linguaggi sequenziali (es. C). Esempio: libreria LinuxThreads (standard Posix) 2

3 Semaforo: tipo di dati semaphore Un semaforo e` rappresentato da una variabile di tipo semaphore, definita come una variabile intera non negativa, cui è possibile accedere solo tramite le due operazioni P e V. Dichiarazione di un oggetto di tipo semaphore: semaphore s=i; dove i (i 0) è il valore iniziale. Al tipo semaphore sono associati: Insieme di valori= { X X N Insieme delle operazioni= {P,V 3

4 Operazioni sul semaforo Un oggetto di tipo semaphore è condivisibile da due o più processi, che operano su di esso attraverso le operazioni P e V. Semantica delle due operazioni: void P(semaphore s): region s << when(vals>0) vals--;>> void V(semaphore s): region s << vals++;>> dove val s rappresenta il valore del semaforo. Essendo l oggetto s condiviso, le due operazioni P e V vengono definite come sezioni critiche da eseguire in mutua esclusione. Le due operazioni devono essere eseguite in forma atomica. 4

5 P(s) Operazioni sul semaforo V(s) val s >0 si no val s ++ val s -- Il semaforo viene utilizzato come strumento di sincronizzazione tra processi concorrenti: sospensione: P(s), val s ==0 risveglio: V(s), se vi e` almeno un processo sospeso 5

6 Relazione di invarianza: Semaforo Siano: I s : valore intero 0 con cui il semaforo s viene inizializzato; nv s : numero di volte che l operazione V(s) è stata eseguita; ni s : numero di volte che l operazione P(s) è stata iniziata; np s : numero di volte che l operazione P(s) è stata completata; bloccati s : numero dei processi sospesi sul semaforo 6

7 Semaforo: relazione di Invarianza val s = I s + nv s np s da cui (val s 0): np s I s + nv s relazione di invarianza Inoltre osserviamo che: bloccati s = ni s np s val s > 0 => bloccati s == 0 bloccati s > 0 => val s == 0 7

8 Uso dei semafori Il semaforo viene utilizzato come strumento di sincronizzazione tra processi concorrenti: sospensione: P(s), s==0 risveglio: V(s), se vi e` almeno un processo sospeso Nel seguito verranno illustrati alcuni esempi notevoli di uso del meccanismo semaforico: semafori di mutua esclusione semafori evento semafori binari composti semafori condizione semafori risorsa semafori privati 8

9 Semafori di mutua esclusione Semaforo binario. Può assumere solo i valori 0 e 1 class tipo_risorsa { <struttura dati di ogni istanza della classe>; semaphore mutex = 1; public void op1( ) { P(mutex); /*prologo*/ <corpo della funzione op1>; V(mutex); /*epilogo*/... public void opn( ) { P(mutex); <corpo della funzione opn>; V(mutex);... tipo_risorsa ris; ris.opi(); 9

10 Mutua esclusione tra gruppi di processi In alcuni casi è consentito a più processi di eseguire contemporaneamente la stessa operazione su una risorsa, ma non operazioni diverse. Data la risorsa condivisa ris e indicate con op1,, opn le n operazioni previste per operare su ris, vogliamo garantire che più processi possano eseguire concorrentemente la stessa operazione opi mentre non devono essere consentite esecuzioni contemporanee di operazioni diverse. 10

11 Anche in questo caso lo schema è: public void op i () { <prologo i >; <corpo della funzione op i >; <epilogo i >; prologo i deve sospendere il processo che ha chiamato l operazione op i se sulla risorsa sono in esecuzione operazioni diverse da op i ; diversamente deve consentire al processo di eseguire op i. epilogo i deve liberare la mutua esclusione solo se il processo che lo esegue è l unico processo in esecuzione sulla risorsa o è l ultimo di un gruppo di processi che hanno eseguito la stessa op i. 11

12 public void op i ( ) { P(m i ); cont i ++; if (cont i ==1) P(mutex); V(m i ); <corpo della funzione op i >; P(m i ); cont i --; if (cont i ==0) V(mutex); V(m i ); <prologo i > <epilogo i > 12

13 Esempio: Problema dei lettori/scrittori semaphore mutex = 1; semaphore ml = 1 int contl = 0; public void lettura( ) { P(ml); contl++; if (contl==1) P(mutex); V(ml); <lettura del file >; P(ml); contl--; if (contl==0) V(mutex); V(ml); public void scrittura( ) { P(mutex); <scrittura del file >; V(mutex); 13

14 Semafori evento: scambio di segnali temporali semafori binari utilizzati per imporre un vincolo di precedenza tra le operazioni dei processi. a Esempio: op a deve essere eseguita da P 1 solo dopo che P 2 ha eseguito op b Introduciamo un semaforo sem inizializzato a zero: prima di eseguire op a, P1 esegue P(sem); dopo aver eseguito op b, P 2 esegue V(sem). 14

15 P 1 P 2 P 2 P 2 P(sem) op a op b op a op b V(sem) a) b) 15

16 Problema del rendez-vous Due processi P 1 e P 2 eseguono ciascuno due operazioni p a e p b il primo e q a e q b il secondo. vincolo di rendez-vous : l esecuzione di p b da parte di P 1 e q b da parte di P 2 possono iniziare solo dopo che entrambi i processi hanno completato la loro prima operazione. Scambio di segnali temporali in modo simmetrico: ogni processo quando arriva all appuntamento segnala di esserci arrivato e attende l altro. Introduciamo due semafori evento sem1 e sem2 16

17 P 1 p a V(sem P(sem 2 ) 1 ) p b P 2 q a V(sem 2 ) P(sem 1 ) q b 17

18 Semafori binari composti: scambio di dati Due processi P 1 e P 2 si scambiano dati di tipo T utilizzando una memoria (buffer) condivisa. Vincoli di sincronizzazione: Accessi al buffer mutuamente esclusivi. P2 può prelevare un dato solo dopo che P1 lo ha inserito. P1, prima di inserire un dato, deve attendere che P2 abbia estratto il precedente. 18

19 Scambio di dati: vincoli di precedenza P 1 in i in i+1 P 2 es i es i+1 Utilizziamo due semafori: vu, per realizzare l'attesa di P1, in caso di buffer pieno; pn, per realizzare l'attesa di P2, in caso di buffer vuoto; 19

20 void invio(t dato) { T ricezione( ) { P(vu); T dato; inserisci(dato); P(pn); V(pn); dato=estrai(); V(vu); return dato; buffer inizialmente vuoto valore iniziale vu= 1 valore iniziale pn= 0 20

21 pn e vn garantiscono da soli la mutua esclusione delle operazioni estrai ed inserisci. La coppia di semafori si comporta nel suo insieme come se fosse un unico semaforo binario di mutua esclusione. Semaforo binario composto: un insieme di semafori usato in modo tale che: uno solo di essi sia inizializzato a 1 e tutti gli altri a zero. ogni processo che usa questi semafori esegue sempre sequenze che iniziano con la P su uno di questi e termina con la V su un altro. 21

22 Semafori condizione In alcuni casi, l'esecuzione di un'istruzione S1 su una risorsa R e` subordinata al verificarsi di una condizione C: void op1( ): region R << when(c) S1;>> op1( ) è una regione critica, dovendo operare su una risorsa condivisa R. S1 ha come precondizione la validità della condizione logica C. Il processo deve sospendersi se la condizione non è verificata e deve uscire dalla regione per consentire ad altri processi di eseguire altre operazioni su R per rendere vera la condizione C. 22

23 V(sem) true C false true C false P(sem) S S (a) (b) 23

24 Lo schema (a) presuppone una forma di attesa attiva da parte del processo che non trova soddisfatta la condizione. Nello schema (b) si realizza la region sospendendo il processo sul semaforo sem da associare alla condizione.(semaforo condizione) E evidentemente necessaria un altra operazione op2 che, chiamata da un altro processo, modifichi lo stato interno di R in modo che C diventi vera (C e` una post condizione di op2). Nell ambito di op2 viene eseguita la V(sem) per risvegliare il processo. 24

25 Struttura dati della risorsa R semaphore mutex = 1; semaphore sem = 0; int csem=0 public void op 1 ( ) { P(mutex); while (!C) { csem ++; V(mutex); P(sem); P(mutex); S 1 ; V(mutex); public void op2( ) { P(mutex); S2 ; if (csem>0) { csem --; V(sem) V(mutex); Schema con attesa circolare 25

26 Struttura dati della risorsa R semaphore mutex = 1; semaphore sem = 0; int csem = 0; public void op1( ) { P(mutex); if (!C) { csem ++; V(mutex); P(sem); csem --; public void op2( ) { P(mutex); S2; if(csem>0) V(sem); else V(mutex); S1; V(mutex); Schema con passaggio di testimone 26

27 Semafori condizione: considerazioni sulle soluzioni Il secondo schema è più efficiente del primo, ma consente di risvegliare un solo processo alla volta poichè ad uno solo può passare il diritto di operare in mutua esclusione. La condizione C verificata all interno di op1 deve essere verificabile anche all interno di op2. Ciò significa che non deve contenere variabili locali o parametri della funzione op1. 27

28 Esempio di uso di semafori condizione: Gestione di un pool di risorse equivalenti Si consideri un insieme (pool) di N risorse tutte uguali: Ciascun processo può operare su una qualsiasi risorsa del pool purché libera. Necessità di un gestore che mantenga aggiornato lo stato delle risorse: 1. Ciascun processo quando deve operare su una risorsa chiede al gestore l allocazione di una di esse. 2. Il gestore assegna al processo una risorsa libera (se esiste), in modo dedicato, passandogli l indice relativo. 3. Il processo opera sulla risorsa senza preoccuparsi della mutua esclusione. 4. Al termine il processo rilascia la risorsa al gestore. 28

29 Gestione di un pool di risorse equivalenti: operazioni del gestore int richiesta(): region G << when (<ci sono risorse disponibili>) <scelta di una risorsa disponibile>; int i = <indice della risorsa scelta>; <registra che la risorsa di indice i non è più disponibile>; return i; >> void rilascio(int r): region G << <registra che la risorsa r-esima è di nuovo disponibile> >> 29

30 Realizzazione: class tipo_gestore { semaphore mutex = 1; /*sem. di mutua esclusione*/ semaphore sem = 0; /*semaforo condizione*/ int csem = 0; /*contatore dei proc. sospesi su sem */ boolean libera[n]; /*indicatori di risorsa libera*/ int disponibili = N; /*contatore risorse libere*/ /*inizializzazione:*/ {for(int i=0; i < N; i++)libera[i]=true; public int richiesta() { int i=0; P(mutex); if (disponibili == 0) { csem ++; V(mutex); P(sem): csem --; while(!libero[i]) i++; libero[i]=false; disponibili --; V(mutex); return i; /* continua..*/ 30

31 public void rilascio (int r) { P(mutex); libero[r]=true; disponibili ++; if (csem>0) V(sem); else V(mutex); /* fine classe tipo_gestore */ 31

32 tipo_gestore G; /* def. gestore*/ /*struttura del generico processo che vuole accedere a una risorsa del pool: */ process P{ int ris;... ris = G.richiesta( ); < uso della risorsa di indice ris> G.rilascio (ris) ;... 32

33 Semafori risorsa Semafori generali. Possono assumere qualunque valore 0. Vengono impiegati per realizzare l'allocazione di risorse equivalenti: il valore del semaforo rappresenta il numero di risorse libere. Esempio: gestione di un pool di risorse equivalenti. Unico semaforo n_ris inizializzato con un valore uguale al numero di risorse da allocare. Esecuzione di P(n_ris) in fase di allocazione e di V(n_ris) in fase di rilascio 33

34 class tipo_gestore { semaphore mutex = 1; /*semaforo di mutua esclusione*/ semaphore n_ris = N; /*semaforo risorsa*/ boolean libero[n]; /*indicatori di risorsa libera*/ {for(int i=0; i < N; i++) libera[i]=true; /*inizializzazione*/ public int richiesta() { int i=0; P(n_ris); P(mutex); while(libero[i]==false) i++; libero[i]=false; V(mutex); return i; public void rilascio (int r) { P(mutex); libero[r]=true; V(mutex); V(n_ris); 34

35 Semafori risorsa: problema dei produttori/consumatori Buffer di n elementi (di tipo T), strutturato come una coda: coda_di_n_t buffer; semaphore pn = 0; semaphore vu = n; semaphore mutex = 1; void invio(t dato) { T ricezione() { P(vu); T dato; P(mutex); P(pn); buffer.inserisci(dato); P(mutex); V(mutex); dato = buffer.estrai(); V(pn); V(mutex); V(vu); return dato; il produttore richiede l'allocazione di una risorsa "elemento vuoto" il consumatore richiede l'allocazione di una risorsa "elemento pieno" 35

36 Realizzazione del buffer: coda circolare. class coda_di_n_t { T vettore[n]; int primo = 0; ultimo = 0; public void inserisci(t dato) { vettore[ultimo] = dato; ultimo = (ultimo+1)%n; public T estrai( ) { T dato= vettore[primo]; primo = (primo+1)%n; return dato; 36

37 Semafori privati: specifica di strategie di allocazione Condizione di sincronizzazione: Qualora si voglia realizzare una determinata politica di gestione delle risorse, la decisione se ad un dato processo sia consentito proseguire l'esecuzione dipende dal verificarsi di una condizione, detta condizione di sincronizzazione. La condizione è espressa in termini di variabili che rappresentano lo stato della risorsa e di variabili locali ai singoli processi. Più processi possono essere bloccati durante l accesso ad una risorsa condivisa, ciascuno in attesa che la propria condizione di sincronizzazione sia verificata. 37

38 In seguito alla modifica dello stato della risorsa da parte di un processo, le condizioni di sincronizzazione di alcuni processi bloccati possono essere contemporaneamente verificate. Problema: quale processo mettere in esecuzione (accesso alla risorsa mutuamente esclusivo)? Definizione di una politica per il risveglio dei processi bloccati. Nei casi precedenti la condizione di sincronizzazione era particolarmente semplificata (vedi mutua esclusione) e la scelta di quale processo riattivare veniva effettuata tramite l algoritmo implementato nella V. Normalmente questo algoritmo, dovendo essere sufficientemente generale ed il più possibile efficiente, coincide con quello FIFO. 38

39 Esempio 1 Su un buffer da N celle di memoria più produttori possono depositare messaggi di dimensione diversa. Politica di gestione: tra più produttori ha priorità di accesso quello che fornisce il messaggio di dimensione maggiore. finché un produttore il cui messaggio ha dimensioni maggiori dello spazio disponibile nel buffer rimane sospeso, nessun altro produttore può depositare un messaggio anche se la sua dimensione potrebbe essere contenuta nello spazio libero del buffer. Condizione di sincronizzazione: il deposito può avvenire se c è sufficiente spazio per memorizzare il messaggio e non ci sono produttori in attesa. 39

40 Il prelievo di un messaggio da parte di un consumatore prevede la riattivazione tra i produttori sospesi, di quello il cui messaggio ha la dimensione maggiore, semprechè esista sufficiente spazio nel buffer. Se lo spazio disponibile non è sufficiente nessun produttore viene riattivato. 40

41 Esempio 2 Un insieme di processi utilizza un insieme di risorse comuni R1,R2,..Rn. Ogni processo può utilizzare una qualunque delle risorse. Condizione di sincronizzazione: l'accesso e` consentito se esiste una risorsa libera. A ciascun processo è assegnata una priorità. In fase di riattivazione dei processi sospesi viene scelto quello cui corrisponde la massima priorità 41

42 Esempio 3 Con riferimento al problema dei lettori & scrittori, si intende realizzare una politica di gestione che eviti condizioni di attesa indefinita (starvation) per entrambe le classi di processi. 42

43 SEMAFORO PRIVATO Un semaforo s si dice privato per un processo quando solo tale processo può eseguire la primitiva P sul semaforo s. La primitiva V sul semaforo può essere invece eseguita anche da altri processi. Un semaforo privato viene inizializzato con il valore zero. 43

44 Uso dei semafori privati I semafori privati possono essere utilizzati per realizzare particolari politiche di allocazione di risorse: il processo che acquisisce la risorsa puo` (se la condizione di sincronizzazione non e` soddisfatta) eventualmente sospendersi sul suo semaforo privato chi rilascia la risorsa, risvegliera` uno tra i processi sospesi (in base alla politica scelta) mediante una V sul semaforo privato del processo prescelto. 44

45 Allocazione di risorse con particolari strategie: primo schema class tipo_gestore_risorsa{ <struttura dati del gestore>; semaphore mutex =1; semaphore priv[n] = {0,0,..0; /*semafori privati*/ public void acquisizione (int i) { P(mutex); if(<condizione di sincronizzazione>){ <allocazione della risorsa>; V(priv[i]); else <registrare la sospensione del processo>; V(mutex); P(priv[i]); 45

46 public void rilascio( ) { int i; P(mutex); <rilascio della risorsa>; if (<esiste almeno un processo sospeso per il quale la condizione di sincronizz. è soddisfatta>) { <scelta (fra i processi sospesi) del processo Pi da riattivare>; <allocazione della risorsa a Pi>; <registrare che Pi non è più sospeso>; V(priv[i]); V (mutex); 46

47 Proprieta` della soluzione: Allocazione di risorse a) La sospensione del processo, nel caso in cui la condizione di sincronizzazione non sia soddisfatta, non può avvenire entro la sezione critica in quanto ciò impedirebbe ad un processo che rilascia la risorsa di accedere a sua volta alla sezione critica e di riattivare il processo sospeso. La sospensione avviene al di fuori della sezione critica. b) La specifica del particolare algoritmo di assegnazione della risorsa non è opportuno che sia realizzata nella primitiva V. Nella soluzione proposta è possibile programmare esplicitamente tale algoritmo scegliendo in base ad esso il processo da attivare ed eseguendo V sul suo semaforo privato. 47

48 Lo schema presentato può, in certi casi, presentare degli inconvenienti. 1. l operazione P sul semaforo privato viene sempre eseguita anche quando il processo richiedente non deve essere bloccato. 2. Il codice relativo all assegnazione della risorsa viene duplicato nelle procedure acquisizione e rilascio Si può definire uno schema che non ha questi inconvenienti. 48

49 Allocazione di risorse: secondo schema class tipo_gestore_risorsa{ <struttura dati del gestore>; semaphore mutex = 1; semaphore priv[n] = {0,0,..0; /*semafori privati */ public void acquisizione (int i) { P(mutex); if(! <condizione di sincronizzazione>) { <registrare la sospensione del processo>; V(mutex); P(priv[i]); <registrare che il processo non è più sospeso>; <allocazione della risorsa>; V(mutex); 49

50 public void rilascio( ) { int i; P(mutex); <rilascio della risorsa>; if (<esiste almeno un processo sospeso per il quale la condizione di sincronizz. è soddisfatta>) { <scelta del processo Pi da riattivare>; V(priv[i]); else V(mutex); il risveglio segue lo schema del passaggio di testimone 50

51 Commento A differenza della soluzione precedente, tuttavia, in questo caso risulta più complesso realizzare la riattivazione di più processi per i quali risulti vera contemporaneamente la condizione di sincronizzazione. Lo schema prevede infatti che il processo che rilascia la risorsa attivi al più un processo sospeso, il quale dovrà a sua volta provvedere alla riattivazione di eventuali altri processi. 51

52 Soluzione ai problemi precedenti: esempio 1 class buffer { int richiesta[num_proc]=0;/*richiesta[i]= numero di celle richieste da Pi*/ int sospesi=0; /*numero dei processi prod.sospesi*/ int vuote=n; /*numero di celle vuote del buffer*/ semaphore mutex=1; semaphore priv[num_proc]={0,0,..0; public void acquisizione(int m, int i) /* m dim. messaggio, i nome del processo chiamante */ { P(mutex); if (sospesi==0 && vuote>=m) { vuote=vuote-m; <assegnaz. di m celle al proc.i >; V(priv[i]); else { sospesi++; richiesta[i]=m; V(mutex); P(priv[i]); 52

53 public void rilascio(int m) /* m num. celle rilasciate*/ { int k; P(mutex); vuote+=m; while (sospesi!=0) { <individuazione tra i processi sospesi del processo Pk con la max richiesta> ; if (richiesta[k]<=vuote) { vuote=vuote richiesta[k]; <ass. a Pk delle celle richieste>; richiesta[k]=0; sospesi--; V(priv[k]); else break; /* fine while */ V(mutex); 53

54 Soluzione esempio 2 Soluzione: introduzione delle seguenti variabili: PS[i]: variabile logica che assume il valore vero se il processo Pi è sospeso; il valore falso diversamente. libera[j]: variabile logica che assume il valore falso se la risorsa j-esima è occupata; il valore vero diversamente. disponibili: esprime il numero delle risorse non occupate; sospesi: e` il numero dei processi sospesi; mutex: semaforo di mutua esclusione priv[i]: il semaforo privato del processo Pi. 54

55 class tipo_gestore { semaphore mutex=1; semaphore priv[num_proc]={0,0, 0 /*sem. privati */ int sospesi=0; /*numero dei processi sospesi*/ boolean PS[num_proc]={false, false,, false; int disponibili=num_ris; /*numero di risorse disp.*/ boolean libera[num_ris]={true, true,, true; public int richiesta(int proc) { int i =0; P(mutex); if (disponibili==0) { sospesi ++; PS[proc]=true; V(mutex); P(priv[proc]); PS[proc]=false; sospesi -- ; while (! libera[i]) i++; libera[i]=false; disponibili--; V(mutex ); return i; 55

56 public void rilascio (int r)/* r indice risorsa ril. */ { P(mutex); libera[r]=true; disponibili++; if (sospesi>0) { <seleziona il processo Pj a massima priorità tra quelli sospesi utilizzando PS>; V(priv[j]); else V(mutex); 56

57 Considerazioni sulle soluzioni presentate Ogni processo che nella fase di acquisizione della risorsa trova la condizione di sincronizzazione non soddisfatta, deve lasciare traccia in modo esplicito della sua sospensione entro la sezione critica. Il processo che libera la risorsa deve infatti eseguire la primitiva V(priv(i)) solo se esistono processi sospesi. In tutte le soluzioni è stata introdotta un apposita variabile per indicare il numero dei processi sospesi. La fase di assegnazione di una risorsa ad un processo è separata dalla fase di uso della risorsa stessa. Occorre quindi lasciare traccia in modo esplicito entro la sezione critica della assegnazione e quindi della non disponibilità della risorsa. Nel primo esempio viene decrementata la variabile vuote; nel secondo viene modificata la variabile R. 57

58 Realizzazione dei semafori Introduciamo una possibile implementazione dei semafori, caratterizzata dall'assenza di attesa attiva. E` possibile definire la P e la V nel modo seguente, garantendo comunque la validita` delle proprieta` del semaforo (s.p.d). P(s) V(s) val s ==0 si <cambio contesto> bloccati s >0 si <sveglia processo> no no val s -- val s ++ 58

59 Descrittore di un semaforo: typedef struct{ int contatore; coda_a_livelli coda; des_semaforo; Insieme di tutti i descrittori: des_semaforo semafori[num_max_sem]; Identificazione di un semaforo: typedef int semaphore; 59

60 Ambiente monoprocessore Hp: interruzioni disabilitate Implementazione dell'operazione P: void P(semaphore s) { p_des esec = processo_in_esecuzione; int pri= esec -> servizio.priorità; if(semafori[s].contatore==0) { esec -> stato = < sospeso sul semaforo s >; inserimento (esec,semafori[s].coda[pri]); assegnazione_cpu; else contatore--; 60

61 Implementazione dell'operazione V: void V (semaphore s) { p_des esec = processo_in_esecuzione; p_des p; int pri=0; while(semafori[s].coda[pri].primo==null && pri < min_priorità) pri++; if(semafori[s].coda[pri].primo!=null) { p=prelievo(semafori[s].coda[pri]) attiva(p); else semafori[s].contatore ++; 61

62 Ambiente multiprocessore boolean test_and_set( boolean *a) { boolean test=*a; *a=true; return test; void lock(boolean * x) { while (test_and-set(x)); void unlock(boolean * x) { x=false; 62

63 unlock(x) lock(x) x=false x ==true si no x=true 63

64 Strumenti di sincronizzazione nella libreria LinuxThread e nel linguaggio Java 64

65 I semafori nelle librerie pthread e LinuxThreads La libreria pthread definisce soltanto il semaforo binario (mutex). La Libreria Linuxthread, implementa comunque il semaforo esternamente alla libreria pthread, conformemente allo standard POSIX b 65

66 pthread: MUTEX Lo standard POSIX c (libreria <pthread.h>) definisce i semafori binari (o lock, mutex, etc.) sono semafori il cui valore puo` essere 0 oppure 1 (occupato o libero); vengono utilizzati tipicamente per risolvere problemi di mutua esclusione operazioni fondamentali: inizializzazione: pthread_mutex_init locking: pthread_mutex_lock unlocking: pthread_mutex_unlock Per operare sui mutex: pthread_mutex_t : tipo di dato associato al mutex; esempio: pthread_mutex_t mux; 66

67 MUTEX: inizializzazione L'inizializzazione di un mutex si puo`realizzare con: int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr) attribuisce un valore iniziale all'intero associato al semaforo (default: libero): mutex : individua il mutex da inizializzare attr : punta a una struttura che contiene gli attributi del mutex; se NULL, il mutex viene inizializzato a libero (default). in alternativa, si puo` inizializzare il mutex a default con la macro: PTHREAD_MUTEX_INIZIALIZER esempio: pthread_mutex_t mux= PTHREAD_MUTEX_INIZIALIZER ; 67

68 MUTEX: lock/unlock Locking/unlocking si realizzano con: int pthread_mutex_lock(pthread_mutex_t* mux) int pthread_mutex_unlock(pthread_mutex_t* mux) lock: se il mutex mux e` occupato,il thread chiamante si sospende; altrimenti occupa il mutex. unlock: se vi sono processi in attesa del mutex, ne risveglia uno; altrimenti libera il mutex. 68

69 Esempio #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define MAX 10 pthread_mutex_t M; /* def.mutex condiviso tra threads */ int DATA=0; /* variabile condivisa */ int accessi1=0; /*num. di accessi del thread 1 alla sez critica */ int accessi2=0; /*num. di accessi del thread 2 alla sez critica */ void *thread1_process (void * arg) { int k=1; while(k) { pthread_mutex_lock(&m); /*prologo */ accessi1++; DATA++; k=(data>=max?0:1); printf("accessi di T1: %d\n", accessi1); pthread_mutex_unlock(&m); /*epilogo */ pthread_exit (0); 69

70 Esempio void *thread2_process (void * arg) { int k=1; while(k) { pthread_mutex_lock(&m); /*prologo sez. critica */ accessi2++; DATA++; k=(data>=max?0:1); printf("accessi di T2: %d\n", accessi2); pthread_mutex_unlock(&m); /*epilogo sez. critica*/ pthread_exit (0); 70

71 Esempio: main() { pthread_t th1, th2; /* il mutex e` inizialmente libero: */ pthread_mutex_init (&M, NULL); if (pthread_create(&th1, NULL, thread1_process, NULL) < 0) { fprintf (stderr, "create error for thread 1\n"); exit (1); if (pthread_create(&th2, NULL,thread2_process,NULL) < 0) { fprintf (stderr, "create error for thread 2\n"); exit (1); pthread_join (th1, NULL); pthread_join (th2, NULL); 71

72 Test $ $ gcc -D_REENTRANT -o tlock lock.c -lpthread $./tlock accessi di T2: 1 accessi di T1: 1 accessi di T2: 2 accessi di T1: 2 accessi di T1: 3 accessi di T1: 4 accessi di T1: 5 accessi di T1: 6 accessi di T1: 7 accessi di T1: 8 accessi di T2: 3 $ 72

73 LinuxThreads: Semafori Memoria condivisa: uso dei semafori (POSIX b) Semafori: libreria <semaphore.h> sem_init: inizializzazione di un semaforo sem_wait: implementazione di P sem_post: implementazione di V sem_t : tipo di dato associato al semaforo; esempio: static sem_t my_sem; 73

74 Operazioni sui semafori sem_init: inizializzazione di un semaforo int sem_init(sem_t *sem, int pshared, unsigned int value) attribuisce un valore iniziale all'intero associato al semaforo: sem: individua il semaforo da inizializzare pshared : 0, se il semaforo non e` condiviso tra task, oppure non zero (sempre zero). value : e` il valore iniziale da assegnare al semaforo. sem_t : tipo di dato associato al semaforo; esempio: ritorna sempre 0. static sem_t my_sem; 74

75 Operazioni sui semafori: sem_wait P su un semaforo int sem_wait(sem_t *sem) dove: sem: individua il semaforo sul quale operare. e` la P di Dijkstra: se il valore del semaforo e` uguale a zero, sospende il thread chiamante nella coda associata al semaforo; altrimenti ne decrementa il valore. 75

76 Operazioni sui semafori: sem_post V su un semaforo: int sem_post(sem_t *sem) dove: sem: individua il semaforo sul quale operare. e` la V di Dijkstra: se c'e` almeno un thread sospeso nella coda associata al semaforo sem, viene risvegliato; altrimenti il valore del semaforo viene incrementato. 76

77 Esempio: Semaforo Evento Thread 1 Thread 2 Fase 1 Fase 2 Imposizione di un vincolo temporale: la FASE2 nel thread 1 va eseguita dopo la FASE1 nel thread2. 77

78 Esempio: sincronizzazione /* la FASE2 nel thread 1 va eseguita dopo la FASE1 nel thread 2*/ #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> sem_t my_sem; int V=0; void *thread1_process (void * arg) { printf ("Thread 1: partito!...\n"); /* inizio Fase 2: */ sem_wait (&my_sem); printf ("FASE2: Thread 1: V=%d\n", V); pthread_exit (0); 78

79 void *thread2_process (void * arg) { int i; V=99; printf ("Thread 2: partito!...\n); /* inizio fase 1: */ printf ( FASE1: Thread 2: V=%d\n", V); /* termine Fase 1: sblocco il thread 1*/ sem_post (&my_sem); sleep (1); pthread_exit (0); 79

80 main () { pthread_t th1, th2; void *ret; sem_init (&my_sem, 0, 0); /* semaforo a 0 */ if (pthread_create (&th1, NULL, thread1_process, NULL) < 0) { fprintf (stderr, "pthread_create error for thread 1\n"); exit (1); if (pthread_create(&th2,null, thread2_process, NULL) < 0) {fprintf (stderr, "pthread_create error for thread \n"); exit (1); pthread_join (th1, &ret); pthread_join (th2, &ret); 80

81 Esempio: gcc -D_REENTRANT -o sem sem.c lpthread Esecuzione: threads]$ sem Thread 1: partito!... Thread 2: partito!... FASE1: Thread 2: V=99 FASE2: Thread 1: V=99 threads]$ 81

82 Semafori: esempio /* tre processi che, ciclicamente, incrementano a turno (in ordine P1,P2,P3) la variabile V*/ #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define MAX 13 static sem_t m; /* semaforo per la mutua esclusione nell accesso alla sezione critica */ static sem_t s1,s2,s3; /* semafori per imporre l ordine di accesso (P1,P2,P3) alla variabile V */ int V=0,F=0; 82

83 void *thread1_process (void * arg) { int k=1; while(k) { sem_wait (&s1); sem_wait(&m); if (V<MAX) V++; else { k=0; printf("t1: %d (V=%d)\n",++F, V); sem_post(&m); sem_post(&s2); pthread_exit (0); 83

84 void *thread2_process (void * arg) { int k=1; while(k) { sem_wait (&s2); sem_wait(&m); if (V<MAX) V++; else { k=0; printf("t2: %d (V=%d)\n",++F, V); sem_post(&m); sem_post(&s3); pthread_exit (0); 84

85 void *thread3_process (void * arg) { int k=1; while(k) { sem_wait (&s3); sem_wait(&m); if (V<MAX) V++; else { k=0; printf("t3: %d (V=%d)\n",++F, V); sem_post(&m); sem_post(&s1); pthread_exit (0); 85

86 main () { pthread_t th1, th2,th3; sem_init (&m, 0, 1); sem_init(&s1,0,1); sem_init(&s2,0,0); sem_init(&s3,0,0); if (pthread_create(&th1, NULL, thread1_process, NULL) < 0) { fprintf (stderr, "pthread_create error for thread 1\n"); exit (1); if (pthread_create(&th2, NULL,thread2_process,NULL) < 0) { fprintf (stderr, "pthread_create error for thread 2\n"); exit (1); if (pthread_create(&th3,null,thread3_process, NULL) < 0) { fprintf (stderr, "pthread_create error for thread 3\n"); exit (1); 86

87 pthread_join (th1, NULL); pthread_join (th2, NULL); pthread_join (th3, NULL); 87

88 Sincronizzazione in Java Modello a memoria comune: I threads di una applicazione condividono lo spazio di indirizzamento. Ogni tipo di interazione tra thread avviene tramite oggetti comuni: Interazione di tipo competitivo (mutua esclusione): meccanismo degli objects locks. Interazione di tipo cooperativo: meccanismo wait-notify. variabili condizione 88

89 Semafori in Java Non esiste una classe che implementi i semafori. E` possibile implementarli sfruttando altri strumenti di sincronizzazione (ad es. wait/notify, Variabili Condizione). Il linguaggio prevede costrutti specifici per risolvere il problema della mutua esclusione: statement syncronized 89

90 Mutua esclusione Ad ogni oggetto viene associato dalla JVM un lock (analogo ad un semaforo binario). E possibile denotare alcune sezioni di codice che operano su un oggetto come sezioni critiche tramite la parola chiave synchronized. Il compilatore inserisce : un prologo in testa alla sezione critica per l acquisizione del lock associato all oggetto. un epilogo alla fine della sezione critica per rilasciare il lock. 90

91 Blocchi synchronized Con riferimento ad un oggetto x si può definire un blocco di statement come una sezione critica nel seguente modo (synchronized blocks): synchronized (oggetto x) {<sequenza di statement>; Esempio: Object mutexlock= new Object;.. public void M( ) { <sezione di codice non critica>; synchronized (mutexlock){ < sezione di codice critica>; <sezione di codice non critica>; 91

92 all'oggetto mutexlock viene implicitamente associato un lock, il cui valore puo` essere: libero: il thread può eseguire la sezione critica occupato: il thread viene sospeso dalla JVM in una coda associata a mutexlock (entry set). Al termine della sezione critica: se non ci sono thread in attesa: il lock viene reso libero. se ci sono thread in attesa: il lock rimane occupato e viene scelto uno di questi. 92

93 synchronized block esecuzione del blocco mutuamente esclusiva rispetto: ad altre esecuzioni dello stesso blocco all esecuzione di altri blocchi sincronizzati sullo stesso oggetto 93

94 Entry set di un oggetto Object ob t 1 lock synchronized (ob){ ; a) lock libero t 2 t 3 lock Object ob synchronized (ob){ ; t 1 a) lock occupato: t2 e t3 vengono inseriti nell'entry set di ob 94

95 Metodi synchronized Mutua esclusione tra i metodi di una classe public class intvar { private int i=0; public synchronized void incrementa() { i ++; public synchronized void decrementa() {i--; Quando un metodo viene invocato per operare su un oggetto della classe, l esecuzione del metodo avviene in mutua esclusione utilizzando il lock dell oggetto. 95

Esercitazione 2! Mutex e semafori POSIX. 3 Novembre 2016

Esercitazione 2! Mutex e semafori POSIX. 3 Novembre 2016 Esercitazione 2! Mutex e semafori POSIX 3 Novembre 2016 Strumenti di sincronizzazione nella libreria LinuxThread I semafori nelle librerie pthread e LinuxThreads La libreria pthread definisce soltanto

Dettagli

Il semaforo. Strumento linguistico di basso livello per risolvere problemi di sincronizzazione.

Il semaforo. Strumento linguistico di basso livello per risolvere problemi di sincronizzazione. Il semaforo 1 Il semaforo Strumento linguistico di basso livello per risolvere problemi di sincronizzazione. Il meccanismo semaforico e` normalmente utilizzato a livello di macchina concorrente per realizzare

Dettagli

Il semaforo. Strumento linguistico di basso livello per risolvere problemi di sincronizzazione.

Il semaforo. Strumento linguistico di basso livello per risolvere problemi di sincronizzazione. Il semaforo 1 Il semaforo Strumento linguistico di basso livello per risolvere problemi di sincronizzazione. Il meccanismo semaforico e` normalmente utilizzato a livello di macchina concorrente per realizzare

Dettagli

LinuxThreads: I thread nel sistema operativo LINUX: Linuxthreads. LinuxThreads. LinuxThreads

LinuxThreads: I thread nel sistema operativo LINUX: Linuxthreads. LinuxThreads. LinuxThreads I thread nel sistema operativo LINUX: Linuxthreads : Caratteristiche Processi leggeri realizzati a livello kernel System call clone: int clone(int (*fn) (void *arg), void *child_stack, int flags, void

Dettagli

I thread nel sistema operativo LINUX: Linuxthreads

I thread nel sistema operativo LINUX: Linuxthreads I thread nel sistema operativo LINUX: Linuxthreads LinuxThreads: Caratteristiche Processi leggeri realizzati a livello kernel System call clone: int clone(int (*fn) (void *arg), void *child_stack, int

Dettagli

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java programmi sorgente: files.java compilatore Indipendenza di java dalla macchina ospite Programmi java Programmi java Programmi java files.class bytecode linker/loader bytecode bytecode Java API files.class

Dettagli

Modelli di interazione tra processi

Modelli di interazione tra processi Modelli di interazione tra processi Modello a memoria comune (ambiente globale, global environment) Modello a scambio di messaggi (ambiente locale, message passing) 1 Modello a memoria comune 2 Modello

Dettagli

SEMAFORI SEMAFORI. Sul semaforo sono ammesse solo due operazioni (primitive)

SEMAFORI SEMAFORI. Sul semaforo sono ammesse solo due operazioni (primitive) SEMAFORI 1 SEMAFORI Variabile intera non negativa con valore iniziale >= 0 Al semaforo è associata una lista di attesa Qs nella quale sono posti i descrittori dei processi che attono l autorizzazione a

Dettagli

istruzioni eseguite in ordine predeterminabile in base al codice del programma e dei valori dei dati in ingresso

istruzioni eseguite in ordine predeterminabile in base al codice del programma e dei valori dei dati in ingresso Programmazione Concorrente sequenze critiche e mutua esclusione istruzioni atomiche deadlock sincronizzazione e semafori settembre 2009 programmazione concorrente 1 modello di esecuzione sequenziale istruzioni

Dettagli

Monitor [Hoare 74] Costrutto sintattico che associa un insieme di procedure/funzioni (entry) ad una struttura dati comune a più processi.

Monitor [Hoare 74] Costrutto sintattico che associa un insieme di procedure/funzioni (entry) ad una struttura dati comune a più processi. Monitor [Hoare 74] Costrutto sintattico che associa un insieme di procedure/funzioni (entry) ad una struttura dati comune a più processi. Il compilatore può verificare che esse siano le sole operazioni

Dettagli

Monitor [Hoare 74] Uso del monitor

Monitor [Hoare 74] Uso del monitor Monitor [Hoare 74] Costrutto sintattico che associa un insieme di procedure/funzioni (entry) ad una struttura dati comune a più processi. Il compilatore può verificare che esse siano le sole operazioni

Dettagli

Corso di Laboratorio di Sistemi Operativi

Corso di Laboratorio di Sistemi Operativi Corso di Laboratorio di Sistemi Operativi Lezione 7 Alessandro Dal Palù email: alessandro.dalpalu@unipr.it web: www.unipr.it/~dalpalu Threads Un thread è l unità di base per l utilizzo della CPU. Composto

Dettagli

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati Condizione di sincronizzazione Qualora si voglia realizzare una determinata politica di gestione delle risorse,la decisione se ad

Dettagli

LinuxThreads. LinuxThreads: monitor & variabili condizione

LinuxThreads. LinuxThreads: monitor & variabili condizione LinuxThreads Variabili Condizione LinuxThreads: monitor & variabili condizione Lo standard POSIX 1003.1c (libreria ) non implementa il costrutto Monitor ma implementa i mutex implementa le variabili

Dettagli

Cosa sono i semafori?

Cosa sono i semafori? Semafori Cosa sono i semafori? I semafori sono primitive fornite dal sistema operativo per permettere la sincronizzazione tra processi e/o thread. Semafori di mutua esclusione con i thread POSIX 2 Operazioni

Dettagli

Chiamata di procedura remota

Chiamata di procedura remota Con gli strumenti gia` visti, si puo` realizzare come segue: lato chiamante: send asincrona immediatamente seguita da una receive lato chiamato: una receive seguita, al termine dell azione richiesta, da

Dettagli

Esercizio sul Monitor. Ponte con utenti grassi e magri 11 Novembre 2013

Esercizio sul Monitor. Ponte con utenti grassi e magri 11 Novembre 2013 Esercizio sul Monitor Ponte con utenti grassi e magri 11 Novembre 2013 1 Ponte con utenti grassi e magri Si consideri un ponte pedonale che collega le due rive di un fiume. Al ponte possono accedere due

Dettagli

Semafori. Semafori classici con i thread POSIX 2

Semafori. Semafori classici con i thread POSIX 2 Semafori classici Semafori I semafori sono primitive, implementate attraverso dei contatori, fornite dal sistema operativo per permettere la sincronizzazione tra processi e/o thread. Per queste primitive

Dettagli

Il monitor. Sistemi Operativi T AA

Il monitor. Sistemi Operativi T AA Il monitor Sistemi Operativi T AA 2009-2010 1 Costrutti linguistici per la sincronizzazione I semafori costituiscono un meccanismo molto potente per la sincronizzazione dei processi. Tuttavia, il loro

Dettagli

Esercizi di utilizzo del semaforo semplice di competizione per l'uso di una risorsa comune

Esercizi di utilizzo del semaforo semplice di competizione per l'uso di una risorsa comune Esercizi di utilizzo del semaforo semplice di competizione per l'uso di una risorsa comune a) Uso di una risorsa condivisa Siano P 1, P 2, P 3,, P k i processi che condividono l uso di una risorsa comune

Dettagli

Java Virtual Machine

Java Virtual Machine Java Virtual Machine programmi sorgente: files.java compilatore files.class bytecode linker/loader bytecode bytecode Java API files.class interprete macchina ospite Indipendenza di java dalla macchina

Dettagli

Monitor. Le procedure entry sono le sole operazioni che possono essere utilizzate dai processi per accedere alle variabili comuni.

Monitor. Le procedure entry sono le sole operazioni che possono essere utilizzate dai processi per accedere alle variabili comuni. Monitor Costrutto sintattico che associa un insieme di procedure ad una struttura dati comune a più processi. Il compilatore può verificare che esse siano le sole operazioni permesse su quella struttura.

Dettagli

Il costrutto monitor

Il costrutto monitor Il Monitor 1 Monitor Definizione del monitor Esempi d uso Realizzazione del costrutto monitor Realizzazione di politiche di gestione delle risorse Chiamate innestate a procedure del monitor Realizzazione

Dettagli

il tipo di parallelismo dipende dal grado di cooperazione

il tipo di parallelismo dipende dal grado di cooperazione Thread Settembre 2009 programma e parallelismo il tipo di parallelismo dipende dal grado di cooperazione (scambio d informazione) necessario tra attività svolte in parallelo processo macchina virtuale

Dettagli

Tipi di POSIX Semaphores

Tipi di POSIX Semaphores Semafori POSIX Sono una particolare implementazione dei semafori. Possono svolgere il ruolo di semafori binari o generali (n-ari) a seconda di quale valore viene loro assegnato all'atto della inizializzazione

Dettagli

ESERCIZIO SincrAmbGlob-1

ESERCIZIO SincrAmbGlob-1 ESERCIZI DI SINCRONIZZAZIONE TRA THREAD CON SEMAFORI ESERCIZIO SincrAmbGlob-1 Si consideri un sistema nel quale è definito il semaforo sem1 e i thread P1, P2 e P3. Al tempo t il semaforo sem1 ha la seguente

Dettagli

Le risorse. Alcune definizioni

Le risorse. Alcune definizioni Le risorse Dicesi risorsa un qualunque oggetto, fisico o logico, di cui un processo necessita per portare a termine la sua evoluzione. Poiché un processo evolve eseguendo istruzioni (procedure), una risorsa

Dettagli

Esempio: la Toilette Unisex

Esempio: la Toilette Unisex Esempio: la Toilette Unisex Si consideri la toilette di un ristorante. La toilette è unica per uomini e donne. Utilizzando i semafori forniti dalla libreria LinuxThreads, si realizzi un'applicazione concorrente

Dettagli

Modelli di interazione tra processi

Modelli di interazione tra processi Modelli di interazione tra processi Modello a memoria comune (ambiente globale, global environment) Modello a scambio di messaggi (ambiente locale, message passing) 1 Modello a memoria comune Il sistema

Dettagli

Le System Call di Unix/Linux. 11 Febbraio 2005

Le System Call di Unix/Linux. 11 Febbraio 2005 Le System Call di Unix/Linux 11 Febbraio 2005 Dual mode Il S.O. esegue in modo kernel. Ogni programma utente esegue in user mode Quando un programma utente tenta l esecuzione di una istruzione privilegiata,

Dettagli

Modelli di interazione tra processi

Modelli di interazione tra processi Modelli di interazione tra processi Modello a memoria comune (ambiente globale, global environment) Modello a scambio di messaggi (ambiente locale, message passing) 1 Modello a memoria comune Il sistema

Dettagli

ACSO Programmazione di Sistema e Concorrente

ACSO Programmazione di Sistema e Concorrente ACSO Programmazione di Sistema e Concorrente P2 Modello Thread 2/12/2015 programma e parallelismo il tipo di parallelismo dipende dal grado di cooperazione (scambio di informazione) necessario tra attività

Dettagli

Sincronizzazione. I semafori Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Sincronizzazione. I semafori Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino Sincronizzazione I semafori Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino 2 Introduzione Le soluzioni Software sono complesse da utilizzare dal punto di vista del programmatore

Dettagli

Il monitor. Costrutti linguistici per la sincronizzazione

Il monitor. Costrutti linguistici per la sincronizzazione Il monitor 1 Costrutti linguistici per la sincronizzazione I semafori costituiscono un meccanismo molto potente per la sincronizzazione dei processi. Tuttavia, il suo uso può risultare troppo a basso livello.

Dettagli

Sistemi operativi - Concetti ed esempi -Settima edizione

Sistemi operativi - Concetti ed esempi -Settima edizione Capitolo 6: Sincronizzazione dei processi Capitolo 6: Sincronizzazione dei processi Introduzione Problema della sezione critica Soluzione di Peterson Hardware per la sincronizzazione Semafori Problemi

Dettagli

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009 Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009 Luca Fossati, Fabrizio Castro, Vittorio Zaccaria October 10, 2009 Sincronizzazione - 1 1 Esercizio 1: Sincronizzazione - 1 Qual è il problema

Dettagli

Il costrutto monitor [Hoare 74]

Il costrutto monitor [Hoare 74] Il monitor 1 Il costrutto monitor [Hoare 74] Definizione: Costrutto sintattico che associa un insieme di operazioni (entry o public) ad una struttura dati comune a più processi, tale che: Le operazioni

Dettagli

Linuxthreads: esercizio

Linuxthreads: esercizio Linuxthreads: esercizio Esercizio Una società di noleggio di automobili offre ai propri clienti tre tipi di automobili: piccole, medie, grandi. Ogni tipo di auto è disponibile in numero limitato (Npiccole,

Dettagli

Monitor pthreads. Esercizio

Monitor pthreads. Esercizio Monitor pthreads Esercizio Esercizio monitor Una società di noleggio di automobili offre ai propri clienti tre tipi di automobili: piccole, medie, grandi. Ogni tipo di auto è disponibile in numero limitato

Dettagli

Sistemi Operativi e Laboratorio, Prova del 6/4/2017 versione A

Sistemi Operativi e Laboratorio, Prova del 6/4/2017 versione A Nome: Cognome: Matricola: corso: fila: posto: Esercizio 1 (5 punti) Si consideri un processore che dispone dei registri speciali PC (program counter) e PS (program status), dello stack pointer SP e dei

Dettagli

Il costrutto monitor

Il costrutto monitor Il Monitor 1 Monitor Definizione del monitor Esempi d uso Realizzazione del costrutto monitor Realizzazione di politiche di gestione delle risorse Chiamate innestate a procedure del monitor Realizzazione

Dettagli

Esercitazione n.1 24 Ottobre Obiettivi:

Esercitazione n.1 24 Ottobre Obiettivi: Esercitazione n.1 24 Ottobre 2013 Obiettivi: Gestione dei thread mediante libreria pthreads: creazione: pthread_create terminazione: pthread_exit join: pthread_join 1 Richiami sui thread 2 Processi Immagine

Dettagli

Lab 4: Locks, Condition Variables in Java

Lab 4: Locks, Condition Variables in Java Dept. of Computer Science Lab 4: Locks, Condition Variables in Java Matteo Camilli matteo.camilli@unimi.it Laboratorio di Sistemi Operativi a.a. 2015/16 Università degli Studi di Bergamo 1 Esercizi Lab3

Dettagli

Perche le CPU multicore

Perche le CPU multicore Perche le CPU multicore I processi industriali producono chip sempre piu densi in termini di transistor 2000 Inoltre: Watt ~ Volt 2 x frequenza Frequenza ~ Volt Watt ~ frequenza 3 Il rapporto Watt/mm 2

Dettagli

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2016-17 Pietro Frasca Lezione 20 Giovedì 22-12-2016 Comunicazione: pipe In Unix, processi possono comunicare

Dettagli

CAPITOLO 22 PROBLEMA DEL PRODUTTORE/CONSUMATORE

CAPITOLO 22 PROBLEMA DEL PRODUTTORE/CONSUMATORE CAPITOLO 22 PROBLEMA DEL PRODUTTORE/CONSUMATORE Il problema del produttore/consumatore Il primo approccio alla risoluzione del problema del produttore/consumatore considera un buffer infinito presentato

Dettagli

Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java Decima Esercitazione Accesso a risorse condivise tramite Monitor Java 1 Agenda Esempio 1 La banca: gestione di una risorsa condivisa da più thread, con politica prioritaria Esercizio 2 da svolgere Accesso

Dettagli

Modello a scambio di messaggi

Modello a scambio di messaggi Modello a scambio di messaggi Aspetti caratterizzanti il modello Canali di comunicazione Primitive di comunicazione 1 Aspetti caratterizzanti il modello modello architetturale di macchina (virtuale) concorrente

Dettagli

PROCESSI NON SEQUENZIALI E TIPI DI INTERAZIONE

PROCESSI NON SEQUENZIALI E TIPI DI INTERAZIONE PROCESSI NON SEQUENZIALI E TIPI DI INTERAZIONE 1 ALGORITMO, PROGRAMMA, PROCESSO Algoritmo Procedimento logico che deve essere eseguito per risolvere un determinato problema. Programma Descrizione di un

Dettagli

CAPITOLO 17 PROBLEMI DEL PRODUTTORE/CONSUMATORE v1

CAPITOLO 17 PROBLEMI DEL PRODUTTORE/CONSUMATORE v1 CAPITOLO 17 PROBLEMI DEL PRODUTTORE/CONSUMATORE v1 PRODUTTORE/CONSUMATORE Il problema del produttore/consumatore è uno dei problemi più comuni di concorrenza tra processi. Il problema presenta uno o più

Dettagli

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2016-17 Pietro Frasca Lezione 9 Giovedì 10-11-2016 Semafori un semaforo s è una struttura dati gestita

Dettagli

Sincronizzazione fra processi

Sincronizzazione fra processi Sincronizzazione fra processi Mutex Semafori 3.1 Mutex Tutte le variabili e le risorse condivise vanno protette mediante una qualche forma di sincronizzazione. Senza sincronizzazione, applicazioni concorrenti

Dettagli

Soluzioni ai problemi di Mutua Esclusione Primitive di sincronizzazione. Soluzioni ai problemi di Mutua EsclusionePrimitive di sincronizzazione

Soluzioni ai problemi di Mutua Esclusione Primitive di sincronizzazione. Soluzioni ai problemi di Mutua EsclusionePrimitive di sincronizzazione Soluzioni ai problemi di Mutua Esclusione Primitive di sincronizzazione Soluzioni basate su primitive di sincronizzazione Le primitive di sincronizzazione piú comuni sono: Lock (mutex) - realizzati in

Dettagli

Concorrenza e sincronizzazione

Concorrenza e sincronizzazione Concorrenza e sincronizzazione Ingegneria del software Ing. Jody Marca jody.marca@polimi.it Cosa faremo oggi 2 Concorrenza Sincronizzazione Concorrenza 3 Nei programmi Java fino ad ora sviluppati è presente

Dettagli

Thread in Java. Thread = flusso di esecuzione indipendente nel codice del programma

Thread in Java. Thread = flusso di esecuzione indipendente nel codice del programma Thread in Java Thread = flusso di esecuzione indipendente nel codice del programma Come si può realizzare il concetto di Thread in Java? Seguendo la filosofia OO: sono oggetti particolari ai quali si richiede

Dettagli

Sistemi Operativi e Laboratorio, Prova del 15/01/2014

Sistemi Operativi e Laboratorio, Prova del 15/01/2014 Cognome e nome: Matricola: Corso [A/B] : fila: posto: Esercizio 1 (4 punti) Si consideri un processore che dispone dei registri speciali PC (program counter), PS (program status) e SP (stack pointer),

Dettagli

Sistemi Operativi L-A. Esercizi 14 Giugno 2007. Esercizio monitor

Sistemi Operativi L-A. Esercizi 14 Giugno 2007. Esercizio monitor Sistemi Operativi L-A Esercizi 14 Giugno 2007 Esercizio monitor Si consideri la toilette di un ristorante. La toilette è unica per uomini e donne. Utilizzando la libreria pthread, si realizzi un'applicazione

Dettagli

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche Fondamenti di Informatica Algebra di Boole: Concetti di base Fondamenti di Informatica - D. Talia - UNICAL Algebra di Boole E un algebra basata su tre operazioni logiche OR AND NOT Ed operandi che possono

Dettagli

Esercitazione [11] Riepilogo sui Semafori. Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo

Esercitazione [11] Riepilogo sui Semafori. Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo Esercitazione [11] Riepilogo sui Semafori Leonardo Aniello - aniello@dis.uniroma1.it Daniele ConoD'Elia - delia@dis.uniroma1.it Federico Lombardi - lombardi@dis.uniroma1.it Sistemi di Calcolo - Secondo

Dettagli

Esercizio monitor con pthreads

Esercizio monitor con pthreads Esercizio monitor con pthreads Si consideri la pista di pattinaggio sul ghiaccio di una località turistica montana. La pista di pattinaggio è aperta a tutti. In particolare i clienti dell impianto si suddividono

Dettagli

Principles of Concurrent Programming

Principles of Concurrent Programming Principles of Giuseppe Anastasi g.anastasi@iet.unipi.it Pervasive Computing & Networking Lab. () Dept. of Information Engineering, University of Pisa Overview Concetti preliminari Interazione fra processi

Dettagli

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Dettagli

Thread. Introduzione Creazione, distruzione Sincronizzazione

Thread. Introduzione Creazione, distruzione Sincronizzazione Thread Introduzione Creazione, distruzione Sincronizzazione Parallelismo Il tipo di meccanismo a supporto del parallelismo dipende dal grado di cooperazione tra le varie entità che costituiscono un'applicazione

Dettagli

Il costrutto monitor [Hoare 74]

Il costrutto monitor [Hoare 74] Il monitor 1 Il costrutto monitor [Hoare 74] Definizione: Costrutto sintattico che associa un insieme di operazioni (entry, o public) ad una struttura dati comune a più processi, tale che: Le operazioni

Dettagli

Sincronizzazione Le sezioni scritiche

Sincronizzazione Le sezioni scritiche Sincronizzazione Le sezioni scritiche Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino 2 Ambiente di sviluppo Concorrenza e sincronizzazione Programmazione concorrente (tramite

Dettagli

Sistemi Operativi. Lezione 7 Comunicazione tra processi

Sistemi Operativi. Lezione 7 Comunicazione tra processi Lezione 7 Comunicazione tra processi Introduzione La soluzione sw al problema della mutua esclusione è abbastanza complessa Algoritmo di Peterson La soluzione hw mediante disabilitazione degli interrupt

Dettagli

Unità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso

Unità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso Unità Didattica 2 Linguaggio C Espressioni, Operatori e Strutture linguistiche per il controllo del flusso 1 Espressioni e assegnazioni Le espressioni sono definite dalla grammatica: espressione = variabile

Dettagli

SOLUZIONE. ESERCIZIO PRODUTTORE CONSUMATORE (semafori)

SOLUZIONE. ESERCIZIO PRODUTTORE CONSUMATORE (semafori) ESERCIZIO PRODUTTORE CONSUMATORE (semafori) In un sistema operativo, i thread A (produttore) e B (consumatore) cooperano scambiandosi messaggi attraverso un buffer di 10 celle, ciascuna capace di contenere

Dettagli

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 16 luglio 2015 Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine consegnare

Dettagli

Esercitazione 2: Java Thread. Java Thread. Java Thread. Un thread:

Esercitazione 2: Java Thread. Java Thread. Java Thread. Un thread: Esercitazione 2: Thread Un thread è un singolo flusso sequenziale di controllo all interno di un processo Un thread (o processo leggero) è un unità di esecuzione che condivide codice e dati con altri thread

Dettagli

Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002. Sistemi Operativi Corsi A e B. Esercitazioni 7 e 8

Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002. Sistemi Operativi Corsi A e B. Esercitazioni 7 e 8 Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002 Corsi A e B Esercitazioni 7 e 8 Bounded Buffer con sincronizzazione Java (1) public class BoundedBuffer private

Dettagli

Interazione tra Processi. Sistemi Operativi T AA

Interazione tra Processi. Sistemi Operativi T AA Interazione tra Processi Sistemi Operativi T AA 2009-2010 1 Classificazione: Processi interagenti processi interagenti/indipendenti: due processi sono interagenti se l esecuzione di un processo è in alcun

Dettagli

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso

Dettagli

Perché il linguaggio C?

Perché il linguaggio C? Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare

Dettagli

I THREAD. thread 2. thread 1

I THREAD. thread 2. thread 1 I THREAD Un thread è un singolo flusso di istruzioni, all interno di un processo, che lo scheduler può fare eseguire separatamente e concorrentemente con il resto del processo. Per fare questo uno thread

Dettagli

Principles of Concurrent Programming

Principles of Concurrent Programming Principles of Giuseppe Anastasi g.anastasi@iet.unipi.it Pervasive Computing & Networking Lab. () Dept. of Information Engineering, University of Pisa Overview Concetti preliminari Interazione fra processi

Dettagli

Il Modello a scambio di messaggi

Il Modello a scambio di messaggi Il Modello a scambio di messaggi 1 Interazione nel modello a scambio di messaggi Se la macchina concorrente e` organizzata secondo il modello a scambio di messaggi: PROCESSO=PROCESSO PESANTE non vi è memoria

Dettagli

Sistemi Operativi. Lezione 7-bis Esercizi

Sistemi Operativi. Lezione 7-bis Esercizi Sistemi Operativi Lezione 7-bis Esercizi Esercizio Problema dei lettori e scrittori Un insieme di processi condivide un file dal quale alcuni possono solo leggere i dati, altri solo scriverli Più lettori

Dettagli

L'Allocazione Dinamica della Memoria nel linguaggio C

L'Allocazione Dinamica della Memoria nel linguaggio C L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego riochierego@libero.it http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria

Dettagli

Sincronizzazione. Soluzioni hardware Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Sincronizzazione. Soluzioni hardware Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino Sincronizzazione Soluzioni hardware Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino 2 Soluzioni hardware Le soluzioni hardware al problema della SC possono essere classificate

Dettagli

SOLUZIONE. <l auto arriva all ingresso I> while PostiDisponibili == 0

SOLUZIONE. <l auto arriva all ingresso I> while PostiDisponibili == 0 ESERCIZIO parcheggio Un parcheggio per auto della capacità di 10 posti è dotato di un unico ingresso I e un unica uscita U. L ingresso e l uscita sono controllate da sbarre. Le auto sono thread di uno

Dettagli

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Dettagli

Introduzione al Multithreading

Introduzione al Multithreading Introduzione al Multithreading Claudia Calidonna Istituto di di Cibernetica C.N.R. Argomenti principali Parleremo di : Processi & Threads Operazioni sui threads ed eventuali confronti tra operazioni sui

Dettagli

Il Modello a scambio di messaggi

Il Modello a scambio di messaggi Il Modello a scambio di messaggi PRIMITIVE PER LO SCAMBIO DI MESSAGGI Un messaggio si può considerare costituito da: origine, destinazione e contenuto typedef struct{ origine; destinazione; contenuto;

Dettagli

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Dettagli

Le basi del linguaggio Java

Le basi del linguaggio Java Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli ELEMENTI DI INFORMATICA L-B Ing. Claudia Chiusoli Materiale Lucidi delle lezioni Date degli appelli Testi di esami precedenti Informazioni e contatti http://www.lia.deis.unibo.it/courses/ Programma del

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Thread. La libreria Pthread Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Thread. La libreria Pthread Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino Thread La libreria Pthread Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino 2 Librerie di thread Fornisce l interfaccia per effettuare la gestione dei thread da parte del programmatore

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

Sincronizzazione. Problemi di sincronizzazione tipici Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Sincronizzazione. Problemi di sincronizzazione tipici Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino Sincronizzazione Problemi di sincronizzazione tipici Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino 2 Produttore-Consumatore Produttore e consumatore con memoria limitata Utilizza

Dettagli

SC che operano su thread. pthread_create() etc...

SC che operano su thread. pthread_create() etc... SC che operano su thread pthread_create() etc... 1 Thread POSIX Obiettivi Fornire una breve introduzione descrivere alcune delle numerose SC relative ai thread POSIX fare qualche esempio concreto Finora

Dettagli

THREAD. Programmazione in rete e laboratorio. Come si crea un thread

THREAD. Programmazione in rete e laboratorio. Come si crea un thread Programmazione in rete e laboratorio JAVA - Thread Alberto Martelli THREAD Thread: flusso sequenziale di controllo (esecuzione di istruzioni) in un programma. Nello stesso programma si possono far partire

Dettagli

Sistemi operativi Sincronizzazione fra processi

Sistemi operativi Sincronizzazione fra processi Sistemi operativi 2003-2004 Sincronizzazione fra processi Introduzione I processi devono poter comunicare tra loro in modo strutturato e preciso Per passarsi informazioni Per non interferire con gli altri

Dettagli

Espressioni logiche. Espressioni logiche. Operatori logici. Operatori logici. Operatori logici. Espressioni Logiche e Istruzione di Test

Espressioni logiche. Espressioni logiche. Operatori logici. Operatori logici. Operatori logici. Espressioni Logiche e Istruzione di Test Espressioni logiche Espressioni Logiche e Istruzione di Test Fondamenti di Informatica 1 Massimo Di Nanni Gennaio, 2001 Espressioni logiche nelle Istruzioni di Test e di Iterazione Calcolo del massimo

Dettagli

Modelli di interazione tra processi

Modelli di interazione tra processi Modelli di interazione tra processi Modelli di interazione Modello a memoria comune (ambiente globale) Modello a scambio di messaggi (ambiente locale, message passing) Modello a memoria comune Il sistema

Dettagli

Architettura degli Elaboratori 2

Architettura degli Elaboratori 2 Architettura degli Elaboratori 2 Esercitazioni 2 Grafo di allocazione delle risorse Comunicazione tra processi A. Memo - 2004 Grafo di allocazione delle risorse è uno strumento grafico utile per l individuazione

Dettagli

Calcolare x n = x x x (n volte)

Calcolare x n = x x x (n volte) Calcolare x n = x x x (n volte) Abbiamo bisogno di: una variabile ris in cui ad ogni iterazione del ciclo si ha un risultato parziale, e che dopo l ultima iterazione contiene il risultato finale; una variabile

Dettagli