Corso di Programmazione Concorrente Processi. Valter Crescenzi
|
|
|
- Monica Marinelli
- 9 anni fa
- Visualizzazioni
Transcript
1 Corso di Programmazione Concorrente Processi Valter Crescenzi
2 Sommario Processi vs Thread Creazione e terminazione di processi chiamata di sistema fork() chiamata di sistema exit() Implem. della primitiva astratta join(): wait() e waitpid() Processi zombie Chiamata di sistema exec() Varianti di exec() Implem. della primitiva astratta fork() Esempi: exec() + fork()
3 Processi vs Thread + Leggerezza - Processo: unità di condivisione delle risorse (alcune possono essere inizialmente ereditate dal padre) Thread (o lightweight process): idealmente, è un flusso di esecuzione indipendente che condivide tutte le sue risorse, incluso lo spazio di indirizzamento, con altri thread + Indipendenza - + Costo Inizializzazione -
4 Creazione di Nuovi Processi Si utilizza la funzione fork(): include <unistd.h> pid_t fork(void) Restituisce: PID del figlio al padre (-1 se fallisce) 0 al figlio Il valore di ritorno servirà ai due processi per intraprendere azioni diverse Il figlio eredita quasi tutte le caratteristiche (codice, descrittori dei file, segmenti di memoria condivisa ecc. ecc.)
5 fork.c #include <stdio.h> #include <sys/types.h> int main(void) { pid_t pid; pid = fork(); if (pid == -1) { fprintf(stderr, "fork fallita\n"); exit(1); if (pid == 0) { printf( Sono il figlio"); exit(0); if (pid > 0) { printf( Sono il padre di %d\n", pid); exit(0); $ gcc fork.c -o fork $./fork Eseguito solo dal figlio Eseguito solo dal padre
6 fork(): Alcuni Dettagli La funzione fork() può fallire con errore: EAGAIN: mancanza di PID liberi; raggiunto il numero max di processi ENOMEM: impossibilità di allocare la memoria necessaria per mantenere le strutture del processo figlio L area dati del padre non viene immediatamente copiata in quella del figlio ma segue una politica copy-on-write quindi i dati non sono condivisi, sono soltanto inizializzati con i valori ereditati dal padre
7 Esercizi include <unistd.h> pid_t getpid(void) ritorna il PID del chiamante pid_t getppid(void) ritorna il PID del padre del chiamante Esercizio: scrivere un programma in cui un processo genera un altro processo. Il primo stamperà il proprio PID e quello del figlio, l altro stamperà il proprio PID e quello del padre. Esercizio: scrivere un programma che dichiari una variabile locale di tipo intero inizializzata a 0. Di seguito si genera un processo figlio che la incrementa. Si stampi il suo contenuto da entrambi i processi.
8 Terminazione di Processi Si utilizza la funzione exit(): include <unistd.h> void exit(int code) riceve un intero che risulta utile per il debugging in quanto restituito alla shell chiamante Se un processo termina prima dei suoi figli, questi vengono adottati dal primo processo init (PID=1) Un ulteriore metodo per far terminare un processo è tramite un segnale di SIGKILL
9 Sospensione dei Processi La funzione sleep() sospende il processo chiamante fino ad un max di s secondi unsigned int sleep(unsigned int s) La funzione wait() attende che un processo figlio termini e quindi restituisce il suo PID #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status)
10 wait() e sleep() #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> int main(int argc, char *argv[]) { pid_t pid; if ((pid = fork()) == 0) { /* figlio */ printf( dormo \n"); sleep(5); printf( mi sveglio ed esco\n"); else if (pid > 0) { printf( aspetto mio figlio \n"); wait(null); printf( il bimbo si è svegliato");
11 waitpid() (1) La funzione waitpid() sospende il processo chiamante in attesa della terminazione del processo figlio di PID specificato #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options); pid può essere < -1: attende un qls figlio con GID pari a -PID -1: attende un qls figlio esattamente come la wait() 0: attende un qls figlio con GID pari al quello del chiamante > 0: attende il figlio con il PID specificato
12 waitpid() (2) pid_t waitpid(pid_t pid, int *status, int options); options può essere una combinazione di WNOHANG: evita la sospensione anche se nessun figlio è già terminato WUNTRACED status se è stato passato non NULL, la chiamata restituisce alcune informazioni sullo stato del processo figlio che è effettivamente terminato Esistono diverse macro per interrogare agevolmente tale stato man 2 waitpid
13 wait() waitpid() e Processi Zombie Proprio per supportare queste chiamate il kernel evita di deallocare tutte le risorse precedentemente allocate per un processo ora terminato Bisogna eseguire esplicitamente le wait per forzare la deallocazione di tali strutture da parte del kernel Esiste un segnale che permette di automatizzare la chiamata di wait() ogni volta che un processo figlio termina
14 zombie.c #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main () { pid_t child_pid; /* Create a child process. */ child_pid = fork (); if (child_pid > 0) {// This is the parent process. sleep(60); // Sleep for a minute. else { // This is the child process. exit(0); // Exit immediately. return 0;
15 zombie.c: Esempio di esecuzione $ gcc zombie.c -o zombie $./zombie & [1] $ ps -o pid,ppid,command,state PID PPID COMMAND S /bin/bash S /zombie S [zombie] <defu Z ps -o pid,ppid,c R $
16 Nuovo Eseguibile per un Processo Una volta creato un processo, si può rimpiazzare il suo codice con quello di un diverso programma eseguendo la funzione exec() Non viene creato un nuovo processo, ma viene solo installato un nuovo codice da eseguire Vengono mantenuti PID, PPID, ambiente, GID, terminale di controllo e permessi sui file
17 exec() arg0 spesso coincide con file ed è il nome riportato dal comando ps include <unistd.h> int execlp(char *file, Nome dell eseguibile char *arg0, char *arg1, char *argn, Argomenti della chiamata al programma (char *) 0); L ultimo argomento è NULL if (fork() == 0) { execlp("lpr", "lpr", "myfile", (char *) 0); fprintf(stderr, "exec fallita\n"); else { /* padre */ Se fallisce restituisce -1
18 Varianti di exec()
19 exec(): Dettagli sulle Varianti (1) execlp ed execvp usano la variabile d ambiente PATH per la ricerca dell eseguibile Nelle execle ed execve è possibile specificare un ambiente di esecuzione Gli argomenti del programma possono essere specificati separatamente o in un array di stringhe (execv, execvp, execve)
20 exec(): Dettagli sulle Varianti (2) Le varianti che contengono una p nel nome ricercano l eseguibile nel PATH degli eseguibili Le varianti che contengono una v nel nome accettano gli argomenti dell eseguibile come un array di puntatori a stringhe che finisce per NULL Le varianti che contengono una l nel nome accettano gli argomenti dell eseguibile con il meccanismo delle funzioni con numero varabile di argomenti Le varianti che contengono una e nel nome accettano un array di variabili d ambiente come argomento aggiuntivo; anche in questo caso di tratta di un array di puntatore a stringhe che finisce per NULL. La singola stringa deve essere nella forma NAME=value
21 Un Esempio fork()+ exec() #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> int main(int argc, char *argv[]) { pid_t pid; if ((pid = fork()) < 0) { fprintf(stderr,"fork fallita\n"); exit(1); if (pid == 0) { execlp("echo","echo", Ciao dal", figlio",(char *) NULL); fprintf(stderr,"execl fallita\n"); exit(2); printf( il padre prosegue\n"); exit(0);
22 Altro Esempio di fork()+ exec() if ((pid = fork()) == 0) if (execlp("lpr","lpr","myfile", (char *) 0) == -1) fprintf(stderr,"exec fallita\n"); else { /* fai molto altro mentre la stampa è in corso */ /* adesso rimuovi il file */ while (wait(null)!= pid); unlink("myfile"); /* e fai molto altro ancora */
23 Ultimo Esempio di fork()+ exec() (1) include omessi int spawn (char* program, char** arg_list) { pid_t child_pid; child_pid = fork (); // Duplicate this process if (child_pid!= 0) /* This is the parent process. */ return child_pid; else { // Now execute PROGRAM, searching for it in the path. execvp (program, arg_list); // The execvp function returns only for errors fprintf (stderr, "an error occurred in execvp\n"); abort (); int main() {
24 Ultimo Esempio di fork()+ exec() (2) int spawn() { int main () { // The argument list to pass to the "ls" command char* arg_list[] = { "ls", // argv[0], the name of the program. "-l", "/", NULL // The argument list must end with a NULL ; /* Spawn a child process running the "ls" command. Ignore the returned child process id. */ spawn ("ls", arg_list); printf ("done with main program\n"); return 0;
25 Esercizi Esercizio: quanti processi crea questo frammento di codice?... int main () { int i=0; for(int i=0; i<n; i++) { pid_t child_pid; child_pid = fork (); return 0;
26 Esercizi Esercizio: un processo padre crea un numero di processi figli specificato dall utente. Ciascuno di questi effettua una pausa casuale e termina. Il padre termina solo quando tutti i suoi figli sono già terminati. Esercizio: risolvere l esercizio di sopra con due programmi distinti, padre.c e figlio.c. Esercizio: programmare una mini-shell che iterativamente legge una riga di testo ed esegue il suo contenuto in un processo dedicato. La shell termina con il comando stop.
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:
LABORATORIO DI SISTEMI OPERATIVI
LABORATORIO DI SISTEMI OPERATIVI Corso di Laurea Triennale in Ingegneria Informatica A.A. 2018/2019 Guglielmo Cola Email: [email protected] Web: iet.unipi.it/g.cola Processi in Unix/Linux caratteristiche
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,
Programmazione multiprocesso
DTI / ISIN / Titolo principale della presentazione 1 Programmazione multiprocesso Amos Brocco, Ricercatore, DTI / ISIN 20 febbraio 2012 2 Processi Cos'è un processo? Un programma in esecuzione Spazio di
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
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
Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI [email protected]
Chiamate di sistema per la Gestione dei processi in POSIX E.Mumolo, DEEI [email protected] Process id ed altri identificatori pid_t getpid(); // Process id del processo chiamante pid_t getppid(); // Process
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
Processi: Exit, Wait, Exec
Processi: Exit, Wait, Exec Contiene lucidi tratti da: 2005-07 Giuseppe Schmid (Univ. Federico II), 2005-2007 Francesco Pedulla, Massimo Verola (Uniroma2), 2001-2005 Renzo Davoli (Universita di Bologna),
Î Modello ad Ambiente Locale P1 P1. File System P2 P2 P3 P3. Processi in UNIX. Modello di Processo in UNIX
Processi in UNIX Spazio di sistema (residente) Modello di Processo in UNIX 1 Tabella dei processi i PROCESS CODE Tabella dei codici Tabella dei file APERTI OPEN FILE ACTIVE FILE Tabella dei file ATTIVI
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
Programmazione di sistema in Linux: System Call per il controllo processi. E. Mumolo, DIA
Programmazione di sistema in Linux: System Call per il controllo processi E. Mumolo, DIA Struttura generica di Linux Chiamate delle System call (Trap) interfaccia Utente Shell comandi di linea Compilatori
Processi e Sincronizzazione. Laboratorio Software 2008-2009 C. Brandolese M. Grotto
Processi e Sincronizzazione C. Brandolese M. Grotto Sommario 1. Processi Concetti fondamentali Stati in GNU/Linux 2. Creazione Descrizione Creazione con system() Creazione con fork() Effetto di fork()
AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema
AXO Architetture dei Calcolatori e Sistema Operativo programmazione di sistema Il sistema operativo Il Sistema Operativo è un insieme di programmi (moduli software) che svolgono funzioni di servizio nel
Processi UNIX. I Processi nel SO UNIX. Gerarchie di processi UNIX. Modello di processo in UNIX
Processi UNIX I Processi nel SO UNIX UNIX è un sistema operativo multiprogrammato a divisione di tempo: unità di computazione è il processo Caratteristiche del processo UNIX: processo pesante con codice
Sistemi Operativi. Esercitazione 2 Compilazione, Makefile e Processi
Sistemi Operativi Esercitazione 2 Compilazione, Makefile e Processi Percorso Compilazione programmi in c Makefiles Processi definizione gestione creazione Compilazione di programmi in C Compilazione e
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à
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.
Gestione dei processi
Capitolo 1 Gestione dei processi 1.1 Creazione di un processo I principali eventi che possono dare luogo ad un nuovo processo sono: inizializzazione del sistema; esecuzione di una primitiva di sistema
Processi in Unix. Capitolo 8 -- Stevens
Processi in Unix Capitolo 8 -- Stevens Controllo dei processi Creazione di nuovi processi Esecuzione di programmi Processo di terminazione Altro Identificatori di processi Ogni processo ha un identificatore
Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-
Lab. di Sistemi Operativi - Esercitazione n 9- -Thread- 1 Sommario Esercizi su: Comunicazione tra processi: la funzione pipe() Condivisione dati e codice tra due o più processi: concetto di Thread 2 -
Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-
Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix- 1 Sommario Esercizi sulla gestione dei processi Creazione di un nuovo processo: fork Sincronizzazione tra processi: wait 2 -
C: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
Esercitazione [01] Processi e Thread
Esercitazione [01] Processi e Thread Leonardo Aniello Daniele Cono D Elia Giuseppe Laurenza Federico Lombardi
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
Le system call: fork(), wait(), exit()
Le system call: fork(), wait(), exit() Di seguito viene mostrato un programma che fa uso di puntatori a funzione, nel quale si mette in evidenza il loro utilizzo. Programma A1 #include int add(a,b,c)
