• Non ci sono risultati.

Esercitazione E3 Processi

N/A
N/A
Protected

Academic year: 2022

Condividi "Esercitazione E3 Processi"

Copied!
48
0
0

Testo completo

(1)

Esercitazione E3 Processi

Sistemi Operativi (9 CFU), CdL Informatica, A. A. 2013/2014 Dipartimento di Scienze Fisiche, Informatiche e Matematiche Università di Modena e Reggio Emilia

(2)

2

Quote of the day

(Meditate, gente, meditate...)

“Controlling complexity is the essence of computer programming. ”

Brian Kernighan (1942-) Informatico, accademico

Autore di “The C Programming Language”

Autore delle utility UNIX

Inventore del termine “UNIX”

(3)

IDENTIFICAZIONE

(4)

Identificazione tramite nome esatto

(Dal nome esatto al PID)

Il comando esterno pidof stampa i PID di tutti i processi attivati a partire da un nome esatto.

Si provi a stampare i PID di tutti i processi bash attivati.

pidof bash

(5)

Esercizi (1 min.)

1.Qual è il PID del processo init (il gestore dei servizi UNIX)?

(6)

Soluzioni

1.Il PID è 1, come è facile verificare digitando il seguente comando:

pidof init

(7)

Il difetto principale di pidof

(Dovrebbe essere evidente a tutti)

Purtroppo, pidof presenta diverse limitazioni.

La più evidente è la necessità di usare il nome esatto del comando eseguito.

Se si vogliono cercare i processi aventi nome bash, ricordandosi solo che tali processi iniziano con la stringa “ba”, si potrebbe scrivere:

pidof ba

Tale comando, purtroppo, non funziona!

(8)

Identificazione tramite nome parziale

(Da una sottostringa al PID)

Il comando esterno pgrep stampa i PID di tutti i processi attivati a partire da una espressione regolare estesa.

Si provi a stampare i PID di tutti i processi il cui nome inizia con la stringa “ba”.

pgrep '^ba.*$'

(9)

Alcune opzioni notevoli di pgrep

(Da ricordare; si incontrano spesso nella carriera di un sysadmin)

man pgrep per tutti i dettagli.

pgrep -n bash: stampa il PID del processo più recente contenente la stringa “bash” nel nome.

pgrep -o bash: stampa il PID del processo meno recente contenente la stringa “bash” nel nome.

pgrep -l bash: stampa il PID e il nome dei processi contenenti la stringa “bash” nel nome

(10)

Esercizi (1 min.)

2. I processi del desktop “XFCE” iniziano con la stringa “xfce”. I processi del desktop “GNOME”

iniziano con la stringa “gnome”. Come si possono individuare i processi del desktop in esecuzione?

(11)

Soluzioni

2.L'espressione regolare che identifica i processi in questione è:

'^gnome.*$' (GNOME) '^xfce.*$' (XFCE)

Il comando che elenca i processi ed i relativi PID è pertanto il seguente:

pgrep -l '^gnome.*$' (GNOME) pgrep -l '^xfce.*$' (XFCE)

(12)

12

Visualizzazione dell'albero dei processi

(ASCII-art)

Il comando esterno pstree stampa una rappresentazione compatta dell'albero dei processi.

pstree | less -Mr

systemd-+-NetworkManager---3*[{NetworkManager}]

|-2*[dbus-daemon]

| ...

Il processo padre

Due processi

figli Tre thread

figli systemd

init

(13)

Alcune opzioni notevoli di pstree 1/2

(Da ricordare)

man pstree per tutti i dettagli.

pstree -a: stampa i nomi dei processi in esecuzione ed i relativi argomenti.

pstree -c: stampa una rappresentazione dell'albero più esplicita

systemd-+

|-2*[dbus-daemon] systemd-+

|-dbus-daemon |-dbus-daemon

(14)

Alcune opzioni notevoli di pstree 2/2

(Da ricordare)

man pstree per tutti i dettagli.

pstree -p: mostra i PID dei processi.

pstree -H PID: evidenzia in neretto il ramo dell'albero dal processo init al processo identificato da PID.

(15)

Esercizi (1 min.)

