Capitolo 7: Sincronizzazione



Documenti analoghi
Sommario. G. Piscitelli

Monitor. Introduzione. Struttura di un TDA Monitor

Pronto Esecuzione Attesa Terminazione

Sistemi Operativi. Lezione 7 Comunicazione tra processi

Sistemi Operativi. Lez. 13: primitive per la concorrenza monitor e messaggi

DMA Accesso Diretto alla Memoria

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Introduzione. Coordinazione Distribuita. Ordinamento degli eventi. Realizzazione di. Mutua Esclusione Distribuita (DME)

Java Virtual Machine

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Coordinazione Distribuita

GESTIONE DEI PROCESSI

Sistemi Operativi mod. B. Sistemi Operativi mod. B A B C A B C P P P P P P < P 1, >

Meccanismi di sincronizzazione: Semafori e Monitor

Il costrutto monitor [Hoare 74]

1. Che cos è la multiprogrammazione? Si può realizzare su un sistema monoprocessore? 2. Quali sono i servizi offerti dai sistemi operativi?

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

Corso di Programmazione Concorrente

FONDAMENTI di INFORMATICA L. Mezzalira

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

Il Sistema Operativo

Introduzione. Meccanismi di sincronizzazione: Semafori e Monitor. Semafori - Definizione. Semafori - Descrizione informale

Il costrutto monitor [Hoare 74]

SISTEMI OPERATIVI. Sincronizzazione dei processi. Domande di verifica. Luca Orrù Centro Multimediale Montiferru 30/05/2007

ESERCIZIO 1 (b) Dove è memorizzato il numero del primo blocco del file? Insieme agli altri attributi del file, nella cartella che contiene il file.

CAPITOLO 24 I MONITOR

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione

STRUTTURE DEI SISTEMI DI CALCOLO

Corso di Sistemi di Elaborazione delle informazioni

La Gestione delle risorse Renato Agati

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Scheduling. Sistemi Operativi e Distribuiti A.A Bellettini - Maggiorini. Concetti di base

INFORMATICA 1 L. Mezzalira

SISTEMI OPERATIVI. Sincronizzazione in Java (Monitor e variabili condizione in Java)

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Corso di Linguaggi di Programmazione

Il problema del produttore e del consumatore. Cooperazione tra processi

SISTEMI OPERATIVI. Deadlock (blocco critico) Domande di verifica. Luca Orrù Centro Multimediale Montiferru 04/06/2007

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

IL SISTEMA OPERATIVO

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

I THREAD O PROCESSI LEGGERI Generalità

Multithreading in Java. Fondamenti di Sistemi Informativi

Definizione di processo. Un processo è un programma (o una parte di una programma) in corso di esecuzione

Sistemi Operativi (modulo di Informatica II) I processi

Architettura hardware

Sistemi Operativi Esercizi Sincronizzazione

Sistemi Operativi Kernel

DTI / ISIN / Titolo principale della presentazione. La cena dei filosofi. Amos Brocco, Ricercatore, DTI / ISIN. 14 maggio 2012

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Corso di Laurea in Ingegneria Informatica e Biomedica. Sistemi Operativi A.A. ( )

Protezione. Protezione. Protezione. Obiettivi della protezione

1 Processo, risorsa, richiesta, assegnazione 2 Concorrenza 3 Grafo di Holt 4 Thread 5 Sincronizzazione tra processi

Deadlock e Starvation

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

CAPITOLO 27 SCAMBIO DI MESSAGGI

Informatica: il sistema operativo

Java threads (2) Programmazione Concorrente

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

Modello dei processi. Riedizione delle slide della Prof. Di Stefano

Esercizio di Sincronizzazione tra Processi: Ponte a Senso Unico Alternato con Capacità Limitata

Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D

Scheduling della CPU Simulazione in linguaggio Java

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Deadlock (stallo) Parte III. Deadlock

Circuiti sequenziali e elementi di memoria

La schedulazione. E.Mumolo

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

CAPITOLO 7 - SCAMBIO DI MESSAGGI

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Esercizi sugli Oggetti Monitor

Gestione della memoria centrale

