PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1...

45
PROCESS MANAGEMENT: STRUTTURE DATI

Transcript of PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1...

Page 1: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

PROCESS MANAGEMENT: STRUTTURE DATI

Page 2: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Sintesi fin qui

Res

iden

te

Processo 2 Processo n

DaemonDaemon

Processo 1

Non

res

iden

te

Memoria centrale Periferiche

Processi utente

SwitcherSwitcher

System calls Interrupt Handlers I/O drivers

Page 3: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Immagine di un processo

• L’immagine di memoria di un processo è organizzata in tre regioni:

Testo

Dati

StackE’ rientrante, e può essere condiviso fra più processi

• Ogni regione è uno spazio di indirizzamento autonomo

Page 4: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Che cosa genera il compilatore C

#include ...char buffer[1000];

int version=1;

main(int argc, char *argv[]){ int i;

while ......exit (0);

}

int fun(int n){ int j;

if ......

}

DA

TI

INIZIALIZZATI

NONINIZIALIZZATI

STACK

TESTO

Page 5: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Formato di un eseguibile

Un eseguibile è costituito da un insieme di header e un insieme di sezioni, contenenti codice o dati:

Main header, con magic number

Header della Sezione 1

Header della Sezione 2

Sezione 1

Sezione 2

Page 6: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Sintesi fin qui

Res

iden

teN

on r

esid

ente

Memoria centrale Periferiche

SwitcherSwitcher

System calls Interrupt Handlers I/O drivers

Processo 2

Testo

Dati

Stack

Processo n

Testo

Dati

Stack

Processo 1

Testo

Dati

Stack

Page 7: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Strutture dati per la gestione dei processi

Process Table– si trova nel kernel, ed è residente– contiene una entry per ogni processo, ed è dimensionata

staticamente al momento della configurazione del sistema– per ogni processo contiene le informazioni che ne permettono la

schedulazione, e che devono essere sempre residenti

U-Area (user area)- si trova nel kernel, ma non è residente- contiene quelle informazioni necessarie al kernel per la gestione

del processo, ma che non è necessario che siano sempre residenti in memoria

Ready Queue- Liste dei processi ready (una per ciascun livello di priorità)

Page 8: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Strutture dati per la gestione dei processi

Process Table

1

0

2

3

4 …

U-Area

• PID

• PPID

• UID del proprietario

• Stato del processo

• Flag di residenza

• Parametri di schedulazione (priorità, tempo di CPU usato, tempo di attesa)

• Dimensione del processo

• Maschere per i segnali

• ….

Page 9: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

• Ptr alla Process Table entry

• Registers & PC save area

• Stack del kernel per il processo

• Info relative alla system call corrente

• File descriptors dei file aperti dal processo

• Parametri per operazioni di I/O

• Directory corrente e root directory

• Informazioni per l’accounting

• Puntatori alle region del processo

•….

Strutture dati per la gestione dei processi

1

0

2

3

4 …Process Table

U-Area

Testo

Dati

Stack

Processo

Text Table

Page 10: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Strutture dati per la gestione dei processi

1

0

2

3

4 …Process Table

U-Area

Testo

Dati

Stack

Processo

Text Table

Lista dei processi che hanno priorità 0

0

1

2

-1

-2

Ready Q

Pri

ori

Page 11: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Ker

nel

Sintesi fin qui

Processo 2

Testo

Dati

Stack

U-Area

Processo n

Testo

Dati

Stack

U-Area

Processo 1

Testo

Dati

Stack

U-Area

Process Table

Ready queue

SwitcherSwitcher

Interrupt handlersSystem calls

Page 12: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

MEMORY MANAGEMENT

Page 13: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Paginazione

• Le versioni non “antiche” di Unix utilizzano tecniche di paginazione

• Per eseguire un processo è sufficiente che in memoria siano presenti almeno:– la sua u-area– la sua tabella delle pagine

• Le pagine di testo, dati e stack sono portate dinamicamente in memoria dal kernel, una alla volta, quando servono (cioè a seguito di un page fault)

• Se u-area e tabella delle pagine non sono in memoria, ve le porta il processo swapper

Page 14: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Pagedaemon

• E’ un demone che viene eseguito periodicamente per controllare il numero di pagine libere in memoria:

• Se è troppo basso, libera qualche pagina

• Se è ok, ritorna inattivo

Page 15: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Swapper

E’ un processo di sistema che:

• Se le pagine libere sono sotto il minimo, rimuove uno o più processi dalla memoria (in genere quelli inattivi da più tempo): SWAPOUT

• Verifica periodicamente la esistenza di processi pronti su disco e, se possibile, li carica in memoria (solo u-area e tabella delle pagine)(in genere quelli fuori da più tempo, a meno che non siano troppo grossi): SWAPIN

Page 16: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

PROCESS MANAGEMENT: SYSTEM CALL

Page 17: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Processi in Unix

• In Unix, ogni processo viene creato dal kernel su richiesta di un altro processo (detto processo padre), mediante una apposita system call (fork)

