Sincronizzazione tra processi! in Unix: i segnali!

Documenti analoghi
Sincronizzazione tra processi in Unix: : i segnali. Sistemi Operativi T AA

Sincronizzazione tra processi in Unix: i segnali

Sincronizzazione tra processi in Unix: i segnali

Sincronizzazione tra processi UNIX: i segnali. Sincronizzazione tra processi

Sincronizzazione tra processi. Sincronizzazione tra processi. segnali. Segnali UNIX

Quinta Esercitazione. Principali primitive di accesso ai File

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

LABORATORIO DI SISTEMI OPERATIVI

Laboratorio di sistemi operativi A.A. 2010/2011 Gruppo 2 Gennaro Oliva 18 Segnali

I segnali. First the signals described in the original POSIX standard.

Laboratorio di Sistemi Operativi

POSIX - Gestione dei Segnali. E.Mumolo, DEEI mumolo@units.it

Segnali. Tecnica di comunicazione asincrona tra processi. Si può solo inviare uno tra un insieme fissato di segnali

Programmazione di sistema in Linux: System Call per i Segnali. E. Mumolo

Processi Aspetti avanzati. Terminazione Segnali

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

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

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

Processi. Segnali. Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

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

Esercizio sulla gestione di file in Unix. Sistemi Operativi T AA

Vi sono spesso eventi importanti da notificare ai processi:

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

Processo in esecuzione

Processo in esecuzione

Esempi. Sincronizzazione tra processi: I Segnali. I segnali sono interrupt software, che segnalano il verificarsi di eventi asincroni:

System call per la gestione di processi

System call per la gestione di processi

Segnali. #include <signal.h> Segnali

Processi interagenti. Processi interagenti. Interazione fra processi: meccanismi di sincronizzazione e comunicazione. Processi interagenti

Interazione fra processi: meccanismi di sincronizzazione e comunicazione

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

POSIX Systems Programming. geek evening 0x0d. ambienti POSIX. By lord_dex ZEI e Salug! presentano:

Segnali. Un segnale e' un interrupt software. La terminologia corretta e' exception mentre interrupt e' usata solo per gli interrupt hardware

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

Processi - II. Franco Maria Nardini

Processi - II. Franco Maria Nardini

Eventi asincroni. Sistemi Operativi II - Corso di laurea in Ingegneria Informatica. Sirio Scipioni

Sistemi Operativi T. Esercizi

Le System Call di Unix/Linux. 11 Febbraio 2005

Il sistema operativo LINUX Indice

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

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

Modulo 7 System call relative ai segnali

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

Esercizio sulla gestione di file in Unix

Avvio. La funzione main puo' avere due argomenti argc ed argv, ma in realta' oltre a argc ed argv c'e' qualche cosa di piu'.

Esercizio sulla gestione di processi in Unix!

Processi in Unix. Capitolo 8 -- Stevens

System Calls per la Gestione dei Processi

I Processi nel SO UNIX

La creazione di un nuovo processo in UNIX

I Processi nel SO UNIX

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

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

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

Segnali. Sono interruzioni software

LABORATORIO DI SISTEMI OPERATIVI

I Processi nel Sistema Operativo Unix

Programmazione di Sistema 4

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 5

LINUX: struttura generale

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

Sistemi Operativi (M. Cesati)

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

I Processi nel SO UNIX

Corso di Laboratorio di Sistemi Operativi A.A

Signalling (IPC) Signalling (segnalazione)