3. Mostrare la catena di processi da init ad uno qualunque dei processi bash.

(16)

Soluzioni

3.Si sceglie un PID fra quelli forniti dal comando:

pgrep bash

Si mostra il percorso con il comando:

pstree -H PID

(17)

MISURAZIONE

(18)

Tempo di completamento

(E non solo)

Il tempo di completamento di un programma è misurabile in due modi:

Builtin di shell time

Comando esterno /usr/bin/time

Il primo è una forte semplificazione del secondo.

Attenzione! Se scrivete time, viene eseguito il builtin! Se volete eseguire il comando, dovete scrivere /usr/bin/time!

(19)

/usr/bin/time

(Il comando giusto)

Misura il tempo di completamento ed il consumo delle principali risorse di sistema (CPU, disco, memoria, file aperti, cambi di contesto, …).

man time per tutti i dettagli.

/usr/bin/time -f “%E”: stampa il tempo di completamento del processo.

/usr/bin/time -f “%E %c %w”: stampa anche il numero di cambi di contesto dovuti alla scadenza del quanto e alle richieste di I/O bloccanti.

(20)

Esercizi (5 min.)

4. Si scriva un programma in C che esibisca un comportamento di tipo CPU-bound e si misurino:

il tempo di completamento.

numero di cambi di contesto legati allo scadere del quanto di tempo.

percentuale di CPU assegnata al processo.

NOTA BENE: evitate cicli infiniti! Non sareste in grado di misurare il tempo di completamento!

(21)

Soluzioni

4.Un possibile programma CPU-bound è elencato nel listato cpubound.c contenuto nell'archivio E3-soluzioni.tar.gz.

La misurazione delle grandezze richieste può essere svolta tramite il comando /usr/bin/time:

/usr/bin/time %E %c %w ./cpubound

(22)

Elenco statico di tutti i processi

(Misura di un processo Misura puntuale di tutti i processi)

Il comando /usr/bin/time è orientato al singolo processo; c'è modo di ottenere la lista di tutti i processi e relativo consumo di risorse?

Il comando esterno ps fornisce una “istantanea” del consumo di risorse di tutti i processi.

Sono possibili diversi filtri:

processi generati da un utente.

processi collegati ad un terminale.

visione ad albero.

...

(23)

Le opzioni di ps

(La follia)

La sintassi di ps è estremamente complessa (man ps per tutti i dettagli). Ci sono due modi: System V e BSD.

System V (opzioni col trattino) ps -eLf, ps -ejH

BSD (opzioni senza trattino) ps ax, ps faxu

Ovviamente, le due sintassi sono differenti!

ps -aux è completamente diverso da ps aux.

La vista di default di ps è ristretta ai soli processi generati dall'utente che ha eseguito ps.

(24)

Opzioni BSD

(ax, fax, faxl)

ps ax: stampa tutti i processi attivi

Cosa fanno le due opzioni ax?

a: serve a togliere la visione di default dei soli processi legati a un utente

x: serve a togliere la visione di default dei soli processi legati a terminali

ps fax: vista ad albero (forest) di tutti i processi attivi.

ps faxl: vista estesa (con più campi) ad albero (forest) di tutti i processi attivi.

(25)

Lo stato di esecuzione di un processo

(Bloccato? In esecuzione? Terminato? Stoppato?)

Lo stato di un processo è presentato da un campo della visualizzazione estesa.

System V: campo S BSD: campo STAT

La rappresentazione più scarna è la System V: un singolo carattere.

