prof. Nunzio Brugaletta

atapSO

EnneBi – Computer Science
AvantiIndietroInizio




Processi e immagini in Linux

La fase di inizializzazione di un sistema Linux crea il processo con PID 0. A parte il primo, ogni processo viene generato da un processo padre. Ogni nuovo processo viene generato dalla duplicazione del processo padre, per mezzo della chiamata di sistema fork() (un servizio richiesto al kernel che genera, appunto, un nuovo processo). La fork() genera un nuovo entry nella tabella dei processi attivi con tutti i campi uguali al processo padre tranne, per esempio, quelli del PID e dell'identificativo del processo padre, dopo di ciò il processo padre provvede a mettere in coda, assieme agli altri, il processo figlio. Con la chiamata alla funzione di sistema exec() si permette al processo di sostituire la propria immagine con quella prodotta dal file eseguibile avviato.

Il sistema più semplice per avere le informazioni indispensabili sui processi avviati è usare ps (Process Status):

$ ps
  PID TTY           TIME CMD
 1618 pts/0     00:00:00 bash
 1711 pts/0     00:00:00 emacs
 1712 pts/0     00:00:00 ps

in questo esempio è messo in evidenza che ci sono 3 processi, di cui uno (quello con PID 1712) è il processo associato all'eseguibile ps stesso. Le altre colonne indicano, nell'ordine, il terminale associato al processo, il tempo CPU utilizzato, la linea di comando da cui è stato avviato il processo.

Per ogni processo avviato viene generata una sottodirectory nello pseudo-filesystem /proc, con il nome coincidente con PID e proprietario l'utente che ha lanciato il comando:

$ ls -l /proc/1618
-r--r--r--    1 tux   tux        0 feb 21 20:13 cmdline
lrwxrwxrwx    1 tux   tux        0 feb 21 20:13 cwd -> /home/tux
-r--------    1 tux   tux        0 feb 21 20:13 environ
lrwxrwxrwx    1 tux   tux        0 feb 21 20:13 exe -> /bin/bash
dr-x------    2 tux   tux        0 feb 21 20:13 fd
-r--r--r--    1 tux   tux        0 feb 21 20:13 maps
-rw-------    1 tux   tux        0 feb 21 20:13 mem
-r--r--r--    1 tux   tux        0 feb 21 20:13 mounts
lrwxrwxrwx    1 tux   tux        0 feb 21 20:13 root -> /
-r--r--r--    1 tux   tux        0 feb 21 20:13 stat
-r--r--r--    1 tux   tux        0 feb 21 20:13 statm
-r--r--r--    1 tux   tux        0 feb 21 20:13 status

nell'elenco visualizzato alcuni file sono collegamenti simbolici: nel caso dell'esempio, cwd serve per individuare la directory in cui si trovava l'utente che ha lanciato il processo. Ci si potrebbe, per esempio, spostare nella directory, prendendo il parametro da specificare di seguito al comando cd, da /proc/1618/cwd:

$ pwd
/proc/1618
$ cd < /proc/1618/cwd
$ pwd
/home/tux

nella riga con il comando cd viene usato l'operatore di re-indirizzamento dell'input (il simbolo <): invece di specificare direttamente il nome della directory dove ci si vuole spostare, si specifica il file da cui leggere il nome.

I vari file creati nella directory del processo, costituiscono le informazioni contenute nell'immagine del processo:

File

Contenuto

cmdline

La linea di comando che ha lanciato il processo

cwd

Collegamento alla directory di lavoro corrente

environ

Le variabili di ambiente del processo

exe

Collegamento all'eseguibile che ha generato il processo

fd

Sottodirectory con i file aperti dal processo

maps

La mappa della memoria e i relativi permessi di accesso

mem

Informazioni per permettere l'accesso alle pagine del processo (le varie parti in cui è diviso)

mounts

I punti di montaggio dei vari file system accessibili

root

Collegamento alla root

stat

Informazioni sullo stato del processo

statm

Informazioni sull'occupazione di memoria delle pagine

status

Informazioni presenti sia in stat che in statm ma in formato più leggibile

Tutte le informazioni contenute nei file sono visualizzabili, per esempio, utilizzando il comando less. Fa eccezione environ, che necessita, come riportato nella pagina man di proc, per essere visualizzato in forma più comprensibile, della linea di comando:

$ (cat /proc/1618/environ; echo) | tr “\000” “\n”

Nel file virtuale status sono sintetizzate le informazioni sull'immagine del processo:

$ less /proc/1618/status
Name:   bash
State:  S (sleeping)
Tgid:   1618
Pid:    1618
PPid:   1612
TracerPid:      0
Uid:    1003    1003    1003    1003
Gid:    100     100     100     100
FDSize: 256
Groups: 5 6 10 20 21 22 24 25 26 27 29 30 44 60 100 106 1003
VmSize:     4044 kB
VmLck:         0 kB
VmRSS:      1592 kB
VmData:      312 kB
VmStk:        20 kB
VmExe:       588 kB
VmLib:      1428 kB
...

dopo lo stato attuale del processo e gli identificativi del processo stesso (Pid), del padre (PPid), dell'utente, del gruppo cui appartiene l'utente, vengono elencate le dimensioni in memoria delle varie parti che compongono l'immagine.




AvantiIndietro - Inizio

http://ennebi.solira.org

ennebi@solira.org