Processi Processi 1 Richiami sui Concetti Fondamentali dei Processi Processi 2 Definizione Nell’ambito dei sistemi operativi esistono diverse definizioni di “processo”, ad es. un programma in esecuzione un’attività asincrona l’entità a cui sono assegnati i processori ciò che è manifestato dall’esistenza di un blocco di controllo di processo nel sistema operativo ... Processi 3 Stati di un Processo … Un processo in un dato istante può trovarsi in uno e uno solo dei seguenti stati: •Ready, •Running, •Blocked. Processi 4 … Stati di un Processo Ready Blocked Dispatch Timerrunout Running Blocked Wakeup Processi 5 Process Control Block (PCB) Il PCB è una struttura dati che per ogni processo contiene informazioni quali: •Identificatore unico (PID); •Stato corrente; •Priorità; •Puntatori alla memoria del processo; •Puntatori alle risorse allocate al processo; •… Processi 6 Operazioni sui Processi •Creazione, che a sua volta richiede che •venga assegnato un nome •venga inserito nella lista dei processi conosciuti •venga assegnata una priorità iniziale •venga creato il PCB •vengano allocate le risorse iniziali •Distruzione •Sospensione •Ripresa •Cambiamento della priorità •Blocco •Risveglio Processi 7 •Assegnazione della CPU al processo Interruzioni (Interrupt) Un Interrupt è un evento che modifica la sequenza con cui il processore esegue le istruzioni Quando si verifica un interrupt, il sistema operativo: •Acquisisce il controllo •Salva lo stato del processo interrotto •Analizza l’interrupt e passa il controllo alla routine che lo può gestire adeguatamente Processi 8 Tipi di Interrupt … •Supervisor Call (SVC): è eseguito da un processo che si trova nello stato di running e che richiede un servizio di sistema (ad es. operazioni di I/O, maggiore memoria, operazioni su altri processi, …) •Interrupt di I/O : è eseguito da un dispositivo hardware di input o output, quando, ad es., è finita un’operazione di I/O, quando si è verificato un errore, quando un dispositivo periferico è pronto, … •Interrupt Esterno: è causato da eventi esterni, come ad es. la fine di un time slice, l’interruzione richiesta dall’utente, … Processi 9 … Tipi di Interrupt •Restart Interrupt: avviene quando l’utente o un altro processore (in un sistema multiprocessor) richiede che il processo ricominci la propria esecuzione •Program Check Interrupt: è causato da errori nell’esecuzione del processo •Machine Check Interrupt: è causato da errori hardware Processi 10 Processi in Foreground e in Background … Normalmente, i processi vengono eseguiti in Foreground, cioè vengono eseguiti in modo tale che: •siano lanciati dagli utenti on-line •durante la loro esecuzione non è possibile lanciare altri processi •ricevano input dallo standard input •producano l’output sullo standard output Processi 11 … Processi in Foreground e in Background Sia UNIX che LINUX permettono anche di eseguire processi in Background, cioè processi tali che durante la loro esecuzione è possibile lanciare altri processi I processi in background possono essere eseguiti anche se l’utente si scollega dal sistema e conclude la sessione di lavoro Processi 12 Operazioni sui Processi Processi 13 Creazione … I processi sono creati con la primitiva di sistema fork L’effetto è la duplicazione del processo corrente (processo padre) in due processi indipendenti: il padre e il processo figlio I due processi condividono le risorse precedentemente assegnate al processo padre, ad eccezione della memoria. La chiamata alla primitiva fork restituisce al processo padre il valore dell’identificatore del processo figlio e al processo figlio il valore 0 Processi 14 … Creazione Esempio: #include <sys/types.h> #include <unistd.h> pid_t child_pid; child_pid = fork(); if(child_pid == -1) { ERROR; } else if(child_pid == 0) { do_child(); } else { do_parent(); } Processi 15 Esecuzione … La primitiva fork permette di creare il processo ma non permette l’esecuzione Per eseguire un processo precedentemente creato è necessario invocare la primitiva execl Processi 16 … Esecuzione Esempio: child_pid = fork(); if(child_pid == -1) ERROR; if(child_pid == 0) { // Child executes a new program image execl("/bin/view", "view", "/etc/hosts"); ERROR; } else { // Parent waits for child to finish int status; while(wait(&status) != child_pid); } Processi 17 Informazioni sui Processi in Esecuzione … Il comando ps permette di ottenere informazioni relative ai processi in esecuzione, e precisamente, restituisce: •PID •TTY (codice di identificazione del terminale da cui è stato creato il processo) •STAT (stato del processo) •TIME •COMMAND (riga di comando con cui è stato fatto partire il processo) Processi 18 … Informazioni sui Processi in Esecuzione Le opzioni con cui si può eseguire il comando ps sono: •-a mostra anche i processi degli altri utenti •-x mostra anche i processi non gestiti da un terminale Processi 19 Terminazione Per terminare l’esecuzione di un processo esiste la funzione exit. La sintassi è exit (int status) dove status permette al processo terminato di comunicare al padre informazioni relative al suo stato di terminazione Tra gli effetti della exit si ha la chiusura di tutti i file aperti purché non condivisi Processi 20 Distruzione La distruzione di un processo avviene mediante il comando kill La sintassi è la seguente kill –9 pid Dove –9 indica la chiusura del processo identificato da PID e di tutti i processi figlio Processi 21 Sincronizzazione La sincronizzazione tra processi avviene mediante la primitiva wait che permette di porre un processo in stato di attesa fino al verificarsi di un certo evento (un esempio è stato visto precedentemente) Processi 22 Sospensione di un Processo Per sospendere l’esecuzione di un processo è sufficiente premere i tasti CTRL Z Come effetto il sistema “congela” l’esecuzione del processo. Il processo riprende ad essere eseguito quando viene invocato il comando %PID dove PID è l’identificatore del processo Processi 23 Esecuzione di un Processo in Background … Ogni processo può essere eseguito in background. A tale scopo è sufficiente aggiungere il suffisso & alla stringa di comando Ad esempio, fornendo la stringa di comando cat file_name1 file_name2 > file_name3.ext & il sistema risponde mostrando l’identificatore del processo, e quindi esegue la concatenazione dei due file file_name1 e file_name2, producendo l’output nel file file_name3 Durante l’esecuzione del processo è possibile eseguire ulteriori processi Processi 24 … Esecuzione di un Processo in Background … Per eseguire un processo in background permettendo all’utente di scollegarsi è sufficiente il comando nohup premesso al comando che invoca il processo Ad esempio la linea di comando nohup cat file1 file2 > file3.ext & ha lo stesso effetto visto precedentemente, con l’unica differenza che se l’utente si scollega prima della fine del processo, questi continua la propria esecuzione. Processi 25 … Esecuzione di un Processo in Background … Per portare in foreground un processo precedentemente lanciato in background è sufficiente usare il comando fg PID dove PID è l’identificatore del processo Processi 26 … Esecuzione di un Processo in Background Per portare in background un processo precedentemente lanciato in foreground si svolge la seguente procedura CTRL Z bg PID dove PID è l’identificatore del processo Processi 27