/* I1 seguente programma mostra come lo Standard Input ha descrittore O e lo

Segnali. Sono interruzioni software

I segnali possono essere pensati come degli interrupts software ;

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

CREAZIONE DI UN FILE

Richiami sui Concetti Fondamentali dei Processi

Sistemi Operativi Teledidattico

Process management 1

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 5

Laboratorio di Sistemi Operativi

Program m azione di Sistem a 4

Sistemi Operativi. Lezione 3 Processi e Thread

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

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

La Comunicazione tra Processi in Unix

5. I device driver. Device driver - gestori delle periferiche. Struttura interna del sistema operativo Linux. Tipi di periferiche. Tipi di periferiche

Gestione dei processi

Pag. 1. modello di esecuzione parallela

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

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

il tipo di parallelismo dipende dal grado di cooperazione

Modulo 5: Programmazione di sistema Parte E: Segnali e pipe

Sistemi Operativi (M. Cesati)

Sistemi operativi. Corso di Laurea Triennale in Ingegneria Informatica. Lezione 8 Semaphore.h Segnali Shell e processi

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

Introduzione alla programmazione multiprocesso e multithread in ambiente Unix attraverso algoritmi in C

GESTIONE DELLE PERIFERICHE D INGRESSO/USCITA ARGOMENTI

Sistemi Operativi. Esercitazione 8. Corso di Laurea Triennale in Ingegneria Informatica.

Struttura interna del sistema operativo Linux

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

Transcript:

Sincronizzazione tra processi! in Unix: i segnali! 1

Sincronizzazione tra processi La sincronizzazione permette di imporre vincoli sull'ordine di esecuzione delle operazioni dei processi interagenti. Unix adotta il modello ad ambiente locale: la sincronizzazione può realizzarsi mediante i segnali Segnale: è un interruzione software, che notifica un evento asincrono al processo che la riceve. Ad esempio, segnali: generati da terminale (es. CTRL+C) generati dal kernel in seguito ad eccezioni HW (violazione dei limiti di memoria, divisioni per 0, etc.) generati dal kernel in seguito a condizioni SW (time-out, scrittura su pipe chiusa, etc.) generati da altri processi 2

Segnali Unix Un segnale può essere inviato: dal kernel a un processo da un processo utente ad altri processi utente (Es: comando kill) Quando un processo riceve un segnale, può comportarsi in tre modi diversi: 1. gestire il segnale con una funzione handler definita dal programmatore 2. eseguire un azione predefinita dal S.O. (azione di default) 3. ignorare il segnale (nessuna reazione) Nei primi due casi, il processo reagisce in modo asincrono al segnale: 1. interruzione dell esecuzione 2. esecuzione dell azione associata (handler o default) 3. ritorno alla prossima istruzione del codice del processo interrotto 3

Segnali Unix Per ogni versione di Unix esistono vari tipi di segnale (in Linux, 32 segnali), ognuno identificato da un intero. Ogni segnale, è associato a un particolare evento e prevede una specifica azione di default. È possibile riferire i segnali con identificatori simbolici (SIGxxx): SIGKILL, SIGSTOP, SIGUSR1, etc. L associazione tra nome simbolico e intero corrispondente (che dipende dalla versione di Unix) è specificata nell header file <signal.h>. 4

Segnali Unix (linux): signal.h #define SIGHUP 1 /* Hangup (POSIX). Action: exit */ #define SIGINT 2 /* Interrupt (ANSI). Action: exit */ #define SIGQUIT 3 /* Quit (POSIX). Action: exit, core dump*/ #define SIGILL 4 /* Illegal instr.(ansi).action: exit,core dump */... #define SIGKILL 9 /* Kill, unblockable (POSIX). Action: exit*/ #define SIGUSR1 10 /* User-defined signal 1 (POSIX). Action: exit*/ #define SIGSEGV 11 /* Segm. violation (ANSI). Act: exit,core dump */ #define SIGUSR2 12 /* User-defined signal 2 (POSIX).Act: exit */ #define SIGPIPE 13 /* Broken pipe (POSIX).Act: exit */ #define SIGALRM 14 /* Alarm clock (POSIX). Act: exit */ #define SIGTERM 15 /* Termination (ANSI). Act:exit*/... #define SIGCHLD 17 /* Child status changed (POSIX).Act: ignore */ #define SIGCONT 18 /* Continue (POSIX).Act. ignore */ #define SIGSTOP 19 /* Stop, unblockable (POSIX). Act: stop */... 5

Gestione dei segnali Quando un processo riceve un segnale, può gestirlo in 3 modi diversi: 1. gestire il segnale con una funzione handler definita dal programmatore 2. eseguire un azione predefinita dal S.O. (azione di default) 3. ignorare il segnale NB. Non tutti i segnali possono essere gestiti esplicitamente dai processi: SIGKILL e SIGSTOP non sono nè intercettabili, nè ignorabili.! qualunque processo, alla ricezione di SIGKILL o SIGSTOP esegue sempre l azione di default. 6

System call signal Ogni processo può gestire esplicitamente un segnale utilizzando la system call signal: void (* signal(int sig, void (*func)()))(int); sig è l intero (o il nome simbolico) che individua il segnale da gestire il parametro func è un puntatore a una funzione che indica l azione da associare al segnale; in particolare func può:» puntare alla routine di gestione dell interruzione (handler)» valere SIG_IGN (nel caso di segnale ignorato)» valere SIG_DFL (nel caso di azione di default) ritorna un puntatore a funzione:» al precedente gestore del segnale» SIG_ERR(-1), nel caso di errore 7

signal Ad esempio: #include <signal.h> void gestore(int);... main() {... signal(sigusr1, gestore); /*SIGUSR1 gestito */... signal(sigusr1, SIG_DFL); /*USR1 torna a default */ signal(sigkill, SIG_IGN); /*errore! SIGKILL non è ignorabile */... 8

