Cosa sono i semafori?
|
|
|
- Giacinta Martina
- 7 anni fa
- Просмотров:
Транскрипт
1 Mutex
2 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
3 Operazioni sui semafori In generale sono TRE le operazioni che vengono eseguite da un processo su un semaforo: Create: creazione di un semaforo. Wait: attesa su di un semaforo dove si verifica il valore del semaforo while(sem_value <=0) ;// wait; ad esempio blocca il thread sem_value--; Post: incremento del semaforo. sem_value++; Semafori di mutua esclusione con i thread POSIX 3
4 Cosa sono i mutex? (1 di 2) Una variabile mutex è una variabile che serve per la protezione delle sezioni critiche: variabili condivise modificate da più thread Il mutex è un semaforo binario, cioè il valore può essere 0 (occupato) oppure 1 (libero) Semafori di mutua esclusione con i thread POSIX 4
5 Cosa sono i mutex? (2 di 2) Pensiamo ai mutex come a delle serrature: il primo thread che ha accesso alla coda dei lavori lascia fuori gli altri thread fino a che non ha portato a termine il suo compito. Viene inserito un mutex nelle sezioni di codice nelle quali vengono condivisi i dati. Semafori di mutua esclusione con i thread POSIX 5
6 Garantire la Mutua Esclusione (1 di 2) Due thread devono decrementare il valore di una variabile globale data se questa è maggiore di zero data = 1 THREAD1 THREAD2 if(data>0) if(data>0) data --; data --; Semafori di mutua esclusione con i thread POSIX 6
7 Garantire la Mutua Esclusione (2 di 2) A seconda del tempo di esecuzione dei due thread, la variabile data assume valori diversi. Data THREAD1 THREAD2 1 if(data>0) 1 data --; 0 if(data>0) 0 data --; 0 = valore finale di data if(data>0) 1 if(data>0) 1 data --; 0 data --; -1 = valore finale di data Semafori di mutua esclusione con i thread POSIX 7
8 Procedure nell' uso dei mutex Creare e inizializzare una variabile mutex Più thread tentano di accedere alla risorsa invocando l operazione di lock Un solo thread riesce ad acquisire il mutex mentre gli altri si bloccano Il thread che ha acquisito il mutex manipola la risorsa Lo stesso thread la rilascia invocando la unlock Un altro thread acquisisce il mutex e così via Distruzione della variabile mutex Semafori di mutua esclusione con i thread POSIX 8
9 Creazione mutex Per creare un mutex è necessario usare una variabile di tipo pthread_mutex_t contenuta nella libreria pthread pthread_mutex_t è una struttura che contiene: Nome del mutex Proprietario Contatore Struttura associata al mutex La coda dei processi sospesi in attesa che mutex sia libero. e simili Semafori di mutua esclusione con i thread POSIX 9
10 Inizializzazione mutex statica contestuale alla dichiarazione dinamica attraverso pthread_mutex_t mutex; pthread_mutex_init (&mutex, NULL); Semafori di mutua esclusione con i thread POSIX 10
11 Inizializzazione statica Per il tipo di dato pthread_mutex_t, è definita la macro di inizializzazione PTHREAD_MUTEX_INITIALIZER Il mutex è un tipo definito "ad hoc" per gestire la mutua esclusione quindi il valore iniziale può essergli assegnato anche in modo statico mediante questa macro. /* Variabili globali */ pthread_mutex_t amutex = PTHREAD_MUTEX_INITIALIZER; Semafori di mutua esclusione con i thread POSIX 11
12 Inizializzazione dinamica pthread_mutex_t mutex; int pthread_mutex_init( pthread_mutex_t *mutex, const pthread_mutexattr_t *mattr ) pthread_mutex_t *mutex puntatore al mutex da inizializzare pthread_mutexattr_t *mattr attributi del mutex da inizializzare se NULL usa valori default Valore di ritorno sempre il valore 0 Semafori di mutua esclusione con i thread POSIX 12
13 Interfacce Su mutex sono possibili solo due operazioni: locking e unlocking (equivalenti a wait e signal sui semafori) Semafori di mutua esclusione con i thread POSIX 13
14 Interfaccia: Lock Ogni thread, prima di accedere ai dati condivisi, deve effettuare la lock su una stessa variabile mutex. Blocca l accesso da parte di altri thread. Se più thread eseguono l operazione di lock su una stessa variabile mutex, solo uno dei thread termina la lock e prosegue l esecuzione, gli altri rimangono bloccati nella lock. In tal modo, il processo che continua l esecuzione può accedere ai dati (protetti mediante la mutex). Semafori di mutua esclusione con i thread POSIX 14
15 Operazioni: lock e trylock lock bloccante (standard) trylock non bloccante (utile per evitare deadlock) è come la lock() ma se si accorge che la mutex è già in possesso di un altro thread (e quindi si rimarrebbe bloccati) restituisce immediatamente il controllo al chiamante con risultato EBUSY Semafori di mutua esclusione con i thread POSIX 15
16 lock int pthread_mutex_lock( pthread_mutex_t *mutex ) pthread_mutex_t *mutex puntatore al mutex da bloccare Valore di ritorno 0 in caso di successo diverso da 0 altrimenti Semafori di mutua esclusione con i thread POSIX 16
17 trylock int pthread_mutex_trylock( pthread_mutex_t *mutex ) pthread_mutex_t *mutex puntatore al mutex da bloccare Valore di ritorno 0 in caso di successo e si ottenga la proprietà della mutex EBUSY se il mutex è occupato Semafori di mutua esclusione con i thread POSIX 17
18 Interfaccia: Unlock Libera la variabile mutex. Un altro thread che ha precedentemente eseguito la lock su un mutex potrà allora terminare la lock ed accedere a sua volta ai dati. Semafori di mutua esclusione con i thread POSIX 18
19 unlock int pthread_mutex_unlock( pthread_mutex_t *mutex ) pthread_mutex_t *mutex puntatore al mutex da sbloccare Valore di ritorno 0 in caso di successo Semafori di mutua esclusione con i thread POSIX 19
20 destroy int pthread_mutex_destroy( pthread_mutex_t *mutex ) Elimina il mutex pthread_mutex_t *mutex puntatore al mutex da distruggere Valore di ritorno 0 in caso di successo EBUSY se il mutex è occupato Semafori di mutua esclusione con i thread POSIX 20
21 Esempio 4: uso dei mutex (1 di 2) #include <pthread.h> int a=1, b=1; pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; void* thread1(void *arg) { pthread_mutex_lock(&m); printf( Primo thread (parametro: %d)\n", *(int*)arg); a++; b++; pthread_mutex_unlock(&m); } void* thread2(void *arg) { pthread_mutex_lock(&m); printf( Secondo thread (parametro: %d)\n", *(int*)arg); } b=b*2; a=a*2; pthread_mutex_unlock(&m); Continua Semafori di mutua esclusione con i thread POSIX 21
22 Esempio 4: uso dei mutex (2 di 2) main() { pthread_t threadid1, threadid2; int i = 1, j=2; pthread_create(&threadid1, NULL, thread1, (void *)&i); pthread_create(&threadid2, NULL, thread2, (void *)&j); pthread_join(threadid1, NULL); pthread_join(threadid2, NULL); printf("valori finali: a=%d b=%d\n", a, b); } Tratto con modifiche da: Semafori di mutua esclusione con i thread POSIX 22
23 Semafori classici
24 Semafori classici (generali) (1 di 2) Semafori il cui valore può essere impostato dal programmatore utilizzati per casi più generali di sincronizzazione esempio: produttore consumatore Interfaccia operazione wait operazione post (signal) Semafori classici con i thread POSIX 2
25 Mutex vs Semaforo (1 di 2) Il mutex è un tipo definito "ad hoc" per gestire la mutua esclusione quindi il valore iniziale può essergli assegnato anche in modo statico mediante la macro PTHREAD_MUTEX_INITIALIZER. Al contrario, un semaforo come il sem_t deve essere di volta in volta inizializzato dal programmatore col valore desiderato. Semafori classici con i thread POSIX 3
26 Mutex vs Semaforo (2 di 2) Un semaforo può essere impiegato come un mutex inizializzo un mutex; inizializzo un semaforo (1); pthread_mutex_lock(&mutex); sezione critica pthread_mutex_unlock(&mutex); sem_wait(&sem); sezione critica sem_post(&sem); Semafori classici con i thread POSIX 4
27 Semafori classici (generali) (2 di 2) Semafori classici e standard POSIX non presenti nella prima versione dello standard introdotti insieme come estensione real-time con lo standard IEEE POSIX b (1993) Utilizzo associati al tipo sem_t includere l header #include <semaphore.h> Semafori classici con i thread POSIX 5
28 Creazione semaforo sem_t: tipo di dato associato al semaforo sem_t sem; Semafori classici con i thread POSIX 9
29 Inizializzazione (1 di 2) int sem_init( sem_t *sem, int pshared, unsigned int value ) I semafori richiedono un inizializzazione esplicita da parte del programmatore sem_init serve per inizializzare il valore del contatore del semaforo specificato come primo parametro Semafori classici con i thread POSIX 10
30 Inizializzazione (2 di 2) sem_t *sem puntatore al semaforo da inizializzare, cioè l indirizzo dell oggetto semaforo sul quale operare int pshared flag che specifica se il semaforo è condiviso fra più processi unsigned int *value valore iniziale da assegnare al semaforo Valore di ritorno 0 in caso di successo, -1 altrimenti con la variabile errno settata a EINVAL se il semaforo supera il valore SEM_VALUE_MAX Semafori classici con i thread POSIX 11
31 errno Per riportare il tipo di errore il sistema usa la variabile globale errno definita nell'header errno.h Il valore di errno viene sempre impostato a zero all'avvio di un programma. La procedura da seguire è sempre quella di controllare errno immediatamente dopo aver verificato il fallimento della funzione attraverso il suo codice di ritorno. Semafori classici con i thread POSIX 6
32 Stato di errore (2 di 2) L'esempio seguente mostra un programma completo e molto semplice, in cui si crea un errore, tentando di scrivere un messaggio attraverso lo standard input. Se effettivamente si rileva un errore associato a quel flusso di file, attraverso la funzione ferror(), allora si passa alla sua interpretazione con la funzione strerror() #include <stdio.h> #include <errno.h> #include <string.h> int main (void){ char *cp; fprintf (stdin, Hello world!\n"); if (ferror (stdin)){ cp = strerror (errno); fprintf (stderr, "Attenzione: %s\n", cp); } return 0; } Semafori classici con i thread POSIX 7
33 Esempio errno con i semafori ret = sem_init(sem, pshared, value); if (ret == -1){ printf("sem_init: thread %d, %s: failed: %s\n", pthread_self(), msg, strerror(errno)); exit(1); } Semafori classici con i thread POSIX 8
34 Interfaccia wait (1 di 2) Consideriamo il semaforo come un intero, sul cui valore la funzione wait esegue un test Se il valore del semaforo è uguale a zero (semaforo rosso), la wait si blocca, forzando un cambio di contesto a favore di un altro dei processi pronti Se il test evidenzia che il semaforo presenta un valore maggiore od uguale ad 1 (semaforo verde), la wait decrementa tale valore e ritorna al chiamante, che può quindi procedere nella sua elaborazione. void wait (semaforo s) { if (s.count == 0) <cambio di contesto>; s.count--; } Semafori classici con i thread POSIX 12
35 Interfaccia wait (2 di 2) Due varianti wait: bloccante (standard) trywait: non bloccante (utile per evitare deadlock) Semafori classici con i thread POSIX 13
36 wait int sem_wait( sem_t *sem ) sem_t *sem puntatore al semaforo da decrementare Valore di ritorno sempre 0 Semafori classici con i thread POSIX 14
37 trywait int sem_trywait( sem_t *sem ) sem_t *sem puntatore al semaforo da decrementare Valore di ritorno 0 in caso di successo -1 se il semaforo ha valore 0 setta la variabile errno a EAGAIN Semafori classici con i thread POSIX 15
38 Interfaccia post L'operazione di post incrementa il contatore del semaforo Se il semaforo vale zero, probabilmente altri processi hanno iniziato la wait ma hanno trovato il semaforo rosso la post sveglia quindi uno di questi; pertanto esiste una coda di processi bloccati per ciascun semaforo. void post (semaforo s) { s.count++; if (s.count > 0) <sveglia processo>; } Semafori classici con i thread POSIX 16
39 sem_post int sem_post( sem_t *sem ) sem_t *sem puntatore al semaforo da incrementare Valore di ritorno 0 in caso di successo -1 altrimenti con la variabile errno settata in base al tipo di errore sem_post restituisce EINVAL se il semaforo supera il valore SEM_VALUE_MAX dopo l incremento Semafori classici con i thread POSIX 17
40 sem_destroy int sem_destroy( sem_t *sem ) sem_t *sem puntatore al semaforo da distruggere Valore di ritorno 0 in caso di successo -1 altrimenti con la variabile errno settata in base al tipo di errore sem_destroy restituisce EBUSY se almeno un thread è bloccato sul semaforo Semafori classici con i thread POSIX 18
41 sem_getvalue Serve per poter leggere il valore attuale del contatore del semaforo int sem_getvalue( sem_t *sem, int *sval ) sem_t *sem puntatore del semaforo di cui leggere il valore int *sval valore del semaforo Valore di ritorno sempre 0 Semafori classici con i thread POSIX 19
42 Esempio: Sincronizzazione con barriera Scrivere un programma che faccia in modo che due thread arrivino ad un certo punto nel programma, e si blocchino in attesa che l'altro non abbia Semafori classici con i thread POSIX 21
43 Prima soluzione Thread # 1:... signal(ready1); wait(ready2);... Thread #2:... signal(ready2); wait(ready1);... Variabili: Semaphore ready 1 = 0; Semaphore ready2 = 0; Semafori classici con i thread POSIX 22
44 Seconda soluzione Thread # 1: (driver)... signal(busy); wait(done);... Thread #2: (controller)... wait(busy); signal(done);... Variabili: Semaphore busy = 0; Semaphore done = 0; Semafori classici con i thread POSIX 23
45 Variabili condition
46 Condition vs Semafori Le variabili condition sono diverse dai semafori di sincronizzazione, anche se semanticamente fanno la stessa cosa Le primitive delle condition si preoccupano di rilasciare ed acquisire la mutua esclusione prima di bloccarsi e dopo essere state sbloccate I semafori generali, invece, prescindono dalla presenza di altri meccanismi Variabili Condition con i thread POSIX 2
47 Cosa sono le variabili condition? Strumento di sincronizzazione: consente la sospensione dei thread in attesa che sia soddisfatta una condizione logica. Una condition variable, quindi, è utilizzata per sospendere l'esecuzione di un thread in attesa che si verifichi un certo evento. Ad ogni condition viene associata una coda per la sospensione dei thread. La variabile condizione non ha uno stato, rappresenta solo una coda di thread. Variabili Condition con i thread POSIX 3
48 Variabili condition Attraverso le variabili condition è possibile implementare condizioni più complesse che i thread devono soddisfare per essere eseguiti. Linux garantisce che i threads bloccati su una condizione vengano sbloccati quando essa cambia. Variabili Condition con i thread POSIX 4
49 Mutua esclusione Una variabile condizione non fornisce la mutua esclusione. C'è bisogno di un MUTEX per poter sincronizzare l'accesso ai dati. Variabili Condition con i thread POSIX 5
50 Sincronizzazione Una variabile condition è sempre associata ad un mutex un thread ottiene il mutex e testa il predicato se il predicato è verificato allora il thread esegue le sue operazioni e rilascia il mutex se il predicato non è verificato, in modo atomico il mutex viene rilasciato (implicitamente) il thread si blocca sulla variabile condition un thread bloccato riacquisisce il mutex nel momento in cui viene svegliato da un altro thread Variabili Condition con i thread POSIX 6
51 Creazione condition Oggetti di sincronizzazione su cui un processo si può bloccare in attesa associate ad una condizione logica arbitraria generalizzazione dei semafori nuovo tipo pthread_cond_t attributi variabili condizione di tipo pthread_condattr_t Variabili Condition con i thread POSIX 7
52 Inizializzazione statica pthread_cond_t cond = PTHREAD_COND_INITIALIZER; Per il tipo di dato pthread_cond_t, è definita la macro di inizializzazione PTHREAD_COND_INITIALIZER Variabili Condition con i thread POSIX 8
53 Inizializzazione dinamica int pthread_cond_init( pthread_cond_t *cond, pthread_condattr_t *cond_attr ) pthread_cond_t *cond puntatore ad un istanza di condition che rappresenta la condizione di sincronizzazione pthread_condattr_t *cond_attr punta a una struttura che contiene gli attributi della condizione se NULL usa valori di default Variabili Condition con i thread POSIX 9
54 Distruzione variabili condition int pthread_cond_destroy( pthread_cond_t *cond ) Dealloca tutte le risorse allocate per gestire la variabile condizione specificata Non devono esistere thread in attesa della condizione pthread_cond_t *cond puntatore ad un istanza di condition da distruggere Valore di ritorno 0 in caso di successo oppure un codice d errore 0 Variabili Condition con i thread POSIX 10
55 Interfacce Operazioni fondamentali: wait (sospensione) signal ( risveglio) Variabili Condition con i thread POSIX 11
56 Interfaccia wait La wait serve per sincronizzarsi con una certa condizione all'interno di un blocco di dati condivisi e protetti da un mutex La presenza del mutex fra i parametri garantisce che, al momento del bloccaggio, esso venga liberato, eliminando a monte possibili errori di programmazione che potrebbero condurre a condizioni di deadlock. Se la wait ritorna in modo regolare, è garantito che la mutua esclusione, sul semaforo mutex passatole, è stata nuovamente acquisita. Variabili Condition con i thread POSIX 12
57 wait int pthread_cond_wait( pthread_cond_t *cond, pthread_mutex_t *mutex ) pthread_cond_t *cond puntatore ad un istanza di condition che rappresenta la condizione di sincronizzazione puntatore all oggetto condizione su cui bloccarsi pthread_mutex_t *mutex l'indirizzo di un semaforo di mutua esclusione necessario alla corretta consistenza dei dati Valore di ritorno sempre 0 Variabili Condition con i thread POSIX 13
58 Interfaccia signal Il mutex deve essere rilasciato esplicitamente, altrimenti si potrebbe produrre una condizione di deadlock. Lo sblocco dei processi nella coda di wait della condizione è NON DETERMINISTICO. Quindi non è dato sapere chi verrà svegliato dalla signal(). Due varianti Standard: sblocca un solo thread bloccato Broadcast: sblocca tutti i thread bloccati Variabili Condition con i thread POSIX 14
59 signal int pthread_cond_signal ( pthread_cond_t *cond) Se esistono thread sospesi nella coda associata a cond, viene risveglia. Se non vi sono thread sospesi sulla condizione, la signal non ha effetto. pthread_cond_t *cond puntatore all oggetto condizione Valore di ritorno sempre 0 Variabili Condition con i thread POSIX 15
60 broadcast int pthread_cond_broadcast ( pthread_cond_t *cond ) pthread_cond_t *cond puntatore all oggetto condizione Valore di ritorno sempre 0 Variabili Condition con i thread POSIX 16
61 Valutazione condizione Perchè la condizione va testata usando un ciclo WHILE invece che un semplice IF? pthread_mutex_lock(&mutex); while(!condition_to_hold) pthread_cond_wait(&cond, &mutex); computation(); pthread_mutex_unlock(&mutex); Variabili Condition con i thread POSIX 17
62 Stato della coda Non è prevista una funzione per verificare lo stato della coda associata a una condizione. Variabili Condition con i thread POSIX 19
63 Esempio di utilizzo (1 di 2) Risorsa che può essere usata contemporaneamente da MAX thread. condition PIENO per la sospensione dei thread M mutex associato a pieno N_int numero di thread che stanno utilizzando la risorsa #define MAX 100 /*variabili globali*/ int N_in=0 /*numero thread che stanno utilizzando la risorsa*/ pthread_cond_t PIENO; pthread_ mutex M;/*mutex associato alla cond. PIENO*/ Variabili Condition con i thread POSIX 19
64 Esempio di utilizzo (2 di 2) void codice_thread() { /*fase di entrata*/ pthread_mutex_lock(&m); /* controlla la condizione di ingresso*/ while(n_in == MAX) pthread_cond_wait(&pieno,&m); /*aggiorna lo stato della risorsa */ N_in ++; pthread_mutex_unlock(&m); <uso della risorsa> /*fase di uscita*/ pthread_mutex_lock(&m); /*aggiorna lo stato della risorsa */ N_in --; pthread_cond_signal(&pieno); pthread_mutex_unlock(&m); } Variabili Condition con i thread POSIX 20
65 Grazie per l'attenzione. Variabili Condition con i thread POSIX 22
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
= PTHREAD_MUTEX_INITIALIZER
MUTEX Prof.ssa Sara Michelangeli Quando si programma in modalità concorrente bisogna gestire le problematiche di accesso alle eventuali sezioni critiche. Una sezione critica è una sequenza di istruzioni
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
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
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
Corso di Laboratorio di Sistemi Operativi
Corso di Laboratorio di Sistemi Operativi Lezione 7 Alessandro Dal Palù email: [email protected] web: www.unipr.it/~dalpalu Threads Un thread è l unità di base per l utilizzo della CPU. Composto
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
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
Laboratorio su Programmazione Concorrente in C. Problemi classici e derivati Dalla Ottava lezione di laboratorio in avanti
Laboratorio su Programmazione Concorrente in C Problemi classici e derivati Dalla Ottava lezione di laboratorio in avanti NOTA BENE: E INSISTO!!!!! Usare il comando man nomefunzionedilibreria per ottenere
Creazione di thread. In Linux si utilizzano le librerie pthread (POSIX thread) per lavorare con i thread:
Thread Un thread o lightweight process (LWP) è un unità di utilizzo della CPU che consiste di: un program counter, un insieme di registri, uno stack space. Tale unità condivide con gli altri peer thread
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
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
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
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
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
File binari e file di testo
I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file
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
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à
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
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
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
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
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
