Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-



Documenti analoghi
Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Chiamate di sistema per la Inter Process Communication (IPC) in POSIX. E.Mumolo, DEEI

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

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

File I/O. M. R. Guarracino: File I/O 1

Laboratorio di Sistemi Operativi

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Addendum alle chiamate di sistema per la gestione processi. E Mumolo

IPC System V. Code di messaggi

Esercizio sulla gestione di file in Unix

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

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

I/O su Socket TCP: read()

La sincronizzazione è legata alla implementazione delle pipe: int pipe(int fd[2]);

Esercitazione di Lab. di Sistemi Operativi 1 a.a. 2011/2012

Esercitazione di Lab. di Sistemi Operativi. - I/0 di basso livello

" &$ () " ) ) $ ' () *) " ) $

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

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

Sistemi Operativi Teledidattico

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3. 1 strace : visualizzazione delle system call invocate da un processo

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI

CREAZIONE PROCESSI IN UNIX 20

Interprocess Communication (IPC)

Laboratorio di Sistemi Operativi

La creazione di un nuovo processo in UNIX

2. I THREAD. 2.1 Introduzione

Gestione dei processi

Programmazione multiprocesso

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ&

Sistemi Operativi (M. Cesati)

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

Processi UNIX. I Processi nel SO UNIX. Gerarchie di processi UNIX. Modello di processo in UNIX

Corso di Sistemi Operativi A.A CHIAMATE DI SISTEMA PER IL CONTROLLO DEI PROCESSI. Fabio Buttussi

I puntatori e l allocazione dinamica di memoria

Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ;

Caratteri e stringhe Esercizi risolti

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Esercitazione di Lab. di Sistemi Operativi a.a. 2012/ I processi Unix -

Sistemi Operativi (M. Cesati)

Chiamate di sistema. Pipe Flus s i di I/O

Elementi di Architettura e Sistemi Operativi

Sistemi Operativi L-A. Esercizi 14 Giugno Esercizio monitor

Sistemi Operativi (M. Cesati)

System call per l accesso a file

Introduzione al Linguaggio C

Chiamate di sistema. Pipe Flussi di I/O

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

Inter Process Communication. Laboratorio Software C. Brandolese

Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo

Lezione 5. Processi e thread. Sistemi operativi. Marco Cesati System Programming Research Group Università degli Studi di Roma Tor Vergata

Processi in Linux. Stru/ura file eseguibili

Comunicazione tra processi: pipe Le pipe sono un meccanismo UNIX di Inter Process Communication (IPC)

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Esercitazione 4. Gestione dei file in Unix

I SISTEMI OPERATIVI (1)

puntatori Lab. Calc. AA 2007/08 1

Sistemi Operativi (M. Cesati)

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Introduzione al linguaggio C Gli array

La Comunicazione tra Processi in Unix

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

case 0: /* child 1 - writing end */ close(fd[0]); // close read end write(fd[1], string, (strlen(string)+1));/* +1 is termination \0 */ return (0);

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Sistemi Operativi (M. Cesati)

I thread nel sistema operativo LINUX: Linuxthreads

Gestione dei File in C

Riepilogo sulla Concorrenza

Corso di Laboratorio di Sistemi Operativi

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A ) 31 MARZO 2006

Funzioni. Il modello console. Interfaccia in modalità console

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread

Compilare il primo programma. Primo programma in C. Esercizio Somma due numeri. Compilare il primo programma. Analisi. Analisi

System calls. permettono ai programmi utente di richiedere servizi al Sistema Operativo. servizi come scrittura di file, stampa su video, ecc.

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3

Politecnico di Torino

Principles of Concurrent Programming

Sistemi Operativi (M. Cesati)

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.


Le system call: fork(), wait(), exit()

Calcolatori Elettronici Parte X: l'assemblatore as88

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

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Sistemi Operativi 1. Mattia Monga. a.a. 2018/19. Dip. di Informatica Università degli Studi di Milano, Italia

SC per Inter Process Comminication. Pipe senza nome e con nome (FIFO)

RICERCA DI UN ELEMENTO

Allocazione dinamica della memoria - riepilogo

Socket TCP. seconda parte

Esercizio 2. Client e server comunicano attraverso socket TCP

La struttura dati ad albero binario

Qualche esercizio. E. Mumolo

Sistemi Operativi (M. Cesati)

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Digressione: man 2...

