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