Sommario. G. Piscitelli

Documenti analoghi
Capitolo 7: Sincronizzazione

Meccanismi di sincronizzazione: Semafori e Monitor

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

Sistemi Operativi. Lezione 7 Comunicazione tra processi

Monitor. Introduzione. Struttura di un TDA Monitor

Il costrutto monitor [Hoare 74]

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

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Il costrutto monitor [Hoare 74]

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

Java threads (2) Programmazione Concorrente

Pronto Esecuzione Attesa Terminazione

Introduzione ai Metodi Formali

Un sistema operativo è un insieme di programmi che consentono ad un utente di

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

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Coordinazione Distribuita

Java Virtual Machine

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

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 Sistema Operativo

Sistemi Operativi Kernel

FONDAMENTI di INFORMATICA L. Mezzalira

I THREAD O PROCESSI LEGGERI Generalità

CAPITOLO 24 I MONITOR

GESTIONE DEI PROCESSI

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

Multithreading in Java. Fondamenti di Sistemi Informativi

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

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

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

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

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

Sommario. G. Piscitelli

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

Il problema del produttore e del consumatore. Cooperazione tra processi

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

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

GESTIONE INFORMATICA DEI DATI AZIENDALI

Gestione delle transazioni. Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke 1

STRUTTURE DEI SISTEMI DI CALCOLO

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

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

LA SINCRONIZZAZIONE TRA PROCESSI

Sistemi operativi Sincronizzazione fra processi

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

Logout... A utorizzazioni Eserc itazioni cambia. password... Esercitazione. Rispondere alle seguenti domande reltive ai Processi Software:

CAPITOLO 14 CONCORRENZA: MUTUA ESCLUSIONE E SINCRONIZZAZIONE

Sincronizzazione tra processi

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

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

IL SISTEMA OPERATIVO

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

Secondo biennio Articolazione Informatica TPSIT Prova Quarta

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

Modello a scambio di messaggi

Implementazione dei monitor tramite semafori Attesa condizionale Sincronizzazione nei sistemi operativi reali Transazioni atomiche

Corso di Sistemi di Elaborazione delle informazioni

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

CAPITOLO 3 : I PROCESSI

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

PRINCIPI DI SISTEMI OPERATIVI

Approccio stratificato

Sistemi Operativi Esercizi Sincronizzazione

Trasparenze del Corso di Sistemi Operativi

Sincronizzazione dei processi

La Gestione delle risorse Renato Agati

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

INFORMATICA 1 L. Mezzalira

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

Sincronizzazione dei processi. Capitolo 5 -- Silberschatz

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

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

J. Assfalg Appunti di Sistemi Operativi

Il descrittore di processo (PCB)

CAPITOLO 7 - SCAMBIO DI MESSAGGI

DMA Accesso Diretto alla Memoria

10 - Programmare con gli Array

Deadlock e Starvation

6. Sincronizzazione dei Processi. Esempio: Produttore- Consumatore con n elementi. Esempio: Produttore- Consumatore con n elementi

Deadlock (stallo) Parte III. Deadlock

Sistemi Operativi (modulo di Informatica II) I processi

Gestione della memoria centrale

Sistemi Operativi Sincronizzazione tra Processi

Introduzione ai tipi di dato astratti: applicazione alle liste

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

Lo scheduling. Tipici schedulatori

Corso di Programmazione Concorrente

MODELLO AD AMBIENTE GLOBALE

CAPITOLO 27 SCAMBIO DI MESSAGGI

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

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

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

Arduino: Programmazione

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

Funzioni in C. Violetta Lonati

Algoritmi di scheduling

Sistema operativo: Gestione della memoria

Transcript:

Sommario Sincronizzazione Inconsistenza di dati condivisi: i rischi dell'interleaving nei processi concorrenti La race condition Il problema della "sezione critica" dei processi concorrenti e la soluzione Algoritmi tentativi per la soluzione del problema della "sezione critica" Istruzioni di macchina per la sincronizzazione: Test&Set oppure Swap Il semaforo binario ed il semaforo contatore: variabile semaforica e operatori Rischi della mutua esclusione: deadlock e starvation Monitor: astrazione, procedure pubbliche, variabili condizioni e sincronizzazione G. Piscitelli

Shared data inconsistency 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 ordinata di processi (o thread) 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. 8. Sincronizzazione G. Piscitelli 2 / 21