• Esiste un processo iniziale (PID=0) che non ha padre, e che viene creato dal kernel al momento della inizializzazione del sistema

• Ogni processo si termina attraverso una apposita system call (exit)

Page 18: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Creazione di un processoIn Unix un nuovo processo viene creato esclusivamente per duplicazione di un processo esistente, attraverso la system call:

pid_t fork(void);

che crea un processo “figlio” identico al padre, e restituisce:al figlio: 0al padre: PID del figlioin caso di errore: -1

L’unica eccezione è il processo 0, che viene creato alla inizializzazione del sistema

Page 19: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Fork: esempio

p = fork();

if p < 0 { /* la fork è fallita */ }

else if p=0 { /* operazioni del figlio */ }

else { /* operazioni del padre */ }

In Unix non esiste alcuna system call per “creare un processo che esegue l’eseguibile x”Devo farlo utilizzando più system call…

Page 20: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Ker

nel

Creazione di un processo

Processo Padre

Testo

Dati

Stack

U-Area

Process Table

Ready queue

SwitcherSwitcher

Interrupt handlersSystem calls

Processo Figlio

Dati

Stack

U-Area P=0P= n

P=fork()

Page 21: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Che cosa fa la fork• Alloca una entry nella Process Table per il nuovo processo• Assegna un PID unico al nuovo processo e inizializza i

campi della Process Table entry• Crea una copia della immagine del processo padre (il testo

non viene duplicato ma si incrementa un reference count)• Incrementa opportuni contatori dei file aperti• Inizializza i contatori di accounting nella u-area del nuovo

processo• Pone il nuovo processo nello stato di pronto• Restituisce il PID del figlio al padre, 0 al figlio o -1 in caso

di errore

Page 22: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Le system call exec

exec (pathname, argomenti)• sostituisce l’immagine del chiamante con il

file eseguibile pathname, e lo manda in esecuzione passandogli gli argomenti

p = fork();

if p < 0 { /* la fork è fallita */ }

else if p=0 { /* operazioni del figlio */ } exec (…)

else { /* operazioni del padre */ }

Page 23: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Ker

nel

Creazione di un processo

Processo Figlio

Dati

Stack

U-Area

Processo Padre

Testo

Dati

Stack

U-Area

Process Table

Ready queue

SwitcherSwitcher

Interrupt handlersSystem calls

Page 24: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Ker

nel

Exec

Processo Figlio

Dati

Stack

Processo Padre

Testo

Dati

Stack

U-Area

Process Table

Ready queue

SwitcherSwitcher

Interrupt handlersSystem calls

Testo

U-Area

Page 25: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Terminazione di un processo

In Unix un processo si termina attraverso la system call

void _exit(int status);

che:- termina il processo chiamante;

- rende disponibile al processo padre il valore di status, mettendolo nella propria process table entry

- (il padre potrà ottenerlo tramite la primitiva wait)

Page 26: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Wait

pid_t wait (int *status)

- sospende il processo chiamante fino a che uno dei suoi figli termina

- restituisce il PID del figlio terminato (di uno a caso se sono più di uno) o –1 se non ci sono figli

- assegna a status l’exit status del figlio

Page 27: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Exit: esempio

padre

int st;

….

wait ( &st )

figlio

exit (0)

….

0

0process table entry del figlio

Page 28: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Ker

nel

Exit

Processo Figlio

Dati

Stack

Processo Padre

Testo

Dati

Stack

U-Area

Process Table

Ready queue

SwitcherSwitcher

Interrupt handlersSystem calls

Testo

U-Area

La process table entry del figlio non può essere

rimossa fino a quando il valore di status in essa contenuto non è stato prelevato dal padre

Page 29: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Zombie e orfani

• un processo terminato passa nello stato di zombie, e viene definitivamente rimosso dopo che il padre ha ricevuto il suo stato di terminazione con una wait

• un processo zombie occupa un insieme minimo di risorse (process table entry)

• un processo orfano (cioè il cui padre è terminato) viene “adottato” dal processo init, quindi un processo ha sempre un padre

Page 30: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Running

AsleepReady

attesa evento

evento occorso

quanto di tempo esaurito

schedulazione

ZombieExit

Idlefork

Altri stati di un processo

Page 31: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

INIZIALIZZAZIONEDEL SISTEMA

Page 32: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

BOOTSTRAP

• All’accensione della macchina, l’hardware lancia il programma di boostrap …

• … che carica in memoria il blocco di boot da disco, il quale contiene un programma…

• …. che carica in memoria il kernel …

• … e quindi trasferisce il controllo a un entry point (start), che crea il processo 0

Page 33: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Inizializzazione del sistema

Start

1/etc/getty /bin/login

LOGIN SHELL

exec execfork exec

/etc/getty /bin/loginLOGIN SHELL

exec execfork exec

/etc/getty /bin/loginLOGIN SHELL

exec execfork exec

fork exec

swapper

Processo Ø

bootstrap

/etc/init

fork

