Primitive del linguaggio C relative ai processi

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Primitive del linguaggio C relative ai processi"

Transcript

1 Primitive del linguaggio C relative ai processi Per poter utilizzare le primitive del Linguaggio C relative ai processi occorre includere nel progetto le seguenti librerie: #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> pid_t getpid (); Restituisce il PID del processo corrente. pid_t in realtà è la ridefinizione di un int. pid_t getppid ( ) Restituisce il PID del processo padre rispetto al processo corrente. int getattribute (pid_t PID, attrstruct *) Restituisce nella struttura gli attributi del processo avente il PID indicato. Restituisce 0 in caso di successo createprocess (spawn) Alcuni SO (ad esempio VMS) mettono a disposizione una primitiva createprocess (detta anche spawn che letteralmente significa uovo, simbolo di nascita) che consente ad un processo in esecuzione (quale la shell o un qualunque altro processo utente) di creare nuovi processi figli caricando l immagine da disco. In Ansi C non esiste la spawn ma occorre utilizzare al suo posto una combinazione delle primitive fork + exec. In Visual Basic esiste invece una primitiva spawn avente la seguente sintassi: Process.Start(path.exe) int fork( ) <unistd> La system call fork consente di duplicare il processo corrente, creando un processo figlio con la stessa identica immagine di memoria del padre (stesse variabili, stessi file aperti). Il processo figlio riceve una copia dei segmenti di codice, stack e dati, ed esegue esattamente lo stesso codice del padre. Si tenga presente però che la memoria è copiata, non condivisa, pertanto padre e figlio vedono variabili diverse ed evolvono ciascuno con vita propria. Il processo figlio avrà un suo proprio ed unico PID diverso da quello del padre. In caso di successo, la funzione fork() ritorna due valori differenti, 0 al processo figlio ed il PID del processo figlio al processo padre. In caso di esito negativo, fork() ritorna -1 al processo padre, settando errno per indicare l'errore verificatosi, e non viene creato nessun processo figlio. Esempio: int ret; /* process identifier */ ret=fork(); if (ret < 0) { printf("error: Cannot fork!!\n"); exit(1); if (ret!= 0) { /* parent process */ else { /* child process */ pag 1

2 L'uso di fork ha due scopi principali: Caricamento di nuovi programmi da disco. Questo è il caso della shell, in cui il processo shell crea un processo figlio il cui unico scopo è quello di lanciare un nuovo programma da disco. Non esistendo in C la primitiva spawn occorre utilizzare una combinazione delle primitive fork + exec.. Creazione di processi figli a cui affidare l'esecuzione di una certa sezione di codice, mentre il processo padre ne esegue un'altra. È il caso tipico dei programmi server in cui il padre riceve ed accetta le richieste da parte dei programmi client, per ciascuna delle quali avvia un figlio che è incaricato di fornire il servizio (funzionalità in parte sostituita dai thread che sono più leggeri) Nota: La funzione fork duplica nei figli tutti i file descriptor aperti nel padre, il che comporta che padre e figli condividono le stesse voci della file table, come ad esempio la posizione corrente nel file. int exec(const char * path) <unistd> Le system call della famiglia exec provvedono a caricare un programma dal disco alla memoria, sostituendo l immagine del processo chiamante con l immagine del nuovo processo.. Il nuovo programma si sostituisce interamente, come dati e codice, a quello vecchio, che non e' piu' "raggiungibile". Il nuovo processo avrà però lo stesso PID del processo sostituito e manterrà inalterate le tavole file (file aperti, posizionamento all'interno di essi, relazioni con altri processi ecc.). In caso di successo le funzioni exec non ritornano alcun valore ed eventuale codice successivo alla chiamata non viene più eseguito. In caso invece di errore ritorna -1 ed il processo chiamante continua la propria esecuzione eseguendo eventuale codice successivo alla exec. La famiglia exec contempla una lista di funzioni le più importanti delle quali sono: int execl (const char * path, char * arg0, char * arg1,.... NULL). path indica il percorso completo (path + filename) dell applicazione da lanciare Attenzione che all interno del path NON sono riconosciuti i percorsi che iniziano con la tilde. arg0 è l nome del programma, più ulteriori parametri espressi singolarmente come stringa e terminati da NULL int execv (const char * path, char ** argv... NULL). argv è la lista completa dei parametri, a partire dal nome del programma, passata in un solo parametro. pid_t wait (int* status) System call utilizzata da un processo padre per attendere la conclusione di un qualunque processo figlio. Wait restituisce il PID del processo figlio che ha terminato l esecuzione, mentre restituisce all interno di status lo stato di terminazione del figlio (se il figlio termina mediante un exit, questo status rappresenta il valore passato a exit). Se un figlio è già terminato la funzione termina immediatamente. In caso di più processi figli occorre richiamare la funzione wait più volte, una volta per ogni figlio. Se si eseguono più wait rispetto al numero di figli creati, le wait eccedenti terminano immediatamente. In caso di terminazione di un processo con processi figli ancora in esecuzione, questi vengono ereditati dal processo init e viene loro assegnato un PPID = 1. Nel caso invece di terminazione di un processo figlio con il padre ancora in esecuzione senza aver richiamato wait o waitpid, il figlio non viene deallocato fino a quando il padre non farà la wait e rimane in uno stato di attesa in cui il processo è indicato come zombie. Infatti quando un processo termina invia al padre un segnale SIGCHLD che il padre può intercettare mediante le funzioni wait o waitpid, che provocano a loro volta un segnale di risposta al figlio. In caso di assenza di segnale di risposta il figlio non viene deallocato ma rimane in attesa (processo zombi). pag 2