Programmazione di sistema in Linux: System Call per le IPC (InterProcessCommunication) E. Mumolo

Lezione 21. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.

Transcript:

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

- Gestione dei processi - Comunicazione tra processi: la funzione pipe() 3

Esercizio n 1 fork + pipe - Scrivere un programma C in cui il processo di comunicazione tra padre e figlio è gestito da una pipe. Il programma dovrà quindi creare la pipe, generare il processo figlio PF che scriverà nella pipe una stringa inserita da tastiera. Il processo padre, visualizzerà sul video il contenuto della pipe. Esecuzione: $./a.out Introduci una stringa da scrivere nella pipe e premi [Enter] Output: Il padre ha letto nella pipe la stringa <aaaaaaaaaa> 4

Soluzione Esercizio n 1 #include <stdio.h> /* perror */ #include <errno.h> /* perror */ #include <unistd.h> /* write, lseek, close, exit */ #include <sys/types.h> /*open, lseek */ #include <sys/stat.h> /*open */ #include <fcntl.h> /*open*/ #define MAXLINE 256 int main (void) { int pid,fd[2]; /*contiene i due descrittori per accedere alla pipe in lettura ed in scrittura*/ int nread; char line[maxline]; if (pipe(fd)<0) { /*restituisce in fd due descrittori fd[0]: per la lettura e fd[1]: per la scrittura*/ perror("pipe"); exit(1); if((pid=fork())<0) /*Creazione di un nuovo processo */ {perror("fork"); exit(1); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 5