Shared data concurrent access risks 1/2 Shared data #define BUFFER_SIZE 10 typedef struct {... item; item buffer[buffer_size]; int in = 0; int out = 0; int counter = 0; processo Producer item nextproduced; { while (counter == BUFFER_SIZE); /* do nothing: none free buffer */ counter++; /* add the next product to the buffer */ buffer[in] = nextproduced; in = (in + 1) % BUFFER_SIZE; processo Consumer Item nextconsumed; { while (counter == 0); /* do nothing: none available buffer */ counter--; nextconsumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; 8. Sincronizzazione G. Piscitelli 3 / 21

Shared data concurrent access risks 2/2 Gli statement counter++ e counter-- devono essere eseguiti atomicamente. Un'operazione è eseguita atomicamente se viene completata interamente senza interruzioni. Lo statement counter ++ è eseguito, in linguaggio di macchina di un processore, tramite le istruzioni: register1 = counter register1 = register1 + 1 counter = register1 Lo statement counter -- è eseguito, in linguaggio di macchina di un processore, tramite le istruzioni: register2 = counter register2 = register2 1 counter = register2 Se sia il "produttore" che il "consumatore" cercano contemporaneamente di aggiornare il buffer, le istruzioni di macchina possono essere intercalate. L'intercalare dipende da come vengono schedulati il "produttore" e il "consumatore". 8. Sincronizzazione G. Piscitelli 4 / 21

Interleaving effect Si consideri il seguente ordine di esecuzione e si supponga che sia counter = 5: producer : register1 = counter (register1 = 5) producer : register1 = register1 + 1 (register1 = 6) consumer : register2 = counter (register2 = 5) consumer : register2 = register2 1 (register2 = 4) producer : counter = register1 (counter = 6) consumer : counter = register2 (counter = 4) Il risultato dell esecuzione non è deterministico, ma dipende dall ordine con cui si è dato accesso ai dati (race condition). Infatti il valore di counter potrà essere 4 oppure 6, laddove il risultato corretto dovrebbe essere 5. 8. Sincronizzazione G. Piscitelli 5 / 21

The "race" condition Race condition: è questa la situazione che si determina quando più processi (o thread) accedono e manipolano concorrentemente dati condivisi (shared data). Il valore finale dei dati condivisi dipende da quale processo (o thread) termina per ultimo. Frequente nei sistemi operativi multitasking, sia per dati in user space sia per strutture del kernel. Estremamente pericolosa: porta al malfunzionamento dei processi (o thread) cooperanti, o anche (nel caso delle strutture in kernel space) dell intero sistema. Difficile da individuare e riprodurre: dipende da informazioni astratte dai processi o thread (decisioni dello scheduler, carico del sistema, utilizzo della memoria, numero di processori,... ) Per prevenire le race condition, i processi (o thread) concorrenti devono essere sincronizzati. Nel seguito si assumerà che quanto asserito per i processi valga identicamente se si considerano i thread. 8. Sincronizzazione G. Piscitelli 6 / 21

The Critical-Section problem Se n processi competono tutti per l'uso di un qualche dato condiviso e........ se ogni processo ha un segmento di codice segment, detto critical section (sezione critica), in cui si fa accesso al dato condiviso: Problema per evitare una race condition, è necessario garantire: 1) Mutua esclusione e cioè che: quando un processo è in esecuzione nella sua sezione critica, a nessun altro processo concorrente sia consentito di accedere ad eseguire la propria sezione critica; 8. Sincronizzazione G. Piscitelli 7 / 21

2) Progresso e cioè che: se nessun processo sta eseguendo la sua sezione critica e alcuni processi vogliono entrare nella loro, allora solo i processi che sono in attesa di far uso della loro sezione 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) e cioè che: deve esistere un limite al numero di volte in cui gli altri processi possono entrare nelle loro sezioni critiche dopo che un processo ha fatto richiesta di entrare nella propria e prima che tale richiesta sia esaudita. Questa condizione garantisce la prevenzione della starvation di un singolo processo. Si assume che ciascun processo sia in esecuzione a velocità non nulla. Non si può fare alcuna ipotesi sulle velocità relative degli n processi. 8. Sincronizzazione G. Piscitelli 8 / 21