CAPITOLO 3 : I PROCESSI

Mul&programmazione. Ges&one dei processi. Esecuzione parallela. MAC OSX Monitoraggio a9vità. Linux System monitor. Windows Task Manager. A.

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Sistemi Operativi. Scheduling della CPU SCHEDULING DELLA CPU. Concetti di Base Criteri di Scheduling Algoritmi di Scheduling

Sistemi Operativi SCHEDULING DELLA CPU. Sistemi Operativi. D. Talia - UNICAL 5.1

SISTEMI OPERATIVI. Sincronizzazione in Java (Semafori e barriere) Patrizia Scandurra (MODULO DI INFORMATICA II) LABORATORIO

File system II. Sistemi Operativi Lez. 20

Sistemi Operativi SCHEDULING DELLA CPU

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

H1 Hrms Gestione eventi/scadenze automatiche

T E O R I A D I P R O G E T T A Z I O N E D E L S O F T W A R E

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Introduzione ai Metodi Formali

Sincronizzazione dei processi

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Introduzione al MATLAB c Parte 2

BASE DI DATI: introduzione. Informatica 5BSA Febbraio 2015

Modello a scambio di messaggi

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

CitySoftware PROTOCOLLO. Info-Mark srl

Ordinamento degli eventi. Lezione 11. Osservazioni. Relazione verificato prima. Cenni ai sistemi operativi distribuiti 3. Coordinazione distribuita

Transcript:

Capitolo 7: Sincronizzazione Il problema della sincronizzazione. Il problema della sezione critica. Hardware per la sincronizzazione. Semafori. Problemi classici di sincronizzazione. Monitor (cenni). 7.1

Il problema della sincronizzazione L accesso concorrente a dati condivisi può portare alla loro inconsistenza. Per mantenere la consistenza dei dati sono necessari dei meccanismi che assicurino l esecuzione ordinaria di processi cooperanti che condividano uno spazio di indirizzi (codice e dati). Es.: in un sistema multithread, più thread cooperano mentre sono eseguiti in modo asincrono e condividono dati. Possiamo esemplificare un paradigma di cooperazione come nel modello del produttore/consumatore. 7.2

Codice dei thread Le chiamate del produttore: while (count == BUFFER_SIZE) ; // non fare nulla // aggiungi un elemento al buffer ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; Le chiamate del consumatore: while (count == 0) ; // non fare nulla // elimina l elemento dal buffer --count; item = buffer[out]; out = (out + 1) % BUFFER_SIZE; 7.3