3 pid_t waitpid (pid_t PID, int *STATUS_PTR, int OPTIONS) - (tradizionale funzione join) Ferma il padre in attesa della terminazione di uno specifico processo figlio, quello avente il PID indicato dal primo parametro (join tra padre e figlio). STATUS_PTR un puntatore ad un intero che conterrà lo stato di terminazione del processo figlio. OPTIONS è di solito impostato a 0.. Restituisce il PID del processo figlio che ha terminato Se il PID passato come primo parametro è -1 waitpid esce immediatamente. int exit (int status) System call che consente la terminazione forzata del processo corrente, chiudendo tutti i file e deallocandolo dalla memoria. Il valore del parametro status rappresenta il valore che verrà restituito alle primitive wait o waitpid utilizzate dal padre per attendere la terminazione del figlio. int sleep (int sec) tradizionale funzione delay Sospende il processo per un numero di secondi pari a sec. Ritorna il valore passato come parametro. Ad esempio il codice seguente arresta il processo per un tempo compreso tra 0 e 3 secondi. sleep (rand()%4); Al termine del tempo indicato il processo viene automaticamente riavviato. int usleep (int usec) Sospende il processo per un numero di micro secondi pari a usec. Ritorna il valore passato come parametro. Ad esempio il codice seguente arresta il processo per un tempo pari a 10 msec. usleep (10000); Al termine del tempo indicato il processo viene automaticamente riavviato. void system (char * command) Consente di eseguire un comando della shell. Ad esempio :per rimuovere un file system("rm../file1"); int kill(pid_t pid, int sig); tradizionale funzione abort System call per eseguire la terminazione forzata di un altro processo (in base ai livelli di privilegio) di cui si passa il PID. Il parametro sig indica il tipo di azione da eseguire e vale normalmente SIGKILL. In caso di successo viene ritornato il valore 0, altrimenti viene ritornato il valore -1 e la variabile errno indica l'errore specifico int pause( ) tradizionale funzione suspend Il processo e' sospeso (sempre presente nella process table ma non piu' schedulato) finche' non arriva un qualunque signal di risveglio. void * signal(int signum, void (*sighandler)(int)) tradizionale funzione resume Consente di programmare il risveglio dallo stato di WAIT del processo corrente sospeso mediante pause. La funzione signal() stabilisce che quando il processo corrente riceve il segnale signum, il controllo deve passare alla procedura indicata dal secondo parametro (che è un puntatore a funzione). Ad esempio, prima di eseguire il pause(), si può eseguire una signal(sigint, miaproc); dopo di che si esegui il pause(). Il comando SIGINT è legato al ^C. Il significato è che quando l utente premerà la combinazione ^C il sistema provvederà a risvegliare il processo richiamando la funzione miaproc. pag 3

4 Comandi dello shell per la gestione dell area di condivisione fra processi ipcs [ -asmq ] [ -tclup ] ipc show comando che consente di visualizzare informazioni riguardanti gli oggetti IPC attualmente allocati su di un computer ipcs serve per ottenere informazioni sullo stato di: shared memory [-m] code di messaggi [-q] semafori [-s] tutto [-a] (default) Il formato di visualizzazione può essere specificato nel modo seguente: -t time -p pid -c creator -l limits -u summary ipcs [ -smq ] -i id consente di visualizzare le informazioni di una risorsa specifica (quella identificata da id) ipcrm ipc remove comando che consente di disallocare semafori (-s), code di messaggi (-q), aree di memoria condivisa (-m) Es. ipcrm s Rimuove il semaforo con semid = OPTIONS -M shmkey removes the shared memory segment created with shmkey after the last detach is performed. -m shmid removes the shared memory segment identified by shmid after the last detach is performed. -Q msgkey removes the message queue created with msgkey. -q msgid removes the message queue identified by msgid. -S semkey removes the semaphore created with semkey. -s semid removes the semaphore identified by semid. ps process show elenco dei processi attivi per l utente corrente. Per ogni processo in esecuzione fornisce le seguenti informazioni : PID = numero di identificazione del processo, TTY = codice di identificazione del terminale, STAT = stato del processo, TIME Tempo di start del processo COMMAND = riga di comando con cui e' stato fatto partire il processo. opzioni - a mostra anche i processi degli altri utenti - e mostra TUTTI i processi in esecuzione, compresi quelli di root - x mostra i processi non controllati da un terminale Es ps -a grep kill Il comando kill non serve soltanto per terminare un processo, ma serve per mandare dei messaggi ad un processo. Il primo parametro rappresenta il tipo di messaggio da inviare (-9 significa terminazione). Il secondo parametro rappresenta il PID del processo a cui inviare il messaggio. Es kill // richiesta di terminazione del processo 2345 Es kill -9 xorg // richiesta di terminazione dell'interfaccia grafica pstree mostra l albero dei processi correnti pag 4

5 <sys/ipc.h> <sys/sem.h> <sys/types.h> già utilizzata per le fork(). Creazione di un gruppo di semafori Utilizzo dei SEMAFORI in Ansi C La funzione semget consente di allocare un intero gruppo di semafori. Riceve come parametro un int semkey compreso tra 1 e e restituisce un semid identificativo del gruppo di semafori creato oppure -1 in caso di errore. int semget(key_t semkey, int nsems, int options); key_t è la ridefinizione di un int (definito in <sys/types.h>) e rappresenta la chiave per identificare univocamente il gruppo dei semafori all interno del sistema. Secondo i principi del C questa chiave dovrebbe essere generata in modo casuale mediante la funzione key_t ftok(const char *pathname, int proj_id). int nsems rappresenta il numero di semafori che si intende creare all interno dell insieme. Tipicamente uno solo. int options è sostanzialmente lo stesso utilizzato dalla funzione open per l apertura di un file. Stabilisce le modalità di creazione del semaforo. E' costituito da 7 bit di modalità + 9 bit (quelli inferiori) relativi ai permessi di accesso al semaforo (creatore del semaforo, appartenenti al gruppo del creatore e tutti gli altri). Per quanto riguarda le modalità di creazione del semaforo si possono utilizzare alcune costanti predefinite e quali ad esempio IPC_CREAT (contenuta in <sys/ipc.h>) che ordina le creazione del semaforo e IPC_EXCL (contenuta in <sys/shm.h>) che, se usato congiuntamente con IPC_CREAT provoca il fallimento di semget se un insieme di semafori è già associato al valore key Per quanto riguarda invece i permessi si utilizza solitamente il valore ottale 0666 che significa , Il primo bit rappresenta il diritto di lettura del proprietario, poi il diritto di scrittura ed infine il diritto di esecuzione. Per i semafori, che sono sostanzialmente una struttura di memoria, il diritto di esecuzione non è significativo per cui non lo si assegna. Il secondo ottetto è riferito al gruppo del proprietario e l ultimo a tutti gli altri. Il valore ottale 0600 assegnerebbe i diritti di lettura e scrittura soltanto al proprietario). Ciascun semaforo dell'insieme creato da semget è internamente realizzato come una struttura di tipo sem che ne contiene i dati essenziali. Questa struttura non è direttamente accessibile in user space, ma il suo contenuto può essere letto / scritto in maniera indiretta, attraverso l'uso di apposite funzioni di controllo. Inizializzazione e Controllo del semaforo int semctl(int mid, int sem_num, int cmd, union semun arg) Restituisce 0 in caso di successo e -1 in caso di errore int mid identificativo del gruppo di semafori creati mediante semget a cui si intende accedere int sem_num indice (all interno del gruppo) del semaforo su cui si intende operare (partendo da 0) int cmd specifica il comando da eseguire. I valori più significativi per il parametro cmd sono: - SETVAL che assegna al semaforo il valore indicato dal quarto parametro. - GETVAL legge il contenuto del semaforo. Il quarto parametro viene ignorato (da omettere). In questo caso la funzione restituisce il valore letto oppure -1 in caso di errore. - IPC_RMID Rimuove l'insieme di semafori e le relative strutture dati, con effetto immediato. Tutti i processi che erano stato di sleep vengono svegliati, e ritornan un codice errore 43 (Semaforo Rimosso). Il quarto parametro union semun arg, da utilizzarsi soltanto in abbinamento a SETVAL, è una union (cioè una struttura nella quale tutti i membri hanno piazzamento zero rispetto alla base). Il primo membro di semun (il più semplice da utilizzare) è un intero che rappresenta il valore da assegnare al semaforo, per cui alla union semun si può semplicemente assegnare il valore intero a cui si intende inizializzare il semaforo. pag 5

6 Esempio di codice int create (int semkey, int valiniziale){ int mutexid, ret; mutexid = semget(semkey, 1, IPC_CREAT IPC_EXCL 0666); if (mutexid >= 0){ ret = semctl(mutexid, 0, SETVAL, valoreiniziale); if (ret == -1) mutexid=-99; return mutexid; // Rimuove il semaforo indicato da mutexid. Restituisce 0 in caso di successo int remove(int mutexid) { return semctl(mutexid, 0, IPC_RMID); // Legge il contenuto del semaforo indicato da mutexid e ne Restituisce il contenuto int read(int mutexid) { return semctl(mutexid, 0, GETVAL); Un altra funzionalità che potrebbe servire è una funzione find che consenta di individuare l identificativo del mutex a partire dalla chiave semkey di generazione del mutex. A tal fine si sfrutta ancora la funzione iniziale semget settando a 0 il terzo parametro relativo alle options. int find(int semkey) { return semget(semkey,1,0); Accessi al semaforo (wait e signal) Una volta creato ed inizializzato il semaforo, un qualunque che ne conosca il mutexid può accedere al semaforo mediante le operazioni di wait e signal che, in ANSI C sono realizzate mediante un'unica primitiva semop avente la seguente firma: int semop(int mutexid, struct sembuf *cmd, unsigned ncmd) Restituisce 0 in caso di successo e -1 in caso di errore. mutexid identificativo del gruppo di semafori creati mediante semget a cui si intende accedere ncmd = 1 indica il numero di comandi da effettuare (La funzione permette infatti di eseguire operazioni multiple sui singoli semafori dell insieme) struct sembuf *cmd, è un puntatore ad un vettore di strutture sembuf contenenti i valori relativi alle operazioni da eseguire. Le operazioni richieste vengono effettivamente eseguite soltanto se è possibile effettuarle tutte quante (atomicità). Normalmente si esegue una sola operazione alla volta assegnando il valore 1 a ncmd La struttura sembuf è articolata nel modo seguente: struct sembuf { unsigned short int sem_num; /* numero del semaforo all interno del gruppo */ short int sem_op; /* operazione da eseguire */ short int sem_flg; /* flags */ ; pag 6

7 Il campo sem_op determina l'operazione da eseguire (wait o signal). sem_op = +1 => signal In questo caso il valore di sem_op viene aggiunto al valore corrente di semval liberando la risorsa precedentemente bloccata e viene mandato in esecuzione il primo dei processi in coda. sem_op = -1 => wait Se il valore del semaforo è 0 (ROSSO) il processo cade in uno stato di WAIT finché non verrà fatta una SIGNAL oppure finchè il semaforo non verrà rimosso dalla memoria, ne qual caso la primitiva termina restituendo -1 e settando dentro errno il codice di errore 43 (Semaforo Rimosso) Il campo sem_flg consente di specificare alcuni flags il più importante dei quali è SEM_UNDO il quale fa sì che il sistema mantenga una struttura in cui vengono registrate tutte le operazioni di ogni processo sul semaforo. In questo modo, nel caso in cui il processo dovesse terminare anticipatamente senza il rilascio del semaforo, il sistema provvederà lui ad annullare eventuali azioni pendenti sul semaforo. Esempio di codice int wait(int mutexid) { struct sembuf sem_lock={ 0, -1, /* uso della risorsa */ SEM_UNDO; return semop(mutexid, &sem_lock, 1); int signal(int mutexid) { struct sembuf sem_ulock={ 0, 1, /* rilascio della risorsa */SEM_UNDO; return semop(mutexid, &sem_ulock, 1); Esempio di main #define SEMKEY 1001 int main() { Mutex * mutex = new Mutex(); int valiniziale = 1; int mid = mutex->create(semkey, valiniziale); if (mid < 0 ) { printf("errore: %d - %s ", errno, strerror(errno)); return -1; int valore = mutex->read(mid); printf("valore iniziale Semaforo (VERDE) : %d", valore); mutex->wait(mid); valore = mutex->read(mid); printf("\nvalore Semaforo dopo la Wait (ROSSO) : %d", valore); // Sezione Critica // Fine Sezione Critica mutex->signal(mid); valore = mutex->read(mid); printf("\nvalore Semaforo dopo la Signal (VERDE) : %d", valore); // Dealloca il Semaforo mutex->remove(mid); delete(mutex); pag 7

8 Utilizzo della SHARED MEMORY in Ansi C ANSI C fornisce quattro primitive fondamentali (system call) per l utilizzo della shared memory, contenute nella libreria <sys/shm.h>. Occorre però utilizzare anche le librerie base <sys/types.h> e <sys/ipc.h> Allocazione di un segmento di memoria condivisa int shmget(key_t key, int size, int permflags) La funzione shmget è del tutto analoga alla semget utilizzata nel caso dei semafori. Restituisce al solito un identificativo del segmento di memoria creato (handle o gestore del segmento) oppure -1 in caso di errore. key_t è un tipo definito in <sys/types.h> e rappresenta la chiave per identificare univocamente il segmento di memoria all interno del sistema. Secondo i principi del C questa chiave dovrebbe essere generata in modo casuale mediante la funzione key_t ftok(const char *pathname, int proj_id). In realtà, in ambito Linux, il tipo key_t è stato ridefinito come semplice int ed è pertanto possibile assegnare al parametro key un qualunque valore intero compreso tra 0 e int size rappresentala dimensione, in byte, del segmento richiesto, che viene comunque arrotondata al multiplo superiore di PAGE_SIZE. Se si fa riferimento ad un segmento esistente è possibile passare come valore 0. int permflgs è lo stesso di semget. Il valore IPC_CREAT consente la creazione della Shared Memory. Il valore 0 consente di individuare l ID di una Shared Memory esistente a partire dalla chiave key_t Attach e Detach di un segmento di Shared Memory al processo corrente void * shmat(int shmid, const void * shmaddr, int shmflg) shared memory attach Aggancia il segmento di memoria condivisa al processo corrente, in modo che questo possa accedervi direttamente come se la memoria condivisa fosse interna allo spazio di indirizzi del processo. Restituisce l'indirizzo del segmento all interno dell area di memoria del processo e -1 in caso di errore. shmid identificativo della Shared Memory a cui si intende accedere shmaddr specifica a quale indirizzo deve essere associato il segmento; impostando il valore NULL è il sistema a scegliere opportunamente un'area di memoria libera (sicuramente la scelta migliore). shmflg consente di specificare alcuni flag fra cui SHM_RDONLY che permette di agganciare la shm in sola lettura int shmdt(const void *shmaddr) Sgancia dal processo un segmento di memoria condivisa. Restituisce 0 in caso di successo, e -1 in caso di errore. shmaddr è l indirizzo locale della Shared Memory (indirizzo restituito dalla precedente chiamata a shmat con il quale la Shared Memory era stata agganciata). Operazioni di controllo sulla Shared Memory int shmctl(int shmid, int cmd, struct shmid_ds *buf) Restituisce 0 in caso di successo e -1 in caso di errore. shmid identificativo della Shared Memory a cui si intende accedere cmd specifica il comando da eseguire. I valori più significativi sono: IPC_RMID che marca il segmento di shm per la rimozione; questo verrà cancellato effettivamente solo quando l'ultimo processo ad esso agganciato si sarà staccato SHM_LOCK Abilita il memory locking sul segmento di memoria condivisa. SHM_UNLOCK Disabilita il memory locking sul segmento di memoria condivisa. buf viene utilizato soltanto per particolari valori di cmd e normalmente si imposta a NULL. pag 8

9 Esempio di classe per la gestione di una Shared Memory void * create(int semkey, int shm_size) { void * mptr; int mid; mid = shmget(shkey, shm_size, IPC_CREAT IPC_EXCL 0666); if (mid == -1) return NULL; mptr = shmat(mid, NULL, 0); /* map it into memory */ memset((void *)mptr, 0, shm_size); /* fill the segment */ return mptr; // Ricerca l identificativo della shm a partire dalla chiave key_t // e mappa la shm all interno del processo corrente // Restituisce il puntatore locale alla shm oppure NULL in caso di errore void * find(int shkey) { void * mptr; int mid; mid = shmget(shkey, 0, 0); if (mid == -1) return NULL; mptr = shmat(mid, NULL, 0); /* map it into memory */ return mptr; // Sgancia la shm dal processo corrente // Restituisce 0 in caso di successo e -1 in caso di errore int detach(void * mptr) { return (shmdt(mptr) // Rimuove la shm dalla memoria // Restituisce 0 in caso di successo e -1 in caso di errore int remove(int shkey) { int mid; mid = shmget(shkey, 0, 0); /* find shared memory ID */ if (mid == -1) { ; if (errno == EIDRM) return 0; /*EIDRM = Error Identifier ReMoved */ else return -1; /*shm già marcata per la cancellazione*/ if (shmctl(mid, IPC_RMID, NULL) < 0) { if (errno == EIDRM) return 0; else return -1; return 0; Note: Un segmento di memoria condivisa agganciato ad un processo viene ereditato da un figlio attraverso una fork, dato che quest'ultimo riceve una copia dello spazio degli indirizzi del padre. Invece, dato che attraverso una exec viene eseguito un diverso programma con uno spazio di indirizzi completamente diverso, tutti i segmenti agganciati al processo originario vengono automaticamente sganciati. Lo stesso avviene all'uscita del processo attraverso una exit pag 9

10 Utilizzo dei THREAD nello standard POSIX Lo standard ANSI C non prevede l utilizzo dei Thread. In ambiente Unix / Linux l insieme delle librerie ANSI C standard è stata ampliata con un nuovo vasto insieme di funzioni producendo un nuovo standard denominato POSIX prodotto da IEEE dove l acronimo POSIX (proposto da Richard Stallman) significa Portable Operating System Interface, con una X finale che denuncia la sua stretta relazione con i sistemi Unix. In particolare lo standard POSIX definisce una nuova libreria <pthread.h> contenente delle nuove funzioni per la gestione dei thread. Un thread non è altro che una funzione C che viene eseguita in maniera concorrente ad altre funzioni nell'ambito di uno stesso processo. Tutti i thread che fanno parte di uno stesso processo ne condividono lo spazio di indirizzamento. Le variabili che vengono dichiarate localmente all'interno della funzione che implementa il codice di ciascun thread sono private per quello specifico thread, e pertanto non accessibili da parte degli altri thread del processo: la memoria condivisa sarà pertanto rappresentata dalle variabili globali del processo. Gli identificativi dei thread sono gestiti mediante il tipo pthread_t, che è la ridefinizione di un Unsigned long int.. Abilitazione dei thread int pthread_setconcurrency (int nthread); Comunica al sistema il numero di thread che si intende creare (che tecnicamente si chiama concurrency level); Restituisce 0 in caso di successo, qualsiasi cosa diversa da 0 in caso di insuccesso. nthread rappresenta il numero di thread da creare Creazione di un nuovo thread int pthread_create (pthread_t * tid, const pthread_attr *attr, void *(*foo)(void*), void *arg); Restituisce 0 in caso di successo, qualsiasi cosa diversa da 0 in caso di insuccesso. tid è l'indirizzo dell'oggetto pthread_t destinato a contenere l'id che il sistema assegna al thread attr sono gli attributi che l'utente vuole assegnare al thread (se vale NULL vengono usati quelli di default), foo è il nome della funzione C che verrà eseguita all interno del nuovo thread arg è il puntatore ai parametri da passare alla funzione foo.deve assolutamente essere un void * Attesa per il completamento del thread int pthread_join (pthread_t tid, void ** rispt); Sospende il thread principale (genitore) in attesa che il thread identificato da tid giunga al termine. rispt rappresenta l indirizzo del puntatore al valore restituito dalla funzione foo eseguita nel thread Ritorna 0 in caso di successo, diverso da 0 altrimenti. Non è prevista invece, nello standard POSIX, una funzione di attesa di un thread generico. Altre funzioni int pthread_kill (pthread_t tid, int signo); Invia un segnale di terminazione al thread specificato dal 1 par Ritorna 0 in caso di successo, diverso da 0 altrimenti. signo è l'identificatore del segnale che si vuole inviare al thread (normalmente SIGKILL definito in "signal.h"). int pthread_self ( ); restituisce il tid del thread corrente. pag 10

11 Esempio di creazione di cinque thread identici: #define N_THREAD 5 #include <pthread.h> #include "lib.h" void * threadelabora (void * pt){ //*********LETTURA DEI PARAMETRI********* int* argpt=(int*)pt; int arg; arg=argpt[0]; //*********ELABORAZIONE************* int tid=pthread_self(); printf("sono il thread %d, Il mio TID è %u\n",arg,tid); srand(tid); // non serve in quanto rnd è nello stesso spazio di memoria attesa(6,16); printf("sono il thread %d e sto per terminare\n", arg); arg *= 2; //********* RESTITUZIONE DEL RISULTATO ************* int* rispt=(int*)malloc(sizeof(int)); //!!!!!!!!!! *rispt=arg; return (void *) rispt; int main() { int i=1; pthread_t tid[n_thread]; int nok; //*********CICLO DI CREAZIONE DEI THREAD*********** for (i=1;i<=n_thread; i++){ nok=pthread_create(&tid[i-1],null,threadelabora,(void*)&i); if (nok) { for (int j=0; j<i; j++) pthread_kill(tid[j], SIGKILL); esci("errore creazione thread"); //tra la creazione di un thread è l'altro occorre un timeout usleep(200000); //**********CICLO DI ATTESA DEI THREAD************* printf("sono il Padre. Aspetto la terminazione dei thread\n"); int * ris_pt; for (i=1;i<=n_thread; i++){ nok=pthread_join(tid[i-1],(void**)&ris_pt); if(nok) errore("errore chiusura Thread"); printf("il Thread %u è terminato con ris=%d\n",tid[i-1],*ris_pt); return 0; Per compilare un programma multithread occorre specificare il flag l pthread sulla linea di comando. gcc ese13.c l pthread -o nomeeseguibile. Eseguendo la compilazione dall interno di Eclipse impostare: menù Project / Properties / C++ Build / Settings / GCC C++ Linker / Libraries / Add / pthread pag 11

INTERPROCESS COMMUNICATION 27

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

Dettagli

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue 0 mod 3

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue 0 mod 3 Marzo-Giugno 2008 Matricole congrue 0 mod 3 IPC: Memoria condivisa e Semafori Memoria Condivisa Permette a due o più processi di condividere una zona di memoria È l IPC più veloce perché in questo caso

Dettagli

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 Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2018-2019 Pietro Frasca Lezione 5 Martedì 16-10-2018 Operazioni sui processi Nella maggior parte dei

Dettagli

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi SISTEMI OPERATIVI Processi in Linux 2 Creazione di processi concorrenti» La creazione di un processo figlio consente di far eseguire alcune funzionalità del programma in modo concorrente» Opzione 1 il

Dettagli

System call per la gestione di processi

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:

Dettagli

System call per la gestione di processi

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:

Dettagli

il tipo di parallelismo dipende dal grado di cooperazione

il tipo di parallelismo dipende dal grado di cooperazione Thread Settembre 2009 programma e parallelismo il tipo di parallelismo dipende dal grado di cooperazione (scambio d informazione) necessario tra attività svolte in parallelo processo macchina virtuale

Dettagli

System Calls per la Gestione dei Processi

System Calls per la Gestione dei Processi System Calls per la Gestione dei Processi Domenico Cotroneo Dipartimento di Informatica e Sistemistica Università degli Studi di Napoli Federico II Roadmap Process Context Identificativi getpid() getppid()

Dettagli

ACSO Programmazione di Sistema e Concorrente

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à

Dettagli

Esame Laboratorio di Sistemi Operativi Cognome Nome Mat.

Esame Laboratorio di Sistemi Operativi Cognome Nome Mat. Il compito è costituito da domande chiuse, domande aperte ed esercizi. Non è consentito l uso di libri, manuali, appunti., etc. Tempo massimo 2 ore. Domande chiuse: ogni domanda corrisponde ad un punteggio

Dettagli

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 Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 6 Martedì 24-10-2017 1 Sostituzione del codice Tipicamente, dopo una

Dettagli

LABORATORIO DI SISTEMI OPERATIVI

LABORATORIO DI SISTEMI OPERATIVI LABORATORIO DI SISTEMI OPERATIVI Corso di Laurea Triennale in Ingegneria Informatica A.A. 2018/2019 Guglielmo Cola Email: g.cola@iet.unipi.it Web: iet.unipi.it/g.cola Thread POSIX nel sistema Linux (parte

Dettagli

Processi parte IV. Processi parte IV

Processi parte IV. Processi parte IV Processi parte IV Processi parte IV Grafi di precedenza Sincronizzazione dei processi Unix mediante: fork-join cobegin-coend semafori Grafi di precedenza Un grafo di precedenza è un grafo diretto aciclico

Dettagli

Controllo dei Processi 1

Controllo dei Processi 1 Controllo dei Processi 1 I processi Nei sistemi Unix/Linux ogni processo ne può generare altri. Il processo che li genera è detto processo padre (parent process), mentre i processi generati sono detti

Dettagli

Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria Elettronica. SISTEMI OPERATIVI A.A. 2004/2005 Docente: Giorgio Giacinto

Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria Elettronica. SISTEMI OPERATIVI A.A. 2004/2005 Docente: Giorgio Giacinto Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria Elettronica SISTEMI OPERATIVI A.A. 2004/2005 Docente: Giorgio Giacinto fork() & exec() Roberto Perdisci A.A. 2004/2005 1 Dettagli

Dettagli

I Processi nel Sistema Operativo Unix. Gerarchie di processi Unix. Stati di un processo Unix. Stati di un processo Unix.

I Processi nel Sistema Operativo Unix. Gerarchie di processi Unix. Stati di un processo Unix. Stati di un processo Unix. I Processi nel Sistema Operativo Unix Processi Unix Unix è un sistema operativo multiprogrammato a divisione di tempo: l unità di computazione è il processo. Caratteristiche del processo Unix: processo

Dettagli

Corso di Programmazione Concorrente. Memoria Condivisa. Valter Crescenzi

Corso di Programmazione Concorrente. Memoria Condivisa. Valter Crescenzi Corso di Programmazione Concorrente Memoria Condivisa Valter Crescenzi http://crescenzi.inf.uniroma3.it Condivisione di Memoria tra Processi I processi possiedono un spazio di memoria privato non accessibile

Dettagli

Laboratorio di Sistemi Operativi

Laboratorio di Sistemi Operativi primavera 2009 System V IPC code di messaggi System V IPC I tre tipi di IPC di System V sono: Code di Messaggi Semafori Memoria Condivisa Identificatori Ogni struttura IPC è individuata tramite un identificatore

Dettagli

Sistemi Operativi. Marzo-Giugno 2011 matricole congrue 0 mod 3. Controllo dei processi - I

Sistemi Operativi. Marzo-Giugno 2011 matricole congrue 0 mod 3. Controllo dei processi - I Marzo-Giugno 2011 matricole congrue 0 mod 3 Controllo dei processi - I Controllo dei processi Creazione di nuovi processi Esecuzione di programmi Processo di terminazione Altro 2 1 Identificatori di processi

Dettagli

LABORATORIO DI SISTEMI OPERATIVI

LABORATORIO DI SISTEMI OPERATIVI LABORATORIO DI SISTEMI OPERATIVI Corso di Laurea Triennale in Ingegneria Informatica A.A. 2018/2019 Guglielmo Cola Email: g.cola@iet.unipi.it Web: iet.unipi.it/g.cola Processi in Unix/Linux caratteristiche

Dettagli

CREAZIONE PROCESSI IN UNIX 20

CREAZIONE PROCESSI IN UNIX 20 CREAZIONE PROCESSI IN UNIX 20 STRUTTURE DATI PER PROCESSI Un processo puo' essere in escuzione in 2 modi: kernel e utente. Un processo ha almeno 3 regioni: codice, dati e stack Lo stack è allocato dinamicamente.

Dettagli

Laboratorio di Sistemi Operativi

Laboratorio di Sistemi Operativi primavera 2009 System V IPC sono differenti dalle altre forme di IPC sono contatori usati per controllare l accesso a risorse condivise da processi diversi il protocollo per accedere alla risorsa è il

Dettagli

La creazione di un nuovo processo in UNIX

La creazione di un nuovo processo in UNIX La creazione di un nuovo processo in UNIX #include int fork(void); Viene creato un nuovo processo (figlio) identico (stesso codice, area dati copiata) al processo (padre) che ha invocato la

Dettagli

Segnali. I segnali in Unix sono un meccanismo semplice per inviare degli interrupt software ai processi.

Segnali. I segnali in Unix sono un meccanismo semplice per inviare degli interrupt software ai processi. Segnali I segnali in Unix sono un meccanismo semplice per inviare degli interrupt software ai processi. Solitamente sono utilizzati per gestire errori e condizioni anomale, piuttosto che per trasmettere

Dettagli

Corso di Programmazione Concorrente. Semafori. Valter Crescenzi

Corso di Programmazione Concorrente. Semafori. Valter Crescenzi Corso di Programmazione Concorrente Semafori Valter Crescenzi http://crescenzi.inf.uniroma3.it Semafori vs Semafori di Dijkstra Rispetto alla versione presentata astrattamente, le chiamate di sistema Linux/UNIX

Dettagli

Processi Concetti di base. Esecuzione parallela e sequenziale Il concetto di processo Gestione dei processi

Processi Concetti di base. Esecuzione parallela e sequenziale Il concetto di processo Gestione dei processi Processi Concetti di base Esecuzione parallela e sequenziale Il concetto di processo Gestione dei processi Esecuzione sequenziale I sistemi di calcolo più semplici consentono unicamente l'esecuzione sequenziale

Dettagli

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

Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ; La creazione di un nuovo processo in UNIX int fork(void); Viene creato un nuovo processo (figlio) identico (stesso codice, area dati copiata) al processo (padre) che ha invocato la fork Solo il valore

Dettagli

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

Dettagli

LINUX: struttura generale

LINUX: struttura generale LINUX: struttura generale User Interface The layers of a UNIX system. 1 Processi in LINUX Ogni processo nasce con un solo thread Un processo gira in modalità utente; quando effettua una system call passa

Dettagli

Corso di Laboratorio di Sistemi Operativi

Corso di Laboratorio di Sistemi Operativi Corso di Laboratorio di Sistemi Operativi Lezione 6 Alessandro Dal Palù email: alessandro.dalpalu@unipr.it web: www.unipr.it/~dalpalu Interazione tra Processi I processi concorrenti possono interagire

Dettagli

Thread Standard IEEE POSIX c

Thread Standard IEEE POSIX c Thread Standard IEEE POSIX 1003.1c Prof.ssa Sara Michelangeli Con il termine multithraeding si indica un sistema che consente la attivazione di più flussi di esecuzione all'interno dei processi cosiddetti

Dettagli

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

Dettagli

Corso di Programmazione Concorrente Processi. Valter Crescenzi

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

Dettagli

Laboratorio di Sistemi Operativi

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue 0 mod 3 code di messaggi XSI IPC Code di Messaggi Semafori Memoria Condivisa 2 1 Identificatori Ogni struttura IPC è individuata tramite un identificatore ( intero>0

Dettagli

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4 UNIVERSITÀ DEGLI STUDI DI PARMA Facoltà di Ingegneria Corso di Laurea in Ingegneria Elettronica e delle Telecomunicazioni a.a. 2005-2006 CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4 1 Funzioni per il

Dettagli

Pag. 1. modello di esecuzione parallela

Pag. 1. modello di esecuzione parallela Il Sistema Operativo è un insieme di programmi (moduli software) che svolgono funzioni di servizio nel calcolatore. Costituisce la parte essenziale del cosiddetto software di sistema (o di base) in quanto

Dettagli

Libreria Linux Threads. Threads nel S.O. Linux. Primitive per la gestione dei thread. Portabilità: libreria pthreads (Posix).

Libreria Linux Threads. Threads nel S.O. Linux. Primitive per la gestione dei thread. Portabilità: libreria pthreads (Posix). Threads nel S.O. Linux Il thread è un processo leggero che può condividere uno spazio di indirizzi (o parte di esso) con il padre e gli altri processi della gerarchia cui appartiene. Realizzato a livello

Dettagli

Il sistema operativo LINUX Semafori. Semaforo. Sommario. Sommario. Uso delle pipe. Gestione di semafori tramite pipe. Sistemi operativi Modulo II

Il sistema operativo LINUX Semafori. Semaforo. Sommario. Sommario. Uso delle pipe. Gestione di semafori tramite pipe. Sistemi operativi Modulo II Il sistema operativo LINUX Semafori Semaforo Giorgio Di Natale Stefano Di Carlo Politecnico di Torino Dip. Automatica e Informatica Un semaforo è una variabile

Dettagli

eseguire comandi dati dall'utente, utilizzando una macchina reale, di livello inferiore,

eseguire comandi dati dall'utente, utilizzando una macchina reale, di livello inferiore, La programmazione di sistema Introduzione ai sistemi operativi multiprocesso Primitive per la gestione dei processi http://home.dei.polimi.it/silvano/acso.htm Il sistema ste operativo Il Sistema Operativo

Dettagli

Laboratorio di Sistemi Operativi

Laboratorio di Sistemi Operativi primavera 2009 Controllo dei processi (2) Funzioni wait e waitpid quando un processo termina il kernel manda al padre il segnale SIGCHLD il padre può ignorare il segnale (default) oppure lanciare una funzione

Dettagli

I Processi nel SO UNIX

I Processi nel SO UNIX I Processi nel SO UNIX 1 Processi UNIX UNIX è un sistema operativo multiprogrammato a divisione di tempo: unità di computazione è il processo Caratteristiche del processo UNIX: processo pesante con codice

Dettagli

I Processi nel SO UNIX

I Processi nel SO UNIX I Processi nel SO UNIX 1 Processi UNIX UNIX è un sistema operativo multiprogrammato a divisione di tempo: unità di computazione è il processo Caratteristiche del processo UNIX: processo pesante con codice

Dettagli

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. 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

Dettagli

Richiami sui Concetti Fondamentali dei Processi

Richiami sui Concetti Fondamentali dei Processi Processi Processi 1 Richiami sui Concetti Fondamentali dei Processi Processi 2 Definizione Nell ambito dei sistemi operativi esistono diverse definizioni di processo, ad es. un programma in esecuzione

Dettagli

I Processi nel Sistema Operativo Unix

I Processi nel Sistema Operativo Unix I Processi nel Sistema Operativo Unix Processi Unix Unix è un sistema operativo multiprogrammato a divisione di tempo: l unità di computazione è il processo. Caratteristiche del processo Unix: processo

Dettagli

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3 Marzo-Giugno 2008 matricole congrue 0 mod 3 Controllo dei processi - I Controllo dei processi Creazione di nuovi processi Esecuzione di programmi Processo di terminazione Altro 2 1 Identificatori di processi

Dettagli

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 Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 10 Martedì 7-11-2017 Thread a livello kernel Modello da uno a uno La

Dettagli

Gestione dei processi

Gestione dei processi Gestione dei processi SLEEP(3) sospende il processo per seconds secondi unsigned int sleep(unsigned int seconds); Sospende il thread chiamante fino a quando non sono trascorsi seconds secondi, o fino a

Dettagli

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

Addendum alle chiamate di sistema per la gestione processi. E Mumolo Addendum alle chiamate di sistema per la gestione processi E Mumolo Definiamo un processo proc.c che scrive l'argomento passato in linea: void main(int argc, char *argv[]){ printf("sono il processo %s\n",

Dettagli

LABORATORIO DI SISTEMI OPERATIVI

LABORATORIO DI SISTEMI OPERATIVI LABORATORIO DI SISTEMI OPERATIVI Corso di Laurea Triennale in Ingegneria Informatica A.A. 2018/2019 Guglielmo Cola Email: g.cola@iet.unipi.it Web: iet.unipi.it/g.cola Processi in Unix/Linux (parte II)

Dettagli

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 Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 12 Martedì 14-11-2017 System call per l'uso dei segnali Un processo che

Dettagli

GESTIONE DELLA COMUNICAZIONE LOCALE TRA PROCESSI IN UNIX:

GESTIONE DELLA COMUNICAZIONE LOCALE TRA PROCESSI IN UNIX: GESTIONE DELLA COMUNICAZIONE LOCALE TRA PROCESSI IN UNIX: Il primo meccanismo di comunicazione tra processi locali in ambiente Unix e stato il meccanismo delle pipe. Per processo locale si intende un processo

Dettagli

LinuxThreads: I thread nel sistema operativo LINUX: Linuxthreads. LinuxThreads. LinuxThreads

LinuxThreads: I thread nel sistema operativo LINUX: Linuxthreads. LinuxThreads. LinuxThreads I thread nel sistema operativo LINUX: Linuxthreads : Caratteristiche Processi leggeri realizzati a livello kernel System call clone: int clone(int (*fn) (void *arg), void *child_stack, int flags, void

Dettagli

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI mumolo@units.it

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI mumolo@units.it Chiamate di sistema per la Gestione dei processi in POSIX E.Mumolo, DEEI mumolo@units.it Process id ed altri identificatori pid_t getpid(); // Process id del processo chiamante pid_t getppid(); // Process

Dettagli

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni Anno Accademico 2011/2012 Segnali: Interrupt software per la gestione di eventi asincroni Concetto di segnale Un segnale è un interrupt software Un segnale può essere generato da un processo utente o dal

Dettagli

Controllo dei Processi. M. R. Guarracino - Primitive di Controllo dei Processi

Controllo dei Processi. M. R. Guarracino - Primitive di Controllo dei Processi Controllo dei Processi Introduzione Come possiamo creare nuovi processi? Come possiamo eseguire un programma? Come possiamo terminare un processo? Introduzione Unix fornisce le primitive per la creazione

Dettagli

INTER-PROCESS COMMUNICATION (IPC) SYSTEM (Bach: the Design of the Unix Operating System ; manuale on-line)

INTER-PROCESS COMMUNICATION (IPC) SYSTEM (Bach: the Design of the Unix Operating System ; manuale on-line) INTER-PROCESS COMMUNICATION (IPC) SYSTEM (Bach: the Design of the Unix Operating System ; manuale on-line) - Memoria Condivisa (Shared Memory) - Semafori - Code di Messaggi (Sulle sito del corso trovate

Dettagli

INTER-PROCESS COMMUNICATION (IPC) SYSTEM (Bach: the Design of the Unix Operating System ; manuale on-line) IPC. Memoria Condivisa

INTER-PROCESS COMMUNICATION (IPC) SYSTEM (Bach: the Design of the Unix Operating System ; manuale on-line) IPC. Memoria Condivisa INTER-PROCESS COMMUNICATION (IPC) SYSTEM (Bach: the Design of the Unix Operating System ; manuale on-line) - Memoria Condivisa (Shared Memory) - Semafori - Code di Messaggi (Sulle sito del corso trovate

Dettagli

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

 &$ ()  ) ) $ ' () *)  ) $ %&! "# $ #include int main(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) printf("argv[%d]: %s\n", i, argv[i] ); 1 2 " &$ cc cc program.c a.out pippo pluto topolino argv[0]: a.out

Dettagli

System Call EXEC EXEC P P. fork exec(new_prog) fork. sono_il_padre = fork(); if (!sono_il_padre) {

System Call EXEC EXEC P P. fork exec(new_prog) fork. sono_il_padre = fork(); if (!sono_il_padre) { System Call EXEC EXEC L effetto delle system call della famiglia exec consiste nel mandare in esecuzione: (1) un programma contenuto in un file eseguibile oppure un (2) interprete di programmi P fork P

Dettagli

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3 Marzo-Giugno 2008 matricole congrue 0 mod 3 Funzioni wait e waitpid quando un processo termina il kernel manda al padre il segnale SIGCHLD Controllo dei processi (2) il padre può ignorare il segnale (default)

Dettagli

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill!

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill! Terza Esercitazione Gestione di segnali in Unix Primitive signal e kill! Primitive fondamentali signal kill pause alarm sleep Imposta la reazione del processo all eventuale ricezione di un segnale (può

Dettagli

Seconda Esercitazione. Gestione di processi in Unix Primitive Fork, Wait, Exec

Seconda Esercitazione. Gestione di processi in Unix Primitive Fork, Wait, Exec Seconda Esercitazione Gestione di processi in Unix Primitive Fork, Wait, Exec System call fondamentali fork exit wait exec Generazione di un processo figlio, che condivide il codice con il padre e possiede

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 19 febbraio 2013 Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine consegnare

Dettagli

Sistemi Operativi Teledidattico

Sistemi Operativi Teledidattico Sistemi Operativi Teledidattico Anno 2002 3a esercitazione 5/10/2002 Paolo Torroni processi fork (creazione di un figlio) exec (sostituzione di codice del programma in esecuzione) wait (attesa della terminazione

Dettagli

Laboratorio in C su Processi e POSIX IPC (Inter Process Communications) Dalla nona lezione di laboratorio in avanti

Laboratorio in C su Processi e POSIX IPC (Inter Process Communications) Dalla nona lezione di laboratorio in avanti Laboratorio in C su Processi e POSIX IPC (Inter Process Communications) Dalla nona lezione di laboratorio in avanti NOTA BENE: E INSISTO!!!!! Usare il comando man nomefunzionedilibreria per ottenere informazioni

Dettagli

Quinta Esercitazione. Principali primitive di accesso ai File

Quinta Esercitazione. Principali primitive di accesso ai File Esempio: processi padre e figlio condividono di file aperti PRIMA della creazione Quinta Esercitazione Gestione File-System Segnali processo padre fork() Sistema tabella dei file attivi i-node Eugenio

Dettagli

Signalling (IPC) Signalling (segnalazione)

Signalling (IPC) Signalling (segnalazione) Signalling (IPC) Signalling (segnalazione) è un particolare tipo di Inter-Process Communications che permettere di sincronizzare dei processi spedendo e ricevendo dei messaggi minimali che informano dell'accadimento

Dettagli

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008 1 Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia mattia.monga@unimi.it 7 marzo 2008 1 c 2008 M. Monga. Creative Commons Attribuzione-Condividi allo stesso modo 2.5 Italia

Dettagli

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia 1 Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia mattia.monga@unimi.it 7 marzo 2008 1 c 2008 M. Monga. Creative Commons Attribuzione-Condividi allo stesso modo 2.5 Italia

Dettagli

I Processi nel SO UNIX

I Processi nel SO UNIX I Processi nel SO UNIX Processi UNIX UNIX è un sistema operativo multiprogrammato a divisione di tempo: unità di computazione è il processo Caratteristiche del processo UNIX: processo pesante con codice

Dettagli

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli:

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli: Il comando make Sviluppando programmi complessi, si è spesso portati a suddividere il codice sorgente in diversi file. La fase di compilazione quindi richiede maggior tempo, anche se le modifiche apportate

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 13 febbraio 2017 Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine consegnare

Dettagli

Crea un nuovo processo. Al processo padre ritorna il PID del figlio. Al processo figlio ritorna 0

Crea un nuovo processo. Al processo padre ritorna il PID del figlio. Al processo figlio ritorna 0 Crea un nuovo processo. Al processo padre ritorna il PID del figlio. Al processo figlio ritorna 0 Sequenza di operazioni di fork: * alloca una entry nella tabella dei processi * assegna un unico ID al

Dettagli

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill Terza Esercitazione Gestione di segnali in Unix Primitive signal e kill signal kill pause alarm sleep Primitive fondamentali Imposta la reazione del processo all eventuale ricezione di un segnale (può

Dettagli

Thread. Contiene lucidi tratti da: Marco Faella, Clemente Galdi, Giovanni Schmid (Università di Napoli Federico II),

Thread. Contiene lucidi tratti da: Marco Faella, Clemente Galdi, Giovanni Schmid (Università di Napoli Federico II), Thread Contiene lucidi tratti da: 2006-2007 Marco Faella, Clemente Galdi, Giovanni Schmid (Università di Napoli Federico II), 2005-2007 Thread processi leggeri un processo può avere diversi thread i thread

Dettagli

Corso di Laurea in Ingegneria Informatica. Sistemi Operativi. Esercitazione semafori. Università degli Studi KORE - Enna. Docente: Mario Collotta

Corso di Laurea in Ingegneria Informatica. Sistemi Operativi. Esercitazione semafori. Università degli Studi KORE - Enna. Docente: Mario Collotta Corso di Laurea in Ingegneria Informatica Sistemi Operativi Esercitazione semafori Università degli Studi KORE - Enna Docente: Mario Collotta mario.collotta@unikore.it 1 Esercizio 1 Implementare un programma

Dettagli

Concetto di Processo Scheduling dei Processi Operazioni sui Processi Processi cooperanti Comunicazione tra processi

Concetto di Processo Scheduling dei Processi Operazioni sui Processi Processi cooperanti Comunicazione tra processi Concetto di Processo Scheduling dei Processi Operazioni sui Processi Processi cooperanti Comunicazione tra processi 3.3 Silberschatz, Galvin and Gagne 2005 1 Un SO esegue diversi tipi di programmi Sistema

Dettagli

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 Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2016-17 Pietro Frasca Lezione 21 Martedì 10-01-2017 Sincronizzazione tra thread Per risolvere problemi

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 4 settembre 2015 Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine consegnare

Dettagli

Problema dei Produttori e dei Consumatori

Problema dei Produttori e dei Consumatori Problema dei Produttori e dei Consumatori Appartiene alla categoria di problemi nei quali l esecuzione di un processo dipende dall esecuzione di un altro, per cui è necessaria una comunicazione asincrona

Dettagli

Sistemi Operativi II

Sistemi Operativi II Sistemi Operativi II Massimo Bernaschi Istituto per le Applicazioni del Calcolo Mauro Picone Consiglio Nazionale delle Ricerche Viale del Policlinico, 137-00161 Rome - Italy http://www.iac.cnr.it/ e-mail:

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 14 luglio 2017 Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine consegnare

Dettagli

SISTEMI&OPERATIVI& AA&2013&0&2014& Processi( in(linux( Giorgio&Giacinto&2013& Sistemi&Opera?vi&

SISTEMI&OPERATIVI& AA&2013&0&2014& Processi( in(linux( Giorgio&Giacinto&2013& Sistemi&Opera?vi& SISTEMI&OPERATIVI& AA&2013&0&2014& Processi( in(linux( ( 2& Creazione(di(processi( concorren2(» La&creazione&di&un&processo&figlio&consente&di& far&eseguire&alcune&funzionalità&del&programma& in&modo&concorrente&»

Dettagli

Semafori. Semafori classici con i thread POSIX 2

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

Dettagli

Esercitazione [2] Processi e Thread

Esercitazione [2] Processi e Thread Esercitazione [2] Processi e Thread Leonardo Aniello Daniele Cono D Elia Federico Lombardi Sistemi di Calcolo - Secondo modulo

Dettagli

IPC System V. Code di messaggi

IPC System V. Code di messaggi IPC System V Code di messaggi Panoramica coda di messaggi una lista concatenata di messaggi, FIFO semaforo un contatore condiviso, atomicamente modificabile memoria condivisa uno spazio di memoria accessibile

Dettagli

Gestione dei processi

Gestione dei processi Gestione dei processi Dormire unsigned int sleep(unsigned int); Attende un numero specificato di secondi a meno che non si verifichi un segnale Restituisce 0 se l'attesa è terminata senza interruzioni,

Dettagli

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 Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 9 Giovedì 2-11-2017 Comunicazione con pipe Oltre che con la memoria condivisa

Dettagli

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 Pietro Frasca. Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A. 2017-18 Pietro Frasca Lezione 7 Giovedì 26-10-2017 1 Comunicazione tra processi I processi in esecuzione

Dettagli

Esercitazione [01] Processi e Thread

Esercitazione [01] Processi e Thread Esercitazione [01] Processi e Thread Leonardo Aniello Daniele Cono D Elia Giuseppe Laurenza Federico Lombardi

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 7 settembre 2016 (Traccia A) Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine

Dettagli

Threads: 1. Concetti di base 2. Threads in sistemi operativi attuali (NT/UNIX)

Threads: 1. Concetti di base 2. Threads in sistemi operativi attuali (NT/UNIX) Sistemi Operativi I Corso di Laurea in Ingegneria Informatica Facolta di Ingegneria, Universita La Sapienza Docente: Francesco Quaglia Threads: 1. Concetti di base 2. Threads in sistemi operativi attuali

Dettagli

In generale può essere utile che i due processi eseguano del codice diverso

In generale può essere utile che i due processi eseguano del codice diverso System call FORK P fork() ha l aspetto di una funzione C, in realtà è una system call, una chiamata al sistema operativo fork() P P Il processo P' è una copia di P esegue lo stesso codice e possiede una

Dettagli

Processi. Franco Maria Nardini

Processi. Franco Maria Nardini Processi Franco Maria Nardini La funzione main il kernel gestisce l avvio del vostro codice C (attraverso una funzione exec) routine speciale di start-up che prepara l ambiente di esecuzione per il main

Dettagli

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati) Sistemi Operativi (M. Cesati) Compito scritto del 21 settembre 2017 Nome: Matricola: Corso di laurea: Cognome: Crediti da conseguire: 5 6 9 Scrivere i dati richiesti in stampatello. Al termine consegnare

Dettagli