Soluzione Esercizio n 1 else if (pid==0) /* pid=0 : Processo figlio */ { printf("introduci una stringa da scrivere nella pipe e premi [Enter]\n"); scanf("%s",line); close(fd[0]); /*chiude il descrittore per leggere dalla pipe*/ /*Rimane bloccato nel write finchè la pipe è piena*/ write(fd[1],line,strlen(line)); /*Scrive la stringa nella pipe*/ else /* pid > 0 : Processo padre */ { close(fd[1]); /*chiude il descrittore per scrivere nella pipe*/ /*Rimane bloccato nel read finchè la pipe è vuota*/ nread = read(fd[0],line,maxline); /*Legge la stringa nella pipe*/ line [nread]='\0'; /*terminatore di null*/ printf("il padre ha letto nella pipe la stringa %s\n",line); exit(0); 6

Esercizio n 2 fork + pipe - Scrivere un programma C che prenda come parametro un file inputfile (controllare che il numero di argomenti passati sia corretto). Il programma dovrà aprire tale file, creare un processo figlio, PF che comunica con il processo padre mediante una pipe. Il processo figlio, leggerà i primi 10 caratteri di tale file, scrivendoli nella pipe, il padre, visualizzerà sul video i caratteri scritti dal figlio leggendoli dalla pipe Esempio inputfile 111111111122222222223333333333444444444455555555556666666666 Output: Il padre ha letto nella pipe la stringa 1111111111 7

Soluzione Esercizio n 2 #include <stdio.h> /* perror */ #include <errno.h> /* perror */ #include <unistd.h> /* write, lseek, close, exit */ #include <sys/types.h> /*open, lseek */ #include <sys/stat.h> /*open */ #include <fcntl.h> /*open*/ #define READLENGTH 10 main(int argc, char **argv) { int infile, fd[2], pid, nread; char buf[10]; if (argc!= 2) { printf ("uso: nomeprogramma <inputfile> \n"); exit (1); /* Apertura file inputfile*/ if ((infile=open(argv[1], O_RDONLY)) <0) { printf("errore apertura inputfile %s\n:",argv[1]); exit(1); if (pipe(fd)<0) {perror("pipe"); exit(1); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 8

Soluzione Esercizio n 2 /*Esecuzione fork*/ if ((pid = fork()) == -1) { perror("fork"); exit(1); else if (pid == 0) /*Processo Figlio*/ { close(fd[0]); /*chiude il descrittore di lettura della pipe*/ /*legge i primi 10 caratteri dal file*/ if ( (nread = read(infile, buf, READLENGTH)) <= 0) { close(infile); exit(1); /*scrive i primi 10 nella pipe*/ if ( (write(fd[1], buf, READLENGTH)) <= 0) { close(fd[1]); exit(1); close(fd[1]); exit(0); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 9

Soluzione Esercizio n 2 else { /*Processo Padre*/ close(fd[1]); /*chiude il descrittore per la scrittura sulla pipe*/ /*legge i primi 10 caratteri dalla pipe*/ if ( (nread = read(fd[0], buf, READLENGTH)) <= 0) { close(fd[0]); exit(1); /*scrive a video primi 10 caratteri*/ if ( (write(stdout_fileno, buf, READLENGTH)) <= 0) { close(fd[0]); exit(1); close(fd[0]); close(infile); exit(0); 10

Esercizio n 3 fork + 2 pipe (comunicazione bidirezionale) Scrivere un programma C che realizzi una comunicazione bidirezionale tra il processo padre ed il processo figlio mediante la creazione di due pipe distinte pipe1, pipe2 Il programma dovrà creare le due pipe ed il processo figlio. Il processo padre, scriverà sulla pipe1 (pdf1) un messaggio immesso da tastiera, il processo figlio leggerà tale messaggio dalla pipe1 (pdf1), lo stamperà a video e scriverà la notifica di lettura sulla pipe2 (pdf2) che verrà poi letta dal padre e stampata a video. (Utilizzare la funzione fgets per leggere un messaggio con spazi inserito da tastiera) Esecuzione:./a.out Inserire il messaggio e premere [ENTER] Output: Il processo figlio ha ricevuto il messaggio: <xxxxxx> Il processo padre ha ricevuto la notifica di lettura del messaggio <xxxxxx> 11

Soluzione Esercizio n 3 #include <stdio.h> /* perror */ #include <errno.h> /* perror */ #include <unistd.h> /* write, lseek, close, exit */ #include <sys/types.h> /*open, lseek */ #include <sys/stat.h> /*open */ #include <fcntl.h> /*open*/ #define SIZE 128 int main(int argc, char **argv) { int pfd1[2], pfd2[2]; /*descrittori di pipe*/ int nread, pid; char inbuf[size], outbuf[size]; if (pipe(pfd1)!=0 pipe(pfd2)!=0) { /*creazione delle due pipe*/ perror("pipe() fallita)"); exit(-1); if ((pid=fork()) < 0 ) { /*creazione del processo figlio*/ perror("fork() fallita"); exit(-2); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 12

Soluzione Esercizio n 3 if (pid==0) { /* figlio */ close(pfd1[1]); /*descrittore di lettura pipe1 */ close(pfd2[0]); /*descittore di scrittura pipe2 */ /* legge un messaggio dal padre */ nread=read(pfd1[0], inbuf, SIZE); /*legge il messaggio da pipe1*/ inbuf[nread]='\0'; /*terminatore di null */ close(pfd1[0]); printf("il figlio ha ricevuto il messaggio: %s\n", inbuf); /* manda un messaggio indietro di notifica lettura su pipe2*/ write(pfd2[1],inbuf,strlen(inbuf)); close(pfd2[1]); /*CONTINUA NELLA SLIDE SUCCESSIVA*/ 13

Soluzione Esercizio n 3 else { /* padre */ close(pfd1[0]); /*descrittore di scrittura pipe1 */ close(pfd2[1]); /*descrittore di lettura pipe2 */ printf("inserire il Messaggio e premere [ENTER]"); // legge un msg fgets(outbuf,size,stdin); // da tastiera write(pfd1[1], outbuf, strlen(outbuf)); /*Scrittura su pipe1 il mess*/ close(pfd1[1]); /* leggi il messaggio di notifica lettura del figlio */ nread = read(pfd2[0],inbuf,size); /*Lettura su pipe2*/ inbuf[nread]='\0'; /*terminatore di null */ close(pfd2[0]); printf("il padre ha ricevuto la notifica di lettura del messaggio: %s\n",inbuf); exit(0); 14

- CreazioneThread - 15

- CreazioneThread - Funzione pthread_create 16

- Terminare unthread - 17

- Aspettare la terminazione unthread - 18

Esercizio n 4 Thread (base) Scrivere un programma C che crea un Thread ed attende la terminazione dello stesso Compilazione: Opzione di compilazione $ gcc nomeprogramma.c -lpthread Esecuzione $./a.out Output Thread terminato con status: <valore status> 19

Soluzione Esercizio n 4 Thread #include <stdio.h> #include <pthread.h> #include <sys/types.h> // Funzione che verrà eseguita dal thread void *start(void* arg) { printf ("Sono un thread richiamato dal processo padre\n"); pthread_exit(0); main() { // Identificatore del thread pthread_t t; int status; if (pthread_create(&t, NULL, start, NULL)!= 0) { printf ("Errore nella creazione del nuovo thread\n"); exit(1); // Attende che il thread venga terminato pthread_join(t, &status); printf ("Il thread è terminato con status %d\n",status); - 20

Esercizio n 5 Thread (passaggio dei parametri) Scrivere un programma C che accetta un numero intero <n> da riga di comando, crea un Thread che sommerà ad una variabile globale intera di valore m il valore di n ed infine ne stampa il risultato a video. Compilazione: Opzione di compilazione $ gcc nomeprogramma.c -lpthread Esecuzione $./a.out <n> Output La somma di m + <n> è: xxx 21

Soluzione Esercizio n 5 Thread #include <sys/types.h> #include <unistd.h> Permette di passare alla #include <pthread.h> funzione somma strutture di diverso tipo #include <stdlib.h> #include <stdio.h> int m=10; /* Variabile globale modificata dal thread */ void *somma(void* arg) {//Funzione che verrà eseguita dal thread cast ad int del tipo void passato int *n = (int) arg; printf ( La somma di m + n è: %d\n", m + (*n)); sleep(2); /*Aspetta due secondi prima di terminare*/ pthread_exit(0); - 22

Soluzione Esercizio n 5 Thread main(int argc, char **argv) { pthread_t t; int status; int arg[1]; if (argc<2) { Passaggio printf ("uso: nome_programma <valore> \n"); parametri exit(1); alla arg[0]=atoi(argv[1]); /*valore da sommare*/ if (pthread_create(&t, NULL, somma, arg)!= 0) { printf ("Errore nella creazione del nuovo thread\n"); exit(1); // Attendo che il thread venga terminato pthread_join(t, &status); printf ("Il thread è terminato con status %d\n", status); - somma di funzione 23

Esercizio n 6 Thread (Memoria condivisa fra Thread) Scrivere un programma C che crea due Thread somma1 e somma2, entrambi accedono alle variabili test.a e test.b di una struttura dati test condivisa incrementandole di 1per 10 volte, aspettano 2 secondi prima di stampare a video i valori delle due variabile. Supporremo che tale accesso non venga regolamentato da alcun meccanismo di gestione della concorrenza. Compilazione: $ gcc nomeprogramma.c -lpthread Esecuzione $./a.out 24

Soluzione Esercizio n 6 Thread #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <sys/types.h> #define CICLI 10 /*Costante usata per incrementare le variabili*/ struct test {/* Memoria Condivisa fra i thread */ int a; int b; mytest; /* dichiarazione delle due funzioni dei due thread*/ void *somma1(void *); void *somma2(void *); int main(void) { pthread_t som1tid, som2tid; /* Inizializzo la memoria condivisa */ mytest.a = 0; mytest.b = 0; - 25

Soluzione Esercizio n 6 Thread - /* A questo punto posso creare i thread */ if (pthread_create(&som1tid, NULL, somma, NULL)!= 0) { printf ("Errore nella creazione del thread somma1\n"); exit(1); /* A questo punto posso creare i thread... */ if (pthread_create(&som2tid, NULL, somma, NULL)!= 0) { printf ("Errore nella creazione del thread somma2\n"); exit(1); /* A questo punto aspetto che i due thread finiscano */ pthread_join(som1tid, NULL); pthread_join(som2tid, NULL); printf("e' finito il programma...\n"); exit (0); 26

Soluzione Esercizio n 6 Thread - void *somma(void *in) {//Funzione che verrà eseguita dai thread { int i; for(i=0; i<cicli; i++) { mytest.a++; mytest.b++; /* sleep di 2 secondi */ sleep(2); printf("somma1 -- a = %d \n", mytest.a); printf("somma1 -- b = %d \n", mytest.a); pthread_exit(0); 27

Soluzione Esercizio n 6 Thread - void *somma2(void *in) {//Funzione che verrà eseguita dal thread 2 { int i; for(i=0; i<cicli; i++) { mytest.a++; mytest.b++; /* sleep di 2 secondi */ sleep(2); printf("somma2 -- a = %d \n", mytest.a); printf("somma2 -- b = %d \n", mytest.b); pthread_exit(0); 28