Routine di gestione del segnale Caratteristiche: (handler): l handler prevede sempre un parametro formale di tipo int che rappresenta il numero del segnale effettivamente ricevuto. l handler non restituisce alcun risultato void handler(int signum) {...... return; 9

Routine di gestione del segnale (handler): Struttura del programma: #include <signal.h> void handler(int signum) { <istruzioni per la gestione del segnale> return; main() {... signal(sigxxx, handler);... 10

Gestione di segnali con handler Non sempre l associazione segnale/handler è durevole: alcune implementazioni di Unix (BSD, SystemV r.3 e seg.), prevedono che l azione rimanga installata anche dopo la ricezione del segnale. in alcune realizzazioni (SystemV, prime versioni), invece, dopo l attivazione dell handler ripristina automaticamente l azione di default. In questi casi, per riagganciare il segnale all handler: main() void f(int s) {.. { signal(sigusr1, f); signal(sigusr1, f);...... 11

Esempio: parametro del gestore /* file segnali1.c */ #include <signal.h> void handler(int); main() { if (signal(sigusr1, handler)==sig_err) perror( prima signal non riuscita\n ); if (signal(sigusr2, handler)==sig_err) perror( seconda signal non riuscita\n ); for (;;); void handler (int signum) { if (signum==sigusr1) printf( ricevuto sigusr1\n ); else if (signum==sigusr2) printf( ricevuto sigusr2\n ); 12

Esempio: esecuzione & comando kill anna@lab3-linux:~/esercizi$ vi segnali1.c anna@lab3-linux:~/esercizi$ cc segnali1.c anna@lab3-linux:~/esercizi$ a.out& [1] 313 anna@lab3-linux:~/esercizi$ kill -SIGUSR1 313 anna@lab3-linux:~/esercizi$ ricevuto sigusr1 anna@lab3-linux:~/esercizi$ kill -SIGUSR2 313 anna@lab3-linux:~/esercizi$ ricevuto sigusr2 anna@lab3-linux:~/esercizi$ kill -9 313 anna@lab3-linux:~/esercizi$ [1]+ Killed a.out anna@lab3-linux:~/esercizi$ 13

Esempio: gestore del SIGCHLD SIGCHLD è il segnale che il kernel invia a un processo padre quando un figlio termina. È possibile svincolare il padre da un attesa esplicita della terminazione del figlio, mediante un apposita funzione handler per la gestione di SIGCHLD: la funzione handler verrà attivata in modo asincrono alla ricezione del segnale handler chiamerà la wait con cui il padre potrà raccogliere ed eventualmente gestire lo stato di terminazione del figlio 14

Esempio: gestore del SIGCHLD #include <signal.h> void handler(int); main() { int PID, i; PID=fork(); if (PID>0) /* padre */ { signal(sigchld,handler); for (i=0; i<10000000; i++); /* attività del padre..*/ exit(0); else /* figlio */ { for (i=0; i<1000; i++); /* attività del figlio..*/ exit(1); void handler (int signum) { int status; wait(&status); printf( stato figlio:%d\n, status>>8); 15

Segnali & fork Le associazioni segnali-azioni vengono registrate nella User Area del processo. Sappiamo che: una fork copia la User Area del padre nella User Area del figlio padre e figlio condividono lo stesso codice quindi il figlio eredita dal padre le informazioni relative alla gestione dei segnali: ignora gli stessi segnali ignorati dal padre gestisce con le stesse funzioni gli stessi segnali gestiti dal padre i segnali a default del figlio sono gli stessi del padre! successive signal del figlio non hanno effetto sulla gestione dei segnali del padre. 16

Segnali & exec Sappiamo che: una exec sostituisce codice e dati del processo che la chiama la User Area viene mantenuta, tranne le informazioni legate al codice del processo (ad esempio, le funzioni di gestione dei segnali, che dopo l exec non sono più visibili!) quindi dopo un exec, un processo: ignora gli stessi segnali ignorati prima di exec i segnali a default rimangono a default ma i segnali che prima erano gestiti, vengono riportati a default 17

/* file segnali2.c */ #include <signal.h> main() { Esempio signal(sigint, SIG_IGN); execl("/bin/sleep","sleep","30", (char *)0); N.B. Il comando: sleep N mette nello stato sleeping il processo per N secondi 18

Esempio: esecuzione anna@lab3-linux:~/esercizi$ cc segnali2.c anna@lab3-linux:~/esercizi$ a.out& [1] 500 anna@lab3-linux:~/esercizi$ kill -SIGINT 500 anna@lab3-linux:~/esercizi$ kill -9 500 anna@lab3-linux:~/esercizi$ [1]+ Killed a.out anna@lab3-linux:~/esercizi$ 19

System call kill I processi possono inviare segnali ad altri processi con la kill: int kill(int pid, int sig); sig è l intero (o il nome simb.) che individua il segnale da gestire il parametro pid specifica il destinatario del segnale:» pid> 0: l intero è il pid dell unico processo destinatario» pid=0: il segnale è spedito a tutti i processi appartenenti al gruppo del mittente» pid <-1: il segnale è spedito a tutti i processi con groupid uguale al valore assoluto di pid» pid== -1: vari comportamenti possibili (Posix non specifica) 20

#include <stdio.h> #include <signal.h> int cont=0; kill: esempio: void handler(int signo) { printf ("Proc. %d: ricevuti n. %d segnali %d\n", getpid(),cont++, signo); main () {int pid; signal(sigusr1, handler); pid = fork(); if (pid == 0) /* figlio */ for (;;); else /* padre */ for(;;) kill(pid, SIGUSR1); 21

Segnali: altre system call sleep: unsigned int sleep(unsigned int N) provoca la sospensione del processo per N secondi (al massimo) se il processo riceve un segnale durante il periodo di sospensione, viene risvegliato prematuramente ritorna:» 0, se la sospensione non è stata interrotta da segnali» se il risveglio è stato causato da un segnale al tempo Ns, sleep restituisce in numero di secondi non utilizzati dell intervallo di sospensione (N-Ns). 22

Esempio /* provasleep.c*/ #include <signal.h> void stampa(int signo) { printf("sono stato risvegliato!!\n"); main() { int k; signal(sigusr1, stampa); k=sleep(1000); printf("valore di k: %d\n", k); exit(0); 23

Esecuzione bash-2.05$ gcc -o pr provasleep.c bash-2.05$ pr& [1] 2839 bash-2.05$ kill -SIGUSR1 2839 bash-2.05$ sono stato risvegliato!! Valore di k: 987 [1]+ Done pr bash-2.05$ 24

Segnali: altre system call alarm: unsigned int alarm(unsigned int N) Imposta un timer che dopo N secondi invierà al processo il segnale SIGALRM; ritorna:» 0, se non vi erano time-out impostati in precedenza» il numero di secondi mancante allo scadere del timeout precedente NB: la alarm non è sospensiva; l azione di default associata a SIGALRM è la terminazione. 25

Segnali: altre system call pause: int pause(void) sospende il processo fino alla ricezione di un qualunque segnale ritorna -1 (errno = EINTR) 26

Esempio Due processi (padre e figlio) si sincronizzano alternativamente mediante il segnale SIGUSR1 (gestito da entrambi con la funzione handler): int ntimes = 0; void handler(int signo) {printf ("Processo %d ricevuto #%d volte il segnale %d\n", getpid(), ++ntimes, signo); padre SIGUSR1 SIGUSR1 figlio 27

main () { int pid, ppid; signal(sigusr1, handler); if ((pid = fork()) < 0) /* fork fallita */ exit(1); else if (pid == 0) /* figlio*/ { ppid = getppid(); /* PID del padre */ for (;;) { printf("figlio %d\n", getpid()); sleep(1); kill(ppid, SIGUSR1); pause(); else /* padre */ for(;;) /* ciclo infinito */ { printf("padre %d\n", getpid()); pause(); sleep(1); kill(pid, SIGUSR1); 28

Test: anna$./provasegnali! PADRE 42300! FIGLIO 42301! Processo 42300 ricevuto #1 volte il segnale 30! PADRE 42300! Processo 42301 ricevuto #1 volte il segnale 30! FIGLIO 42301! Processo 42300 ricevuto #2 volte il segnale 30! PADRE 42300! Processo 42301 ricevuto #2 volte il segnale 30! FIGLIO 42301! Processo 42300 ricevuto #3 volte il segnale 30! PADRE 42300! Processo 42301 ricevuto #3 volte il segnale 30! FIGLIO 42301! Processo 42300 ricevuto #4 volte il segnale 30! PADRE 42300! Processo 42301 ricevuto #4 volte il segnale 30! ^C! anna$! 29

Aspetti: il gestore rimane installato? Se no: posso reinstallare all interno dell handler void handler(int s) { signal(sigusr1, handler); printf( Processo %d: segnale %d\n, getpid(), s);... Affidabilità dei segnali Cosa succede se qui arriva un nuovo segnale?" cosa succede se arriva il segnale durante l esecuzione dell handler? innestamento delle routine di gestione perdita del segnale accodamento dei segnali (segnali reliable, BSD 4.2) 30

Interrompibilità di System Calls System Call: possono essere classificate in slow system call: possono richiedere tempi di esecuzione non trascurabili perchè possono causare periodi di attesa (es: lettura da un dispositivo di I/O lento) system call non slow. una slow system call è interrompibile da un segnale; in caso di interruzione:» ritorna -1» errno vale EINTR possibilità di ri-esecuzione della system call:» automatica (BSD 4.3)» non automatica, ma comandata dal processo (in base al valore di errno e al valore restituito) 31