La rappresentazione BSD estende quella System V aggiungendo uno o due caratteri (per la descrizione il ruolo del processo nell'organizzazione “per job”).

(26)

26

I possibili stati

(Bloccato? In esecuzione? Terminato? Stoppato?)

D: Uninterruptible Sleep, attesa non interrompibile (I/O in esecuzione)

R: Running o runnable (in coda di pronto)

S: Interruptible Sleep, attesa interrompibile (attesa di un evento, ad es. Timer)

T: Stopped, il processo è stato “stoppato”, ad esempio, con la sequenza CTRL-z

Z: Zombie, processo terminato e non ri- schedulabile (è in attesa di essere ripulito e distrutto dal kernel)

(27)

Esercizi (2 min.)

5. Si esegua il programma scritto nell'Esercizio 4 e si determini lo stato di esecuzione.

(28)

Soluzioni

5.Si esegue il programma: ./cpubound.

Si stampa la visualizzazione estesa dei processi:

ps faxl | less -Mr.

Si individui la riga corrispondente a cpubound.

Si individui la colonna di nome STAT.

Si legga lo stato (probabilmente R).

(29)

Elenco dinamico di tutti i processi

(Misura puntuale di tutti i processi Misura periodica di tutti i processi)

I comandi precedenti forniscono una sola misurazione:

ad esecuzione finita (time, /usr/bin/time).

in un istante deciso dall'utente (ps).

È possibile monitorare continuamente tutti i processi? Sì, è possibile mediante il comando top.

(30)

Il comando top

(Monitor periodico dei processi)

Il comando top è una estensione periodica del comando ps (man top per tutti i dettagli).

Se invocato senza opzioni, mostra una schermata interattiva contenente:

in alto: indici di prestazione per l'intero sistema.

in basso: indici di prestazione per i singoli processi.

I processi sono elencati in ordine di utilizzazione di CPU (l'ordinamento può essere cambiato).

(31)

Alcuni comandi interattivi utili

(Configurano la vista fornita all'utente)

h: invoca l'help in linea.

s: imposta l'intervallo di campionamento.

f: seleziona il campo di ordinamento.

R: cicla l'ordinamento crescente/decrescente.

V: visione dei processi ad albero.

l: indici di sistema per CPU o complessivi.

Cursore su/giù, Pagina su/giù:

navigazione dell'elenco dei processi.

(32)

La modalità non interattiva

(Per redirezionare l'output su file)

Se invocato con l'opzione -b, top stampa il suo output su terminale, in modalità batch.

Si provi il seguente comando: top -b -d 1

-b: modalità non interattiva (batch)

-d 1: imposta l'intervallo di campionamento ad 1 secondo

(33)

Esercizi (1 min.)

6. Si esegua il programma scritto nell'Esercizio 4 e si verifichi che è CPU-bound usando top.

(34)

Soluzioni

6.Si esegue il programma: ./cpubound.

Si esegua top.

Si individui la riga corrispondente a cpubound.

Si individua la colonna di nome %CPU.

Si osservi un valore prossimo al 100%.

(35)

Il comando pidstat

(Fà la radiografia ad un processo)

Il comando pidstat (offerto dal pacchetto software sysstat) è uno strumento di monitoraggio delle risorse consumate da singoli processi.

CPU, memoria, disco, scheduler, …

(36)

Alcune opzioni utili di pidstat

(Da ricordare)

man pidstat per tutti i dettagli.

pidstat -u: mostra “one shot” l'utilizzazione di CPU media per ciascuno dei processi attivi finora a partire dall'accensione del PC.

pidstat -u 1: mostra ogni secondo l'utilizzazione di CPU per ciascuno dei processi attivi nell'ultimo secondo.

pidstat -u -p 4000: mostra ogni secondo l'utilizzazione di CPU per il processo avente PID 4000.

(37)

Campionamento in base al nome

(Da ricordare)

È possibile individuare il processo in base ad una espressione regolare sul suo nome?

Sì; si usa l'opzione -C di pidstat, che permette di specificare tale espressione regolare.

Ad esempio, se si vuole capire quanta CPU consumano i terminali e le shell, si può scrivere il seguente comando:

pidstat -u -C “bash|terminal” 1

(38)

Esercizi (1 min.)

7. Si esegua il programma scritto nell'Esercizio 4 e si verifichi che è CPU-bound usando pidstat.

(39)

Soluzioni

7.Si esegue il programma: ./cpubound.

Si esegua il seguente comando:

pidstat -u -p $(pgrep cpubound) 1

Si individua la colonna di nome %usr (utilizzazione del programma in user space).

Si osservi un valore prossimo al 100%.

(40)

API DELLA LIBRERIA DEL C

(41)

La chiamata di sistema fork()

(Ovvero, come un processo si riproduce)

Quali strumenti esistono per creare processi figli?

Si interroghi il manuale UNIX:

apropos -s2,3 -r '.*create.*process.*'

Fra le funzioni a disposizione vi è la chiamata di sistema fork().

Si legga il manuale di fork():

man 2 fork()

(42)

42

Il funzionamento di fork()

(Che cosa deve scrivere il programmatore)

pid_t pid;

pid = fork();

if (pid == 0) {

<processo figlio>

} else if (pid > 0) {

<processo padre>

} else {

<gestione errore>

Vedere l'esempio fork.c nell'archivio:}

E3-esempi.tar.gz.

Qui sarà inserito il codice sorgente pertinente alle operazioni del processo figlio.

Qui sarà inserito il codice sorgente pertinente alle operazioni del processo padre.

(43)

Esercizi (15 min.)

8. Si scriva un programma in C che generi l'albero di processi illustrato di fianco. Si verifichi la presenza del sottoalbero di processi con il comando opportuno.

NOTA: per bloccare l'esecuzione dei

processi per un tempo

sufficientemente lungo, si usi la funzione di libreria sleep().

(44)

44

Soluzioni

8.Si studi il codice sorgente fork.c contenuto nell'archivio E3-soluzioni.tar.gz.

Per verificare la presenza del sottoalbero è possibile usare il comando pstree:

pstree -H $(pgrep -n fork)

Evidenziazione della catena di processi che porta al PID considerato.

Ritorna il PID del processo

“fork” più recente (l'ultimo creato dal programma fork).

(45)

Recupero di PID notevoli

(Ovvero, come sapere il proprio PID e quello del proprio processo padre)

Sono messe a disposizione due chiamate di sistema per il recupero dei PID notevoli.

Chiamata getpid(): ritorna il PID del processo che la invoca.

pid_t pid = getpid();

Chiamata getppid(): ritorna il PID del processo padre di chi la invoca.

pid_t pid = getppid();

Queste due chiamate non ritornano mai un errore

(46)

Un esempio

(Abbastanza semplice)

Il programma di esempio getpids.c contenuto nell'archivio E3-esempi.tar.gz mostra l'utilizzo delle chiamate di sistema getpid() e getppid().

A che serve ottenere il PID?

→ Diverse funzioni di libreria operanti su processi richiedono il PID dei suddetti (ad es., per l'invio di segnali).

(47)

Esercizi (10 min.)

9. Nel programma di esempio ora visto, il processo figlio potrebbe stampare come PID del padre il valore 1. Motivare questo fatto.

10.Come è necessario modificare il sorgente getpids.c per essere certi che il processo figlio stampi il PID del padre e non 1?

(48)

Soluzioni

9.Nel momento in cui il processo figlio recupera il PID del processo padre, quest'ultimo è già uscito. L'operazione di reparenting forza il processo figlio ad essere figlio di init (che ha PID pari ad 1).

10.È sufficiente inserire una sleep() nel blocco di codice gestito dal processo padre. Si veda il sorgente getpids.c nell'archivio E3- soluzioni.tar.gz.

Riferimenti

Documenti correlati

répression. Presses du CNRS. European University Institute. Available Open Access on Cadmus, European University Institute Research Repository... illicites ne se trouve

Abbreviations: GCV: Ganciclovir; VGCV: Valganciclovir; HPLC: High-Performance Liquid Chromatography; RT: Retention Time; AUC: Area Under The Concentration Time Curve; LLOQ:

un processo puo’ chiamare wait quando riceve SIGCHLD, in questo caso ritorna immediatamente con lo stato del figlio appena terminato waitpid può scegliere quale figlio aspettare

r più processi possono trovarsi negli stati ready e waiting. necessità di strutture dati per mantenere in memoria le informazioni su processi

The second one evolved from a legal institution and had significant repercussions for the individual merchant, his social group and society as a whole.. Feudal society, in

la retroazione non lineare innesca una oscillazione critica (ciclo

 Nel processo padre la funzione fork() restituisce un valore diverso da 0; normalmente tale valore indica il pid del figlio appena generato, tranne -1, che indica un errore e

È da notare come, in un contesto in cui l’organizzazione e la prenotazione delle vacanze passano sempre più attraverso la rete, tutte queste formule prevedano la creazione di