Transizioni di stato in UNIX - Ingegneria elettrica ed elettronica

Università degli Studi di Cagliari
Corso di Laurea Specialistica in Ingegneria Elettronica
SISTEMI OPERATIVI
A.A. 2004/2005
Docente: Giorgio Giacinto
Processi in Linux
Roberto Perdisci – A.A. 2004/2005
1
Transizioni di stato in UNIX
Roberto Perdisci – A.A. 2004/2005
2
Transizioni di stato in Linux
Roberto Perdisci – A.A. 2004/2005
3
Gestione della Memoria di
Sistema
La memoria di sistema è divisa in due regioni
spazio utente, in cui vengono eseguiti i programmi
utente(esecuzione in user mode). Il sistema operativo gestisce
questo spazio in modo che i processi utente non interferiscano fra
loro
spazio del kernel, dove viene eseguito il kernel del sistema
operativo
I processi utente possono accedere allo spazio del kernel
solo attraverso le system call
Il processo chiamante acquisisce privilegi speciali (di root) che
consentono di manipolare le strutture dati del kernel
Roberto Perdisci – A.A. 2004/2005
4
Memoria assegnata ai processi
I processi utente in memoria sono divisi in tre segmenti
(esempio: p1.3.cxx)
segmento di testo: contiene il codice eseguibile e i dati
costanti. Questa parte della memoria è in sola lettura e può
essere condivisa da processi diversi che eseguono lo stesso
codice (in modo da risparmiare spazio in memoria)
segmento dei dati (contiguo logicamente al segmento di testo):
Contiene dati inizializzati (in C variabili statiche) e dati non
inizializzati. Questa area può essere estesa (es. malloc,
new, etc.)
segmento di stack: usato dal sistema per memorizzare
identificatori automatici, variabili locali, registri e informazioni
sulle chiamate di funzioni.
5
Roberto Perdisci – A.A. 2004/2005
Memoria assegnata ai processi
e memoria di sistema
Detto anche
BSS
Detto anche
HEAP
Roberto Perdisci – A.A. 2004/2005
6
L’area utente (u-area)
Il sistema operativo riserva, per ciascun processo,
un'area di memoria chiamata u-area
La u-area contiene informazioni relative al processo
file aperti
directory corrente (directory di lavoro)
segnali
system stack (ad es., le informazioni per la gestione delle
chiamate a system call vengono memorizzate in questo stack)
Questa area è utilizzata dal sistema operativo e di
norma non è accessibile ai processi utente
Struttura della u-area in <sys/user.h>
Roberto Perdisci – A.A. 2004/2005
7
Indirizzi di memoria dei
processi
Il sistema operativo tiene traccia degli indirizzi virtuali
associati a ciascun processo utente
#include <stdio.h>
/* Displaying process segment addresses */
extern int etext, edata, end;
void main(void){
printf("etext: %6X \t edata: %6X \t end: %6X \n",
&etext, &edata, &end);
}
Gli indirizzi delle variabili etext, edata, end contengono
rispettivamente il primo indirizzo valido successivo ai
segmenti di testo, dei dati inizializzati e dei dati non
inizializzati (esempio p1.4.cxx)
Roberto Perdisci – A.A. 2004/2005
8
Indirizzi di memoria dei
processi
Esempio p1.4.cxx
E' possibile visualizzare
gli indirizzi virtuali
associati ad un
programma eseguibile
tramite il comando nm
etext
edata
Text
main()
showit()
Data Initialized
cptr
Uninitialized Data
buffer1
end
HEAP
Stack
buffer2
i
Roberto Perdisci – A.A. 2004/2005
9
Funzioni di libreria
I programmi fanno uso di funzioni
definite dall’utente
definite in precedenza e disponibili all’utente: funzioni di libreria
Le funzioni di libreria sono fornite in termini di codice
oggetto
Librerie statiche: Il linker inserisce il codice oggetto delle funzioni
nel file eseguibile del programma utente
Librerie condivise: Il compilatore inserisce solamente dei
riferimenti nel file eseguibile. Tali riferimenti vengono risolti dal SO
in tempo di esecuzione (run-time library routines). Il codice
oggetto viene caricato in memoria e condiviso con altri processi
che ne vogliano fare uso
Roberto Perdisci – A.A. 2004/2005
10
System calls
Alcune funzioni di libreria sono in realtà chiamate al
sistema operativo
il programma utente chiede al sistema operativo di compiere
alcune operazioni
Il sistema operativo esegue operazioni contenute nel
kernel
il processo che ha fatto la chiamata passa dal modo utente al
modo supervisore (context switch o mode switch)
Per limitare il tempo necessario al cambio di contesto, spesso le
chiamate al sistema per I/O sono inserite in un buffer.
11
Roberto Perdisci – A.A. 2004/2005
Legame fra system call e
librerie
Programma Eseguibile
Funzioni di Libreria
User mode
Kernel mode
System Calls
Kernel
Hardware
Roberto Perdisci – A.A. 2004/2005
12
Creazione di un processo
Fatta eccezione per i processi generati durante il bootstrap del
sistema (ad es., swapper, init e pagedaemon), i processi
utente vengono creati attraverso la chiamata al sistema fork
il processo che crea un nuovo processo è detto genitore
(parent)
il nuovo processo che è stato creato è detto figlio (child)
Include files: <sys/types.h> <unistd.h>
Prototipo:
pid_t fork(void);
Valori ritornati:
in caso di successo: 0 al figlio, PID del figlio al genitore
in caso di errore: -1
13
Roberto Perdisci – A.A. 2004/2005
fork()
Il figlio creato dal sistema operativo è una copia del
processo genitore
Il sistema operativo passa al figlio la maggior parte delle
informazioni di sistema relative al genitore
descrittori dei file aperti
ambiente
Alcune informazioni sono relative solo al figlio
Il suo identificatore (PID) e l’identificatore del genitore (PPID)
Limiti di CPU (reimpostati ai valori di default)
Le azioni relative ai segnali
Esempio: p1.5.cxx
Roberto Perdisci – A.A. 2004/2005
14
Ambiente dei Processi
Roberto Perdisci – A.A. 2004/2005
15
Identificatore di Processo
(PID)
Il PID è un numero intero che identifica univocamente un
processo
I numeri vengono assegnati sequenzialmente dal
sistema operativo
solo alcuni processi di sistema creati in fase di bootstrap sempre
nello stesso ordine, hanno lo stesso PID.
La chiamata al sistema getpid resituisce il PID del
processo chiamante
cout << “My process ID is “ << getpid() << endl;
Roberto Perdisci – A.A. 2004/2005
16
Identificatore del processo
genitore (PPID)
A ciascun processo è associato anche il PID del
processo genitore (PPID = Parent PID)
La chiamata al sistema getppid() resituisce il PPID del
processo chiamante
Non esiste nessuna funzione che consenta di
recuperare il PID dei figli
Per farlo, il processo genitore deve memorizzare il PID dei figli
restituiti da fork()
Roberto Perdisci – A.A. 2004/2005
17
Identificatore di gruppo di
processi
Quando un processo genera processi figli, viene creato
un gruppo di processi
Il genitore viene detto “process leader”
L’identificatore del gruppo di processi coincide con il PID
del process leader
Il sistema operativo usa l’identificatore di gruppo per
inviare segnali ad un gruppo di processi
ad es., se un “process leader” riceve un segnale di ‘kill’ tutti i
processi dello stesso gruppo ricevono il segnale
getpgid(pid_t pid) restituisce l’ID del gruppo
Roberto Perdisci – A.A. 2004/2005
18
Relazione fra gli ID di
processo
Esempio: p2.1.cxx
21292
Process-Group ID
22025
22025
22032
22026
22028
22027
22029
22031
22030
19
Roberto Perdisci – A.A. 2004/2005
Permessi
A ciascun file UNIX è associato un insieme di bit i cui
valori rappresentano i permessi d’accesso agli utenti del
sistema
9 bit, divisi in 3 insiemi, ciascuno con tre bit
i bit di un insieme indicano se il file può essere letto (r),
scritto (w) o eseguito (x) da una certa categoria di utenti
i 3 insiemi riguardano
il proprietario (owner) del file
il gruppo cui appartiene il proprietario
tutti gli altri utenti
Roberto Perdisci – A.A. 2004/2005
20
Permessi
Di solito i 9 bit sono rappresentati da tre cifre in ottale
Ad esempio: rwx r-x r-x = 755 significa:
proprietario: lettura (r), scrittura (w) , esecuzione (x)
gruppo: lettura (r) ed esecuzione (x)
altri: lettura (r) ed esecuzione (x)
Il comando chmod consente al proprietario, o a root, di
cambiare i permessi di accesso di un file
Il comando ls –l consente di elencare i file con i
relativi permessi
21
Roberto Perdisci – A.A. 2004/2005
Permessi
Quando un file viene creato, i permessi sono assegnati di
default dal sistema operativo.
Viene eseguita un operazione binaria fra la creation mask (di
solito 777 per file eseguibili e 666 per gli altri file) e la umask (di
solito 022).
creation_mask AND (NOT umask)
per ulteriori informazioni: man 2 umask
L’amministratore di sistema può cambiare il valore di default
di sistema
Ciascun utente può impostare il proprio valore di default
inserendo la chiamata al sistema umask all’interno del file di
configurazione .bash_profile
Roberto Perdisci – A.A. 2004/2005
22
Identificatori di utente e di
gruppo
Ciascun utente è identificato da
real user ID (UID), associato al nome utente
real group ID (GID), associato al nome del gruppo di cui fa
parte l’utente
A ciascun processo sono associati
effective user ID (EUID)
effective group ID (EGID)
Dal momento che tutti i processi (eccetto alcuni processi
di sistema) vengono creati da utenti, di solito l’“effective”
ID coincide con il “real” ID.
23
Roberto Perdisci – A.A. 2004/2005
Set User ID
“real” ID
usato dal sistema per e-mail, accounting, ecc.
“effective” ID
per stabilire i privilegi associati a quel processo
Ad es., per cambiare la propria password è necessario avere i
privilegi di root
Esiste un altro insieme di permessi SUID (set-user-ID) e SGID
(set-group-ID)
s al posto di x per il proprietario del file imposta l’effective
ID del processo uguale all’ID del proprietario e non
dell’utente che l’ha eseguito
(cfr. permessi del comando /usr/bin/passwd)
Roberto Perdisci – A.A. 2004/2005
24
Limiti di risorse per un
processo
Il comando ulimit consente di visualizzare le risorse
disponibili
ulimit -aH: “hard limits” (possono essere modificati solo dal
superuser)
ulimit -aS: “soft limits” (possono essere modificati
dall'utente). Un “soft limit” è tipicamente minore o ugaule al
corrispondente “hard limit”
I limiti visualizzati sono relativi a
cpu seconds, dimensione max di un file, spazio
complessivo relativo ai segmenti di dati e di stack, spazio
per il segmento di stack, numero descrittori di file, ecc.
25
Roberto Perdisci – A.A. 2004/2005
Segnali
Possono essere pensati come l’analogo software degli
“interrupt” per l’hardware.
Possono essere generati da
Hardware: ad es., un processo cerca di accedere ad aree di
memoria non autorizzate
Kernel: ad es., per notificare ad un processo che la periferica di
cui era in attesa è pronta
Altri processi: ad es., un processo figlio notifica al genitore che
ha terminato
Utente: ad es., producendo segnali di quit, interrupt o stop
attraverso la tastiera
Roberto Perdisci – A.A. 2004/2005
26
Segnali
I segnali sono numerati ( man 7 signal )
<sys/signal.h>
Un processo che ha ricevuto un segnale può:
Eseguire l’azione di default per quel segnale, specificata dal
sistema
ad es.: (a) notificare al genitore la terminazione, (b) generare
un “core dump” (copia su file dell’immagine del processo in
memoria), (c) terminare
Ignorare il segnale (non valido per SIGSTOP e SIGKILL)
Catturare il segnale ed eseguire la routine legata al segnale
(non valido per SIGSTOP e SIGKILL)
Roberto Perdisci – A.A. 2004/2005
27
Informazioni sui file
L’immagine di un processo contiene informazioni sui file
aperti dal processo stesso
A ciascun file aperto è associato un numero intero, chiamato
descrittore di file
Il descrittore di file è l’indice di una tabella con 1024 righe che si
trova nella u-area del processo (contiene i file aperti dal
processo)
Il sistema operativo gestisce la tabella dei file aperti da tutti i
processi (system file table)
Nella tabella dei descrittori dei file di ciascun processo c’è il
riferimento alla corrispondente riga della tabella di sistema
Roberto Perdisci – A.A. 2004/2005
28
Relazioni fra tabelle dei file
aperti
Roberto Perdisci – A.A. 2004/2005
29
Processi genitori/figli e tabelle
dei descrittori di file
Ciascun processo figlio contiene una copia della tabella
dei descrittori di file del padre
Ciascun figlio può accedere ai file aperti dal padre usando gli
stessi descrittori
Figlio e padre possono leggere/scrivere indipendentemente
Identificatori di default
0 stdin (input standard)
1 stdout (output standard)
2 stderr (errori: di solito coincide con il dispositivo stdout)
Roberto Perdisci – A.A. 2004/2005
30
Il filesystem /proc
E’ un filesystem virtuale che contiene informazioni relative
al kernel, strutture dati del kernel, stato di ciascun
processo e thread associati. ( man 5 proc )
E’ virtuale perchè le informazioni non sono memorizzate su disco,
ma in memoria principale
Le informazioni memorizzate in /proc possono essere
visualizzate con il comando procinfo
ls /proc
Gli elementi numerici sono associati ai processi, mentre gli
elementi non-numerici sono associati al kernel
Roberto Perdisci – A.A. 2004/2005
31
Il filesystem /proc
Per ogni processo, la relativa directory contiene
cmdline - lista argomenti in linea di comando
cpu - informazioni sull’uso della CPU
cwd - current working directory
exe - link simbolico al file binario del processo
environ - Variabili d’ambiente
fd - identificatori numerici dei file aperti
ecc.
Roberto Perdisci – A.A. 2004/2005
32