Corse critiche ++count può essere implementata nel modo seguente: register1 = count register1 = register1 + 1 count = register1 count- - può essere implementata nel modo seguente: register2 = count register2 = register2-1 count = register2 Si consideri il seguente ordine di esecuzione. Supponiamo count=5: S0: produttore esegue register1 = count {register1 = 5 S1: produttore esegue register1 = register1 + 1 {register1 = 6 S2: consumatore esegue register2 = count {register2 = 5 S3: consumatore esegue register2 = register2-1 {register2 = 4 S4: produttore esegue count = register1 {count = 6 S5: consumatore esegue count = register2 {count = 4 Il risultato dell esecuzione non è universale ma dipende dall ordine con cui si è dato accesso ai dati. 7.4

Il problema della sezione critica Primo metodo per garantire la regolamentazione degli accessi è dichiarare come critica la sezione di codice ad accesso condiviso. In un sistema costituito dagli n thread {T 0, T 1,, T n-1, ogni thread potrà avere un segmento di codice determinato come critico. Soluzione al problema della sezione critica: 1. Mutua esclusione se il thread T i sta eseguendo la sua sezione critica, nessun altro thread può eseguire la propria sezione critica. 2. Progresso se nessun thread sta eseguendo la sua sezione critica e alcuni thread vogliono entrare nella loro, allora solo i thread che non stanno eseguendo la loro sezione non critica possono partecipare alla decisione su chi sarà il prossimo a entrare nella propria sezione critica, e questa scelta non può essere ritardata indefinitamente. 3. Attesa limitata (bounded waiting) esiste un limite al numero di volte in cui gli altri thread possono entrare nelle loro sezioni critiche dopo che un thread ha fatto richiesta di entrare nella propria e prima che tale richiesta sia esaudita. Prevenzione della starvation di un singolo thread. Assumiamo che ciascun thread sia in esecuzione a velocità non nulla. Non si può fare alcuna ipotesi sulle velocità relative degli n thread. 7.5

Soluzione software Si presenta complessa e spesso inefficiente anche nel caso di sistemi semplici (pochi thread). Tutte le soluzioni software sono generalmente basate su di un algoritimo di ordinamento. Generalmente allo scopo si adopera l algoritmo di Bakery. Si impone l accesso alle sezioni critiche dei processi secondo uno stringente paradigma di tipo FCFS. ALGORITMO DI BAKERY Si ipotizzi l accesso alla sezione critica per n generici thread. Prima di fare ingresso alla sezione critica, ciascun thread riceve un token numerico. Il thread possessore del token di valore più basso accede alla propria sezione critica. Se due thread Ti and Tj ricevono il medesimo token, se i < j, allora Ti riceve la precedenza; in caso contrario la riceve Tj. Lo schema di generazione algoritmica dei token genera sempre una sequenza crescente, p.es.: 1,2,3,3,3,3,4,5... 7.6

Hardware per la sincronizzazione Molti sistemi forniscono istruzioni hardware per la risoluzione del problema della sezione critica. Monoprocessori: si possono disabilitare gli interrupt durante l accesso alle sezioni critiche. La sequenza di istruzioni corrente sarà eseguita in ordine senza interruzioni. Di solito troppo inefficiente sui sistemi multiprocessore (i comandi per la disabilitazione degli interrupt devono essere passati a tutti i processori). Ritardo nell accesso alle sezioni critiche e nell uscita da esse. I sistemi operativi che lo usano sono carenti in scalabilità quando vengono aggiunte CPU. I costi computazionali ed i ritardi aumentano al crescere delle CPU I calcolatori moderni forniscono istruzioni hardware speciali che funzionano in modo atomico. Atomico = non-interrompibile. Controllare e modificare il contenuto di una parola di memoria. Scambiare il contenuto di due parole. 7.7

Semafori Sebbene efficaci, le soluzioni hardware sono di uso complesso per i programmatori di applicazioni. Strumenti poco complessi di sincronizzazione che impongono iterativamente un blocco durante un attesa in modo attivo (spin lock). Semaforo S variabile intera. Dopo l inizializzazione si può accedere ad un semaforo S solo tramite due operazioni: acquire() e release(). Si tratta di due operazioni indivisibili (le modifiche al valore intero di S sono permesse da un solo thread per volta): acquire(s) { while S <= 0 ; // nessuna operazione S--; release(s) { S++; Nella acquire(s) il test sul valore positivo di S e la sua possibile modifica devono essere eseguiti senza interruzioni. 7.8

Impiego Semaforo generalizzato il valore può variare in un dominio senza restrizioni. Semaforo binario il valore può essere solo 0 o 1; può essere più facile da implementare. Noto anche come mutex lock perchè consente di gestire la mutua esclusione. Semaphore S; // assumo S inizializzato a 1 acquire(s); criticalsection(); release(s); Possiamo adoperare semafori per controllare l accesso a sezioni critiche. Si può adoperare un semaforo generalizzato S per controllare l accesso ad una risorsa con un numero finito di istanze. S viene inizializzato al numero di istanze della risorsa disponibili. Un thread che desidera accedere alla risorsa esegue una acquire() su S (decrementando il contatore). Un thread che rilascia la risorsa esegue una release() (incrementando il counter). Quando S=0, tutte le istanze sono allocate e i thread che richiedano la risorsa resteranno in attesa del rilascio di un esemplare di essa. 7.9

Implementazione di semafori (1/2) Semafori come quelli descritti (spinlock) hanno lo svantaggio del busy waiting. Mentre un processo è nella propria sezione critica, ogni altro processo che prova ad accedere alla propria deve ciclare continuamente sprecando cicli di CPU che potrebbero essere sfruttati da altri processi. Gli spinlock non obbligano a cambi di contesto pertanto tornano utili quando si prevede che i blocchi vengano tenuti per brevi periodi (sistemi multiprocessore). acquire(s){ S--; if (S < 0) { add the process to list; block; release(s){ S++; if (S <= 0) { remove a process P from list; wakeup(p); Per superare il busy waiting si ridefiniscono acquire() e release(). Una acquire() che trova una variabile semaforica negativa mette il thread in una coda di attesa associata al semaforo. Il microscheduler seleziona un altro processo da eseguire. Un processo bloccato viene risvegliato da un wake-up a seguito di una release() di un altro processo sul semaforo. Dopo il wake-up il thread bloccato viene rimosso dalla coda del semaforo e riposizionato nella coda di ready. I semafori dovranno così essere definiti come coppia variabile semaforica (intero) e coda di attesa. 7.10

Implementazione di semafori (2/2) Il semaforo può così assumere anche valori negativi. Il valore assoluto rappresenta il numero di processi in coda di attesa. La lista d attesa è implementata mediante due puntatori alla testa ed alla fine di una coda FIFO di PCB. Deve garantire che due processi non possano eseguire una acquire() ed una release() sullo stesso semaforo nello stesso momento. Questa situazione genera un problema di sezione critica. Soluzione: Ambiente monoprocessore: inibire gli interrupt durante l esecuzione di acquire() e release(). Ambiente multiprocessore: adoperare istruzioni hardware speciali o adottare soluzioni software per la sezione critica. acquire() e release() non evitano il busy waiting ma lo dirottano nelle rispettive sezioni critiche dei programmi applicativi. Queste sezioni sono brevi pertanto l attesa attiva avviene raramente e quando capita è solo per brevi periodi. Le applicazioni invece possono impiegare molto tempo nelle sezioni critiche ed in tal caso l attesa attiva è estremamente svantaggiosa. 7.11

Stalli e starvation Stallo (deadlock) due o più processi aspettano un evento che può essere causato solo da uno dei processi in attesa (nel caso dei semafori l evento in questione è una release()). Consideriamo un sistema costituito da due processi P ciascuno dei quali accede a due semafori S e Q valorizzati a 1. P 0 P 1 acquire(s); acquire(q); acquire(q); acquire(s);.... release(s); release(q); release(q); release(s); Blocco indefinito (starvation) i processi attendono indefinitamente all interno del semaforo. Un processo può non essere mai rimosso dalla coda del semaforo nella quale è sospeso. Può verificarsi se la coda semaforica di attesa è organizzata secondo il criterio LIFO. 7.12

Monitor Benché i semafori forniscano un meccanismo conveniente ed efficace per la sincronizzazione, il loro utilizzo non corretto comporta errori di temporizzazione difficilmente individuabili. Essi avvengono in modo asincrono solo in determinate sequenze di esecuzione. Un monitor è un costrutto in un linguaggio ad alto livello che provvede alla sincronizzazione di thread. Il tipo monitor è un tipo di dato astratto che incapsula metodi pubblici per l esecuzione di operazioni su dati privati. Un tipo monitor presenta operazioni definite dall utente su cui è fornita la mutua esclusione: solo un thread per volta può essere attivo in un monitor. Il tipo monitor contiene: La dichiarazione di variabili mediante le quali si definisce lo stato dell istanza. Le funzioni/procedure che operano sulle variabili stesse. monitor monitor-name { shared variable declarations public entry p1( ) { public entry p2( ) { { public entry pn( ) { initialization code 7.13

Le variabili di tipo condition I thread non possono accedere direttamente all implementazione interna di un monitor. Solo le procedure definite internamente al monitor possono accedere alle variabili locali o a quelle condivise. Il costrutto del monitor proibisce l accesso concorrente alle procedure interne. Il programmatore non deve codificare la sincronizzazione esplicitamente. Le variabili di tipo condition (x e y nell esempio) e i metodi wait e signal implementano la sincronizzazione; Un thread che invoca x.wait è sospeso finchè un altro thread non invoca x.signal. 7.14