execdemoni

…….

• crea un processo per ogni terminale attivo e i demoni: è il padre di tutti i processi – è in loop

1

• inizializza le strutture dati del kernel• crea processo 1 (init): fork+exec)

kernel mode user mode

inizializza il terminale

effettua il login

è la shell di login

execfork

cmd

comando

Page 34: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

STRUTTURA DELLA SHELL

Page 35: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Shell: interfaccia utente

$file args esecuzione in foreground

<output>

$file args& esecuzione in background

$

Page 36: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Struttura generale della shell

write (1, PROMPT);while ((n=read(0,buffer,80)=!0) {

riconosci nome file e args;If ( (pid=fork()) ==0) { /* I/O redirection */

if (exec(file, args)==-1) exit (1) }

procid=wait(status);If (status !=0) write (2, error);write(1,PROMPT)

}

FIGLIO

PADRE

Se il comando è eseguito in background, non viene eseguita la wait

$file args<><output>$

Page 37: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

COMUNICAZIONE FRA PROCESSI

Page 38: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Interprocess communication in Unix

Unix fornisce diversi meccanismi:

• Segnali

• Pipes

• Sockets

• …

Page 39: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Che cos’è un segnale• Un segnale è una notifica a un processo che è occorso un

particolare evento:– Un errore di floating point– La morte di un figlio– Una richiesta di terminazione– …

• I segnali possono essere pensati come degli “interrupts software”

• I segnali possono essere inviati:– da un processo a un altro processo– da un processo a se stesso– dal kernel a un processo

• Ogni segnale è identificato da un numero intero associato a un nome simbolico

Page 40: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Segnali in POSIXSegnale Significato (default)

1. SIGABRT Abortisce un processo (termina con dump)2. SIGALRM Invia un segnale di "sveglia" (termina)3. SIGCHLD Lo stato di un figlio è cambiato (ignora)4. SIGCONT Continua un processo stoppato (continua o ignora)5. SIGFPE Floating Point Error (termina con dump)6. SIGHUP Hangup su un terminale (termina)7. SIGILL Istruzione di macchina illegale (termina con dump)8. SIGINT Premuto il tasto DEL per interrompere il processo (termina)9. SIGKILL Segnale per terminare un processo (non può essere ignorato) (termina)10. SIGPIPE Tentativo di scrivere su una pipe che non ha lettori (termina)11. SIGQUIT L'utente ha usato il tasto di quit del terminale (termina con dump)12. SIGSEGV Riferimento a un indirizzo di memoria non valido (termina con dump)13. SIGSTOP Per stoppare un processo (non può essere ignorato) (stoppa il processo)14. SIGTERM Segnale per terminare un processo (termina)15. SIGTSTP L'utente ha usato il tasto "suspend" del terminale (stoppa il processo)16. SIGTTIN Un processo in background tenta di leggere dal suo terminale di controllo

(stoppa il processo)17. SIGTTOU Un processo in background tenta di scrivere sul su terminale di controllo

(stoppa il processo)18. SIGUSR1 Disponibile per scopi definiti dall'applicazione19. SIGUSR2 Disponibile per scopi definiti dall'applicazione

Page 41: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

System call per gestire i segnali

• kill (PID, sig#)

invia il segnale specificato al processo o al gruppo di processi specificato

• sigaction (sig#, action, ..)

associa a un segnale la sua funzione di trattamento

(inizialmente: signal – non POSIX)

Page 42: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Come viene trattato un segnale

Quando un processo riceve un segnale, può:

1. Trattarlo mediante una specificata funzione (“handler”)

2. Ignorarlo

3. Attivare l’azione di default associata al segnale stesso (termina o sospendi il processo, ignora)

Page 43: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Esempio

• Per terminare o sospendere un processo in foreground, l’utente può premere i tasti CTRL-C o CTRL-Z (rispettivamente)

• Tale carattere viene acquisito dal driver del terminale, che notifica al processo il segnale SIGINT o SIGTSTP (rispettivamente)

• Per default, SIGINT termina il processo e SIGTSTP lo sospende

• NB: Tali segnali vengono inviati a tutto il gruppo di processi

Page 44: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Protezione

Per motivi di protezione, deve valere almeno una delle seguenti condizioni:

1. Il processo che riceve e il processo che invia il segnale devono avere lo stesso owner

2. L’owner del processo che invia il segnale è il superuser

Page 45: PROCESS MANAGEMENT: STRUTTURE DATI. Sintesi fin qui Residente Processo 2Processo n Daemon Processo 1 Non residente Memoria centralePeriferiche Processi.

Strutture dati per la gestione dei segnali

1

0

2

3

4 …Process Table

U-Area

Testo

Dati

Stack

Processo

Text Table

1 2 3 4 ..…

un bit per ogni segnale, che viene alzato dalla kill(viene ricordato solo l’ultimo segnale di ogni tipo)

0 1 1 0 000

1 2 3 4 ..…

array di puntatori agli handler definiti dall’utente per ogni segnale (null=default)