Unix: Gestione dei Processi1
C o rs o d i Fond a m e n ti d i I n fo rm a tica 2 C dL Ing e gn e ri a In fo rm a tica Ing . F ra n c o Z a m bon e lli
IL S IS T E M A O PE RA T IV O UN IX : G ES T IO N E D E I P R O C ESS I
Lu c id i R ea li zz a ti i n C o ll a bo ra z ion e c on :
Prof. Letizia LeonardiUniversità di Modena
Prof. Antonio CorradiUniversità di Bologna
Prof. Cesare StefanelliUniversità di Ferrara
Unix: Gestione dei Processi2
M od e ll o d i P ro cess o in UN IX
Ogni processo ha un proprio spazio di indirizzamentocompletamente locale e non condiviso
M ode ll o ad A m b ien te Loca le
Eccezioni:
• il
codice può essere condiviso
• il
file system rappresenta un ambiente condiviso
P 1 P 1
F ile S y st em P 2 P 2
P 3 P 3
Unix: Gestione dei Processi3
S ta ti i n te rn i po ss ib ili d i un p ro cess o UN IX
IDLEstato inizialeREADYpronto per l’esecuzioneRUNNINGin esecuzioneSWAPPEDimmagine copiata su disco
IDLESLEEPING READYRUNNING
SWAPPED TERMINATED
ZOMBIE
SLEEPINGattesa di un evento per proseguireTERMINATEDterminatoZOMBIEterminato ma ancora presente
Unix: Gestione dei Processi4
A tt ri bu ti d i un P ro cess o UN IX
• p
id(process identifier)•
pp
id(parent process identifier)•
pg
id(process group id )
Un processo è lanciato da un utente, informazione di cui sitiene traccia in:•
• real uid (real user identifier) processo. che corrispondono allo uid e gid dell’utente che ha lanciato il real user gid (real user group identifier)
Altre informazioni:•
• environment (stringhe nome=valore)
• current working directory
dimensione massima dei file creabili
• m
aschera dei segnali
• c
ontrolling terminal
• p
riorità processo (nice)
Unix: Gestione dei Processi5
P ri m it ive p e r la G es tion e d e i P ro cess i
C rea z ion e
FORK pid =
f o rk
( );pid_t pid;Un processo ne genera un altro 2 processi concorrentie indipendenti:- il parent (processo padre), quello originario- il child (processo figlio), quello generato.
Processo Padre
...
printf(“prima\n”);
fork();
printf(“dopo\n”);
... Processo Padre
...
printf(“prima\n”);
fork();
printf(“dopo\n”);
...
Processo Padre
...
printf(“prima\n”);
fork();
printf(“dopo\n”);
... Processo Padre
...
printf(“prima\n”);
fork();
printf(“dopo\n”);
... Processo Figlio
...
printf(“prima\n”);
fork();
printf(“dopo\n”);
... Processo Figlio
...
printf(“prima\n”);
fork();
printf(“dopo\n”);
... PC
PCPC Prima fork
Dopo fork
Unix: Gestione dei Processi6
E ff e tt i d e ll a F O RK
1. crea un nuovo processo2. duplica i dati e stack sia parte utente sia parte kernel;3. stesso codice per padre e figlio
fork restituisce l'identificatore del processo creato (PID)al padrein caso di errore la fork restituisce al padre il valore -1 (limite al numero max di processi per utente e per sistema)
Figlio eredita tutti attributi del processo padre, unichedifferenze tra i due processi:•
• fork restituisce zero nel figlio, il pid del figlio nel padre
• il pid del figlio è diverso da quello del padre
il pid del padre è diverso
NB. variabili e puntatori del padre sono copiati e non vengono condivisi da padre e figlio ma duplicati.
Unix: Gestione dei Processi7
E sec u z ion i d iff e re n z ia te de l pad re e de l fig lio
...if(fork()==0) {... /* codice eseguito dal figlio*/ ...} else {.../* codice eseguito dal padre*/ ...}
Dopo la generazione del figlio il padre può deciderese operare contemporaneamente ad essooppurese attendere la sua terminazione (wait)
Unix: Gestione dei Processi8
E sec u z ion e d i un P rog ra mm a (
primitiva EXEC)exec trasforma il processo chiamante caricando unnuovo programma nel suo spazio di memoria
• N
ON si prevede di tornare al programma chiamante.
• exec
non produce nuovi processi ma soloil cambiamento dell'ambiente del processo interessato,sia come codice, sia come dati.
Sono disponibili molte funzioni della famiglia exec:
execl, execle, execlp, execv, execve, execvp
p
la funzione prende un nome di file come argomento elo cerca nei direttori specificati in PATH;l la funzione riceve una lista di argomenti (NULLterminata);vla funzione riceve un vettore argv[];e
la funzione riceve anche un vettore envp[] invece diutlizzare l’environment corrente.
Unix: Gestione dei Processi9
A lc un i ese m p i d i exec
EXE C l ex ec l
(path, arg0, arg1, ..., argn, (char *) 0);char *path, *arg0, *arg1, ..., *argn;/* path è un pathname, assoluto o relativo*//* arg0 è il nome del file, seguono argomenti*/EXE C VE ex ec v e
(path, argv, envp);char *path, *argv[], *envp[];Il nuovo file può essere un file eseguibile o un file di dati perun interprete shell.
Nota: In alcuni sistemi operativi, solo una exec (execve) èuna system call, le altre sono chiamate di libreria cheinvocano la execve.
Unix: Gestione dei Processi10
U tili zz o d e ll a p ri m it iva exec
(differenziare comportamento del padre da quello del figlio)pid = fork();
if (pid == 0){ /* figlio*/printf("Figlio: esecuzione di ls\n");execl("/bin/ls", "ls", "-l", (char *)0);perror("Errore in execl\n");exit(1);}
if (pid > 0){ /* padre*/...printf("Padre ....\n");exit(0);}
if (pid < 0){ /* fork fallita*/perror("Errore in fork\n");exit(1);}
Il figlio esegue immediatamente unaexece passa aeseguire un altro programmasi carica il nuovo codice, i nuovi dati e tutto lo stato delnuovo programma
Si noti che il figlio non ritorna alsuo stato precedente (GO TO)
Unix: Gestione dei Processi11
C a ra tt e ri s tic h e d e l p ro cess o dopo exec
Ci sono alcuni attributi che il processo che esegue l’execmantiene:
• p
id•
pa
rent pid•
• process gid
session id
• r
eal uid•
real user gid
• file mode creation mask•
• current working directory
root directory
• m
aschera dei segnali•
controlling terminal
• fd
:i file descriptor sono conservati MAogni descrittore di file aperto ha un flag close-on-exec,il default è tenerlo aperto (cambiabile con fcntl())
• C
osa succede all’effective uid ?
Unix: Gestione dei Processi12
S in c ron izz a z ion e tr a pad re e fig lio
WAIT pid= wait (&status);int status;
...
if ((pid = fork()) == 0) {.../* codice eseguito dal figlio*/ ...} else {... /* codice eseguito dal padre*/...wait(&status);
In caso di più figli while (rid = wait (&status) != pid);
Operazione di wait
Quando un processo termina, il nucleo notifica laterminazione al processo padre (mandandogli un segnale).
Il padre riceve lo stato di uscita del figlio invocando la wait.
Il processo padre che esegue la wait:•
• si sospende se nessun processo figlio è terminato non
si sospende se almeno un processo figlio èterminato (zombie)
Unix: Gestione dei Processi13 Esempio di uso della WAIT/* il figlio scrive su un file; il padre torna all'inizio e legge */#include <stdio.h>#include <fcntl.h>
int procfile (f1)char *f1; /* file di comunicazione */{int nread, nwrite = 0, atteso, status, fd, pid;char *st1 = " ", st2 [80];
if (fd = open (f1, O_RDWR | O_CREAT, 0644)<0) {perror("open"); exit(1); }
if ((pid = fork()) < 0) {perror("fork"); exit(1);}
if (pid == 0) { /* FIGLIO */scanf ("%s", st1);nwrite = write (fd, st1, strlen(st1));exit (0);}
else { /* PADRE */atteso = wait (&status); /* attesa del figlio */lseek (fd, 0L, 0);nread = read (fd, st2, 80);printf ("Il padre ha letto la stringa %s\n", st2);close (fd);return (0); }}
main (argc, argv) ... { int integi;integi = procfile (file1);exit (integi);}
Unix: Gestione dei Processi14
T e rm in a z ion e d i un p ro cess o
modo volontariomodoforzato
VOLONTARIO- operazione primitiva "exit" o- alla conclusione del programma main;
EX IT
voidex it
(status);int status;• c
hiude tutti i file aperti del processo che termina•
• altre azioni tipo scarico buffer standard I/O library attende il processo che termina (esegue cioè la wait() ) status viene passato al processo padre, se questo
FORZATOa seguito di:- azioni non consentite(come riferimenti a indirizziscorretti o tentativi di eseguire codici di operazioni nondefinite, che generano segnali “sincroni”)- segnali generati dall'utenteda tastiera e ricevuti dalprocesso, oppure- segnali spediti da un altro processo tramite la systemcall kill.
Unix: Gestione dei Processi15
P a re n te la P ro cess i e T e rm in a z ion e
T e rm in a z ion e d e l P a d re
P ad re P ad re
F ig li o F ig li o In it
pid=1In it
pid=1In it er ed it a il F ig lio
ppid figlio =1T e rm in a z ion e d e l F ig li o : P ro cess i Zo m b ie
P ad re P ad re F ig lio F ig lio Z o m b ie Z o m b ie A tt es a d el la w ait d el p ad re
Unix: Gestione dei Processi16
ESE RC IZ IO (esec u z ion e d i c o m a nd i)
#include <stdio.h>
main (argc, argv) {int stato, atteso, pid;char st[80];
for (;;) {if ((pid = fork()) < 0) {perror("fork"); exit(1);}
if (pid == 0) { /* FIGLIO: esegue i comandi */printf("inserire il comando da eseguire:\n");scanf ("%s", st);
execlp(st, (char *)0);perror("errore");exit (0);
} else { /* PADRE */atteso=wait (&stato); /*attesa figlio: sincronizzazione */printf ("eseguire altro comando? (si/no) \n");scanf ("%s", st);if (strcmp(st, "si") exit(0);}}}
Unix: Gestione dei Processi17
G es tion e d e g li e rr o ri
In caso di fallimento, le System Call ritornano -1
In più, UNIX assegna alla variabile globale errno il codice dierrore occorso alla system call
/usr/include/sys/errno.h per le corrispondenze codici dierrori e loro descrizione
(definire extern int errno nel programma)
perror()
routine utilizzata nella gestione degli errori, stampa (sustandard error) una stringa definita dall’utente, seguitadalla descrizione dell’errno avvenuto
Esempio:
perror(“stringa descrittiva”);
può stamparestringa descrittiva: No such file or directory
Unix: Gestione dei Processi18
I g rupp i d i p rocess i
Tutti i processi UNIX sono identificati dal pid eappartengono a un gruppo (identificato da pgid)
L’insieme di processi appartenenti a uno stesso gruppo èdetto anche job
esempio:cesare lia00 ~/ 10>P1 | P2 | P3
P1P1P2P2
P3P3 processgroup (job)
leaderpid=pgid pid pgid
pid pgid≠ ≠
In un gruppo di processi c’è un solo group leader,che ha pid = pgidUso dei gruppi di processi :•
se
gnali mandati a tutti i processi in un gruppo(es. segnali da terminale)•
shell con job control
G rupp i d i p ro ce ss i i n fo re g round (r ice vono inpu t d a ta sti er a e se gn ali , es . il ct rl- C ) e in b ac kg round .
Unix: Gestione dei Processi19
I F il e e la p ri m it iva F O RK
variabili e puntatori del processo padre sono copiati e non vengono condivisi da padre e figlio ma duplicati.
I fd vengono duplicati
I file aperti dal processo padresono aperti anche per il figlio
Attenzione: in questo caso, ogni puntatore a file (I/Opointer) è condiviso tra padre e figlio.
I/O pointer si sposta per entrambi in seguito a letture oscritture eseguite dal padre o dal figlio.