Semafori. Semafori classici con i thread POSIX 2
|
|
|
- Regina Testa
- 9 anni fa
- Просмотров:
Транскрипт
1 Semafori classici
2 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 è garantita l'atomicità. Quindi, ogni modifica o check del valore di un semaforo può essere effettuata senza sollevare race conditions. Semafori classici con i thread POSIX 2
3 Race condition Più processi accedono concorrentemente agli stessi dati, e il risultato dipende dall'ordine di interleaving dei processi. Frequenti nei sistemi operativi multitasking, sia per dati in user space sia per strutture in kernel. Estremamente pericolose: portano al malfunzionamento dei processi coo-peranti, o anche (nel caso delle strutture in kernel space) dell'intero sistema difficili da individuare e riprodurre: dipendono da informazioni astratte dai processi (decisioni dello scheduler, carico del sistema, utilizzo della memoria, numero di processori,... ) Semafori classici con i thread POSIX 3
4 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 4
5 Mutex vs Semaforo (2 di 2) Un semaforo può essere impiegato come un mutex Differenza sostanziale: un mutex deve sempre essere sbloccato dal thread che lo ha bloccato, mentre per un semaforo l operazione post può non essere eseguita dal thread che ha eseguito la chiamata wait. 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 5
6 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 6
7 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> #include <errno.h> Semafori classici con i thread POSIX 7
8 errno Quasi tutte le funzioni delle librerie del C sono in grado di individuare e riportare condizioni di errore, ed è una norma fondamentale di buona programmazione controllare sempre che le funzioni chiamate si siano concluse correttamente. In genere le funzioni di libreria usano un valore speciale per indicare che c'è stato un errore. Di solito questo valore è -1 o un puntatore NULL o la costante EOF (a seconda della funzione); ma questo valore segnala solo che c'è stato un errore, non il tipo di errore. 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 8
9 Stato di errore (1 di 2) Per verificare la presenza di uno stato di errore si usa la funzione ferror() che restituisce un valore diverso da zero se questo stato esiste effettivamente: int ferror (FILE *flusso_di_file); Per interpretare l'errore annotato nella variabile errno e visualizzare direttamente un messaggio attraverso lo standard error, si può usare la funzione perror() void perror (const char *s); La funzione perror() mostra un messaggio in modo autonomo, aggiungendo davanti la stringa che può essere fornita come primo argomento Semafori classici con i thread POSIX 9
10 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 10
11 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 11
12 Creazione semaforo sem_t: tipo di dato associato al semaforo sem_t sem; Semafori classici con i thread POSIX 12
13 Inizializzazione (1 di 2) int int sem_init( sem_t *sem, int int pshared, unsigned int 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 13
14 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 se 1 il semaforo è condiviso tra processi se 0 il semaforo è privato del processo attualmente l'implementazione supporta solamente pshared = 0 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 14
15 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 è minore o uguale a zero (semaforo rosso), la wait si blocca, forzando un cambio di contesto a favore di un altro dei processi pronti che vivono nel sistema Se il test ha successo cioè se 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) { s.count--; if (s.count < 0) <cambio di contesto>; Semafori classici con i thread POSIX 15
16 Interfaccia wait (2 di 2) Due varianti wait: bloccante (standard) trywait: non bloccante (utile per evitare deadlock) Semafori classici con i thread POSIX 16
17 wait int 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 17
18 trywait int 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 18
19 Interfaccia signal L'operazione di signal incrementa il contatore del semaforo Se a seguito di tale azione il contatore risultasse ancora minore od uguale a zero, significherebbe che altri processi hanno iniziato la wait ma hanno trovato il semaforo rosso la signal sveglia quindi uno di questi; pertanto esiste una coda di processi bloccati per ciascun semaforo. void signal (semaforo s) { s.count++; if (s.count <= 0) <sveglia processo>; Semafori classici con i thread POSIX 19
20 sem_post int 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 20
21 sem_destroy int 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 21
22 sem_getvalue Serve per poter leggere il valore attuale del contatore del semaforo int int sem_getvalue( sem_t *sem, int 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 22
23 Esempio 7: lettori e scrittori (1 di 5) #include #include <stdio.h> <stdio.h> #include #include <pthread.h> <pthread.h> #include #include <semaphore.h> <semaphore.h> #define #define LUN LUN #define #define CICLI CICLI 1 #define #define DELAY DELAY struct struct { char char scritta[lun+1]; scritta[lun+1]; /* /* Variabili Variabili per per la la gestione gestione del del buffer buffer */ */ int int primo, primo, ultimo; ultimo; /* /* Variabili Variabili semaforiche semaforiche */ */ sem_t sem_t mutex, mutex, piene, piene, vuote; vuote; shared; shared; void void *scrittore1(void *); *); void void *scrittore2(void *); *); void void *lettore(void *lettore(void *); *); Continua Semafori classici con i thread POSIX 23
24 Esempio 7: lettori e scrittori (2 di 5) int int main(void) main(void) { pthread_t pthread_t s1tid, s1tid, s2tid, s2tid, ltid; ltid; int int res, res, i; i; shared.primo shared.primo = shared.ultimo shared.ultimo = 0; 0; sem_init(&shared.mutex, 0, 0, 1); 1); sem_init(&shared.piene, 0, 0, 0); 0); sem_init(&shared.vuote, 0, 0, LUN); LUN); pthread_create(<id, NULL, NULL, lettore, lettore, NULL); NULL); pthread_create(&s1tid, NULL, NULL, scrittore1, scrittore1, NULL); NULL); pthread_create(&s2tid, NULL, NULL, scrittore2, scrittore2, NULL); NULL); pthread_join(s1tid, NULL); NULL); pthread_join(s2tid, NULL); NULL); pthread_join(ltid, NULL); NULL); printf("e' printf("e' finito finito l'esperimento l'esperimento...\n");...\n"); Continua Semafori classici con i thread POSIX 24
25 Esempio 7: lettori e scrittori (3 di 5) void void *scrittore1(void *scrittore1(void *in) *in) { int int i, i, j, j, k; k; for for (i=0; (i=0; i<cicli; i<cicli; i++) i++) { for(k=0; for(k=0; k<lun; k<lun; k++) k++) { sem_wait(&shared.vuote); sem_wait(&shared.vuote); /* /* Controllo Controllo che che il il buffer buffer non non sia sia pieno pieno */ */ sem_wait(&shared.mutex); sem_wait(&shared.mutex); /* /* Acquisisco Acquisisco la la mutua mutua esclusione esclusione */ */ shared.scritta[shared.ultimo] shared.scritta[shared.ultimo] = '-'; '-'; /* /* Operazioni Operazioni sui sui dati dati */ */ shared.ultimo shared.ultimo = (shared.ultimo+1)%(lun); (shared.ultimo+1)%(lun); sem_post(&shared.mutex); sem_post(&shared.mutex); /* /* Libero Libero il il mutex mutex */ */ sem_post(&shared.piene); sem_post(&shared.piene); /* /* Segnalo Segnalo l aggiunta l aggiunta di di un un carattere carattere */ */ for(j=0; for(j=0; j<delay; j<delay; j++); j++); /* /* perdo perdo un un po po di di tempo tempo */ */ return return NULL; NULL; Continua Semafori classici con i thread POSIX 25
26 Esempio 7: lettori e scrittori (4 di 5) void void *scrittore2(void *scrittore2(void *in) *in) { int int i, i, j, j, k; k; for for (i=0; (i=0; i<cicli; i<cicli; i++) i++) { for(k=0; for(k=0; k<lun; k<lun; k++) k++) { sem_wait(&shared.vuote); sem_wait(&shared.vuote); /* /* Controllo Controllo che che il il buffer buffer non non sia sia pieno pieno */ */ sem_wait(&shared.mutex); sem_wait(&shared.mutex); /* /* Acquisisco Acquisisco la la mutua mutua esclusione esclusione */ */ shared.scritta[shared.ultimo] shared.scritta[shared.ultimo] = '+'; '+'; /* /* Operazioni Operazioni sui sui dati dati */ */ shared.ultimo shared.ultimo = (shared.ultimo+1)%(lun); (shared.ultimo+1)%(lun); sem_post(&shared.mutex); sem_post(&shared.mutex); /* /* Libero Libero il il mutex mutex */ */ sem_post(&shared.piene); sem_post(&shared.piene); /* /* Segnalo Segnalo l aggiunta l aggiunta di di un un carattere carattere */ */ for(j=0; for(j=0; j<delay; j<delay; j++); j++); /* /* perdo perdo un un po po di di tempo tempo */ */ return return NULL; NULL; Continua Semafori classici con i thread POSIX 26
27 Esempio 7: lettori e scrittori (5 di 5) void void *lettore(void *lettore(void *in) *in) { int int i, i, j, j, k; k; char char local[lun+1]; local[lun+1]; local[lun] local[lun] = 0; 0; /* /* Buffer Buffer locale locale */ */ for for (i=0; (i=0; i<2*cicli; i<2*cicli; i++) i++) { for(k=0; for(k=0; k<lun; k<lun; k++) k++) { sem_wait(&shared.piene); sem_wait(&shared.piene); /* /* Controllo Controllo che che il il buffer buffer non non sia sia vuoto vuoto */ */ sem_wait(&shared.mutex); sem_wait(&shared.mutex); /* /* Acquisisco Acquisisco la la mutua mutua esclusione esclusione */ */ local[k] local[k] = shared.scritta[shared.primo]; shared.scritta[shared.primo]; /* /* Operazioni Operazioni sui sui dati dati */ */ shared.primo shared.primo = (shared.primo+1)%(lun); (shared.primo+1)%(lun); sem_post(&shared.mutex); sem_post(&shared.mutex); /* /* Libero Libero il il mutex mutex */ */ sem_post(&shared.vuote); sem_post(&shared.vuote); /* /* Segnalo Segnalo che che ho ho letto letto un un carattere carattere */ */ for(j=0; for(j=0; j<delay; j<delay; j++); j++); /* /* perdo perdo un un pò pò di di tempo tempo */ */ printf("stringa printf("stringa = %s %s \n", \n", local); local); return return NULL; NULL; Semafori classici con i thread POSIX 27
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
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
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
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
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
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
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
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
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à
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
C: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
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
System Call per la gestione dei semafori in Linux. Semafori: modello concettuale. Creazione ed inizializzazione di un semaforo
System Call per la gestione dei semafori in Linux Domenico Cotroneo Dipartimento di Informatica e Sistemistica Semafori: modello concettuale Processore D C B (sq)coda proc.sospesi s.count=1 semaforo A
Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0
STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1
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
Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.
Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;
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
Cenni ai Problemi classici di Sincronizzazione Processi Concorrenti. E. Mumolo
Cenni ai Problemi classici di Sincronizzazione Processi Concorrenti E. Mumolo Problemi classici Problemi di mutua esclusione proposti nel corso degli anni Modelli di problemi reali Problema del produttore
Gestione dinamica della memoria
Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - [email protected] A pessimistic programmer sees the array as half empty.
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
Gestione dei file in C
Gestione dei file in C Fondamenti di Informatica Che cos è un file e a cosa serve? Memoria di massa vs memoria centrale q La memoria di massa (disco fisso) è un dispositivo di memorizzazione generalmente
Corso di Programmazione Concorrente Processi. Valter Crescenzi
Corso di Programmazione Concorrente Processi Valter Crescenzi http://crescenzi.inf.uniroma3.it Sommario Processi vs Thread Creazione e terminazione di processi chiamata di sistema fork() chiamata di sistema
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
Stringhe e allocazione dinamica della memoria
Stringhe e allocazione dinamica della memoria Esercizio Scrivere un programma strings.c che legge da standard input una sequenza di parole separate da uno o più spazi, e stampa le parole lette, una per
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
Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi
Informatica 1 Corso di Laurea Triennale in Matematica Gianluca Rossi [email protected] Dipartimento di Matematica Università di Roma Tor Vergata 11: Stringhe (www.informatica-uno.blogspot.com)
Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-
Lab. di Sistemi Operativi - Esercitazione n 9- -Thread- 1 Sommario Esercizi su: Comunicazione tra processi: la funzione pipe() Condivisione dati e codice tra due o più processi: concetto di Thread 2 -
Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.
Unità Didattica 1 Linguaggio C Fondamenti. Struttura di un programma. 1 La storia del Linguaggio C UNIX (1969) - DEC PDP-7 Assembly Language BCPL - un OS facilmente accessibile che fornisce potenti strumenti
La gestione della memoria dinamica Heap
Laboratorio di Algoritmi e Strutture Dati La gestione della memoria dinamica Heap Prof. Luigi Lamberti 2005 Cenni sui Processi Un Programma è un insieme di Istruzioni memorizzato in un file con le costanti
Il linguaggio C. Notate che...
Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione
Modelli di programmazione parallela
Modelli di programmazione parallela Oggi sono comunemente utilizzati diversi modelli di programmazione parallela: Shared Memory Multi Thread Message Passing Data Parallel Tali modelli non sono specifici
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
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
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. 2014-15 Pietro Frasca Lezione 20 Martedì 16-12-2014 1 System call per la gestione dei processi Creazione
LIBRERIE STANDARD in C. LIBRERIE STANDARD in C
LIBRERIE STANDARD in C La libreria standard del C è in realtà un insieme di librerie Per usare una libreria, non occorre inserirla esplicitamente nel progetto: ogni ambiente di sviluppo sa già dove cercarle
Comunicazione tra processi: pipe Le pipe sono un meccanismo UNIX di Inter Process Communication (IPC)
Comunicazione tra processi: pipe Le pipe sono un meccanismo UNIX di Inter Process Communication (IPC) Le pipe sono canali di comunicazione unidirezionali Limitazione pipe: permettono la comunicazione solo
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;
Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE
Input/output da file Il linguaggio C non contiene istruzioni di I/O, in quanto tali operazioni vengono eseguite tramite funzioni di libreria standard. Questo approccio rende estremamente flessibile e potente
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
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
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
perror: individuare l errore quando una system call restituisce -1
perror: individuare l errore quando una system call restituisce -1 Quando una system call (o una funzione di libreria) non va a buon fine, restituisce come valore -1 Come si fa a sapere più precisamente
Input/Output di numeri
Input/Output di numeri I/O di numeri Per utilizzare le funzioni di I/O occorre include il file di intestazione (o file header) stdio.h utilizzando all inizio del sorgente la direttiva #include
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 - [email protected] Daniele ConoD'Elia - [email protected] Federico Lombardi - [email protected] Sistemi di Calcolo - Secondo
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 8 Martedì 8-11-2016 1 Algoritmi di scheduling basati sulle priorità Assegnano
System call per la gestione di processi
System call per la gestione di processi Chiamate di sistema per creazione di processi: fork() sostituzione di codice e dati: exec...() terminazione: exit() sospensione in attesa della terminazione di figli:
INTERPROCESS COMMUNICATION 27
INTERPROCESS COMMUNICATION 27 - Le comunicazioni tra processi (IPC, Intreprocess Communication) sono realizzate mediante strutture dati rese disponibili dal kernel. Sono disponibili 3 tipologie di comunicazioni
Panoramica Introduttiva su Inter-Process Communication (IPC)
Panoramica Introduttiva su Inter-Process Communication (IPC) Inter-Process Communication: panoramica (1) Dei processi si dicono cooperanti se si influenzano l'un con l'altro. Per potersi influenzare dei
2. I THREAD. 2.1 Introduzione
2. I THREAD 2.1 Introduzione Il tipo di parallelismo che è opportuno avere a disposizione nelle applicazioni varia in base al grado di cooperazione necessaria tra le diverse attività svolte in parallelo:
Esercizio 1 (15 punti)
Esercizio 1 (15 punti) Corsi di laurea in Ingegnera Elettronica e Ingegneria Gestionale Fondamenti di Programmazione / Fondamenti di Informatica I Prova scritta del 16 giugno 2017 Il noto gioco MasterMind
Relazione tra thread e processi
I Thread POSIX Relazione tra modello a processi e a thread Creazione di un thread Attesa Distacco Terminazione Ricerca e confronto Inizializzazione dinamica Relazione tra thread e processi Nel modello
STRINGHE: ARRAY DI CARATTERI! a p e \0
STRINGHE: ARRAY DI CARATTERI! Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più