Attempts to solve the Critical-Section problem Per semplicità si assume che: vi siano solo 2 processi, P i and P j la struttura generale del processo P i (e dell'altro processo P j ) siano analoghe i processi possono condividere qualche variabile comune per sincronizzare le proprie azioni. 8. Sincronizzazione G. Piscitelli 9 / 21

Algorithm 1 Shared variables: int turn; inizialmente turn = 0 turn = i P i può entrare nella sua sezione critica Processo P i do { while (turn!= i); no-op /* entry section */ sezione critica turn = j; /* exit section */ sezione rimanente (non critica) while (1); L'algoritmo soddisfa la mutua esclusione, ma non il requisito di "progresso", poichè richiede una stretta alternanza dei 2 processi nell'uso della sezione critica. Infatti, se turn == 0 e P j è pronto ad entrare nella sua sezione critica, non può farlo, anche se P i è nella sua sezione non critica. inadatto per processi con differenze di velocità È un esempio di busy wait: attesa attiva di un evento. semplice da implementare può portare a consumi inaccettabili di cpu in genere, da evitare, ma a volte è preferibile (es. in caso di attese molto brevi) 8. Sincronizzazione G. Piscitelli 10 / 21

Algorithm 2 Shared variables: boolean flag[2]; inizialmente flag [0] = flag [1] = false. flag [i] = true P i pronto per entrare nella sua sezione critica Process P i do { flag[i] := true; /* entry section */ while (flag[j]); sezione critica flag [i] = false; /* exit section */ sezione rimanente (non critica) while (1); L'algoritmo è sbagliato. Infatti, l'intercalare delle entry section porta ad un loop infinito (deadlock) per entrambi i processi. Invertire le istruzioni della entry section porterebbe solo alla violazione della mutua esclusione. 8. Sincronizzazione G. Piscitelli 11 / 21

Bakery algorithm Critical section for n processes Quello che segue è l'unico algoritmo che risolve via software il problema di evitare una race condition. Before entering its critical section, process receives a number. Holder of the smallest number enters the critical section. If processes P i and P j receive the same number, if i < j, then P i is served first; else P j is served first. The numbering scheme always generates numbers in increasing order of enumeration; i.e., 1,2,3,3,3,3,4,5... L'algoritmo "del fornaio" è, però, complesso da gestire. 8. Sincronizzazione G. Piscitelli 12 / 21

Synchronization by hardware Molti sistemi ricorrono all'hardware per la risoluzione del problema della sezione critica: Nei monoprocessori: si possono disabilitare gli interrupt durante l accesso alle sezioni critiche in maniera tale che la sequenza di istruzioni corrente venga eseguita in ordine senza interruzioni. Nei sistemi multiprocessore: di solito la disabilitazione degli interrupt è troppo inefficiente, perchè i comandi per la disabilitazione devono essere passati a tutti i processori. I calcolatori moderni risolvono efficacemente il problema fornendo almeno una delle seguenti istruzioni hardware speciali che funzionano in modo atomico. 1. Controllare e modificare il contenuto di una parola di memoria TestAndSet(boolean &target) 2. Scambiare il contenuto di due parole. Swap(boolean &a, boolean &b) 8. Sincronizzazione G. Piscitelli 13 / 21

Synchronization instruction: Test&Set Controlla e modifica atomicamente il contenuto di una variabile booleana (o generica). boolean TestAndSet(boolean &target) { boolean rv = target; target = true; return rv; Shared data: boolean lock = false; Process P i do { while (TestAndSet(lock)) ; critical section lock = false; remainder section 8. Sincronizzazione G. Piscitelli 14 / 21

Synchronization instruction: Swap Scambia atomicamente il valore di due variabili booleane (o generiche). void Swap(boolean &a, boolean &b) { boolean temp = a; a = b; b = temp; Shared data (initialized to false): boolean lock; boolean waiting[n]; Process P i do { key = true; while (key == true) Swap(lock,key); critical section lock = false; remainder section 8. Sincronizzazione G. Piscitelli 15 / 21

Binary Semaphore Synchronization tool that does not require busy waiting. Variabile semaforica S variabile intera può variare solo tra 0 e 1 può essere utilizzata solo attraverso due operazioni indivisibili (atomiche) wait (S): while S 0 do no-op; S--; signal (S): S++; down(s): attendi finchè S è maggiore di 0; quindi decrementa S up(s): incrementa S Risorsa condivisa risorsa già impegnata da P S A B C coda dei processi in attesa Normalmente, l attesa è implementata spostando il processo in stato di wait, mentre la up(s) mette uno dei processi eventualmente in attesa nello stato di ready. I nomi originali delle operazioni erano P (proberen, testare), V (verhogen, incrementare) 8. Sincronizzazione G. Piscitelli 16 / 21

Counting Semaphore Semaforo contatore (o generalizzato) la variabile semaforica può variare in un dominio senza restrizioni, p.e. tra 0 e 10. Si può adoperare per controllare l accesso ad una risorsa con un numero finito di istanze Può essere realizzato con caratteristiche simili a quelle di un semaforo binario. S viene inizializzato al numero di istanze della risorsa disponibili. Un processo che desidera accedere alla risorsa esegue una wait () su S (decrementando il contatore). Un processo che rilascia la risorsa esegue una signal () (incrementando il counter). Quando S=0, tutte le istanze sono allocate e i processi che richiedano la risorsa resteranno in coda in attesa del rilascio di un esemplare di essa. Il semaforo può assumere anche valori negativi. Il valore assoluto rappresenta il numero di processi in coda di attesa. 8. Sincronizzazione G. Piscitelli 17 / 21

Mutual exclusion risks: Deadlock and Starvation Deadlock due o più processi attendono indefinitamente un evento che può essere causato solo da uno dei processi in attesa. R1 P3 P1 R3 R2 P2 Starvation (indefinite blocking) un processo non può mai essere rimosso dalla coda di un semaforo in cui è sospeso in attesa. In informatica, per starvation (termine inglese che tradotto letteralmente significa inedia) si intende l'impossibilità, da parte di un processo pronto all'esecuzione, di ottenere le risorse hardware di processamento di cui necessita per essere eseguito. Un esempio è il non ottenere il controllo della CPU da parte di processi con priorità molto bassa, qualora vengano usati algoritmi di scheduling a priorità. Può capitare, infatti, che venga continuamente sottomesso al sistema un processo con priorità più alta. È la storia del processo con bassa priorità, scoperto quando fu necessario fermare il sistema sull'ibm 7094 al MIT nel 1973: era stato sottomesso nel 1967 e fino ad allora non era stato eseguito. 8. Sincronizzazione G. Piscitelli 18 / 21

Monitor Benché i semafori forniscano un meccanismo conveniente ed efficace per la sincronizzazione, il loro utilizzo non corretto comporta errori di temporizzazione difficilmente individuabili. Un costrutto di sincronizzazione di alto livello che garantisce completamente la condivisione di strutture di dati astratti da parte di processi concorrenti è, invece, il monitor. Un monitor è un tipo di dato astratto che fornisce funzionalità di mutua esclusione; è, cioè, una collezione di dati privati e funzioni/ procedure per accedervi i processi non possono accedere direttamente alla struttura interna di un monitor (variabili locali o condivise), ma possono chiamare le procedure pubbliche, che sono le sole che vi possono accedere. un solo processo alla volta può eseguire codice di un monitor il programmatore raccoglie quindi i dati condivisi e tutte le sezioni critiche relative in un monitor; non deve perciò codificare la sincronizzazione esplicitamente I monitor sono implementati dal compilatore con dei costrutti per mutua esclusione monitor monitor-name {shared variable declarations procedure body P1 ( ) {... procedure body P2 ( ) {... procedure body Pn ( ) {... { initialization code 8. Sincronizzazione G. Piscitelli 19 / 21

Monitor Per consentire ad un processo di attendere nel monitor fintanto che si verifichi uno specifico evento, è necessario dichiarare una specifica variabile condizione condition x, y; 8. Sincronizzazione G. Piscitelli 20 / 21

Monitor Una variabile condizione è solo usata con gli operatori di sincronizzazione wait e signal. L'operazione x.wait(); chiede che il processo che la lancia venga sospeso finchè un altro processo effettua un'operazione x.signal; l'operazione x.signal(); chiede che venga ripresa l'esecuzione di un processo sospeso in attesa della condizione x. Se non c'è alcun processo sospeso su x, l'operazione signal non ha alcun effetto. 8. Sincronizzazione G. Piscitelli 21 / 21