Processi Concetto di processo Scheduling dei processi Operazioni sui processi Processi cooperanti Comunicazioni fra processi Sistemi Operativi
Concetto di processo Un sistema operativo esegue vari programmi: Sistemi batch: job Sistemi time-sharing: programmi utente o task I libri di testo impiegano indifferentemente il termine job o processo. Processo – un programma in esecuzione; l’esecuzione di un processo deve avvenire in modo sequenziale. Un processo include: il program counter lo stack una sezione di dati Sistemi Operativi
Stato del processo Mentre viene eseguito un processo cambia stato Nuovo (new): Il processo viene creato. In esecuzione (running): Le istruzioni vengono eseguite. In attesa (waiting): Il processo è in attesa per qualche evento che deve avvenire. Pronto (ready): Il processo è in attesa di essere assegnato ad un processore. Terminato (terminated): Il processo ha finito l’esecuzione. Sistemi Operativi
Process Control Block (PCB) Contiene le informazioni associate ad un processo. Stato del processo Program counter Registri della CPU Informazioni sullo scheduling della CPU Informazioni sulla gestione della memoria Informazioni di contabilizzazione delle risorse Informazioni sullo stato di I/O Sistemi Operativi
Switch della CPU da processo a processo Sistemi Operativi
Code per lo scheduling di processi Coda dei job – Insieme di tutti i processi presenti nel sistema. Coda dei processi pronti – Insieme di tutti i processi pronti ed in attesa di esecuzione, che risiedono i memoria. Code dei dispositivi – Insieme di processi in attesa per un dispositivo di I/O. I processi si “spostano” fra le varie code. Sistemi Operativi
Tipi di scheduler Scheduler a lungo termine (o scheduler dei job) – seleziona quali processi devono stare nella coda dei processi pronti. Scheduler a breve termine (o scheduler della CPU) – seleziona quali processi debbano essere eseguiti successivamente, ed alloca la CPU. Scheduler a medio termine (swapping) – rimozione dei processi dalla memoria (e dalla contesa per la CPU) e riduzione del grado di multiprogrammazione. Sistemi Operativi
Tipi di scheduler Lo scheduler a breve termine viene chiamato molto spesso (millisecondi) deve essere veloce. Lo scheduler a lungo termine viene chiamato raramente (secondi, minuti) può essere lento (ma efficiente). Lo scheduler a lungo termine controlla il grado di multiprogrammazione. I processi possono essere descritti come: Processo I/O-bound – impiega più tempo effettuando I/O rispetto al tempo impiegato per elaborazioni (in generale, si hanno molti burst di CPU di breve durata). Processo CPU-bound – impiega più tempo effettuando elaborazioni (in generale, si hanno pochi burst di CPU di lunga durata). Sistemi Operativi
Context Switch Quando la CPU passa da un processo all’altro, il sistema deve salvare lo stato del vecchio processo e caricare lo stato precedentemente salvato per il nuovo processo. Il tempo di context-switch è un sovraccarico; il sistema non lavora utilmente mentre cambia processo. Il tempo dipende dal supporto hardware. Sistemi Operativi
Creazione di processi Il processo padre crea processi figli che, a loro volta, creano altri processi, formando un albero di processi. Condivisione di risorse (possibilità) Il padre e il figlio condividono tutte le risorse. Il figlio condivide un sottoinsieme delle risorse del padre. Il padre e il figlio non condividono risorse. Esecuzione Il padre e il figlio vengono eseguiti concorrentemente. Il padre attende fino al termine del processo figlio. Spazio degli indirizzi Il processo figlio è un duplicato del processo padre. Nel processo figlio è stato caricato un programma. Esempio UNIX: la chiamata fork crea un nuovo processo, la chiamata execve viene impiegata dopo una fork per rimpiazzare lo spazio di memoria del processo con un nuovo programma. Sistemi Operativi
Un albero di processi in un tipico sistema UNIX Sistemi Operativi
Terminazione di un processo Il processo esegue l’ultima istruzione e chiede al sistema operativo di essere cancellato per mezzo di una specifica chiamata di sistema (exit in UNIX) che compie le seguenti operazioni: Può restituire dei dati (output) al processo padre (wait). Le risorse del processo vengono liberate. Un padre può terminare l’esecuzione di processi figli (abort) per diversi motivi: Il figlio ha ecceduto nell’uso di alcune risorse. Il compito assegnato al figlio non è più richiesto. Il padre termina. Il sistema operativo non consente ad un figlio di continuare se suo padre è terminato. Questo fenomeno è detto terminazione a cascata e dipende dal SO. Sistemi Operativi
Processi cooperanti Un processo è indipendente se non può influire su altri processi nel sistema o esserne influenzato. Processi cooperanti possono influire su altri processi o esserne influenzati Vantaggi della cooperazione fra processi Condivisione di informazioni Accelerazione del calcolo Modularità Convenienza Sistemi Operativi
Problema produttore–consumatore E’ un paradigma classico per processi cooperanti. Il processo produttore produce informazioni che vengono consumate da un processo consumatore. Buffer illimitato: non vengono posti limiti pratici alla dimensione del buffer. Buffer limitato: si assume che la dimensione del buffer sia fissata. Sistemi Operativi
Soluzione con buffer limitato e memoria condivisa Dati condivisi var n; type item = … ; var buffer: array [0..n–1] of item; in, out: 0..n–1; Processo produttore repeat … produce un elemento in nextp while in+1 mod n = out do no-op; buffer [in] := nextp; in := in+1 mod n; until false; Sistemi Operativi
Soluzione con buffer limitato Processo consumatore repeat while in = out do no-op; nextc := buffer [out]; out := out+1 mod n; … consuma l’elemento in nextc until false; La soluzione è corretta, ma lo schema permette di avere al massimo n -1 elementi contemporaneamente contenuti nel buffer. Sistemi Operativi
Thread Un thread (o lightweight process, LWP) è l’unità di base di utilizzo della CPU e consiste di : Program counter Insieme dei registri Spazio dello stack Un thread condivide con i thread ad esso associati: sezioni di codice sezioni dati risorse del sistema operativo L’insieme dei tread e dell’ambiente da essi condiviso è chiamato task. Un processo tradizionale, o heavyweight corrisponde ad un task con un solo thread Sistemi Operativi
Thread In un task con più thread, mentre un thread è blocccato e in attesa, un secondo thread nello stesso task può essere in esecuzione. La cooperazione di più thread nello steso job fornisce un più grande throughput e prestazioni migliorate. Applicazioni che richiedono la condivisione di un buffer comune (es. produttore-consumatore) traggono beneficio dall’impiego di thread. I thread forniscono un meccanismo che permette a processi sequenziali di effettuare chiamate di sistema bloccanti ottenendo allo stesso tempo un’esecuzione parallela. Alcuni sistemi supportano i thread a livello di kernel (OS/2). Thread a livello di utente: supportato sopra al kernel, per mezzo di chiamate di libreria a livello utente. Approcci ibridi implementano thread sia a livello di kernel che a livello utente (Solaris 2). Sistemi Operativi
Interprocess Communication (IPC) Meccanismo per la comunicazione e sincronizzazione fra processi. Sistema di messaggi – i processi comunicano fra di loro senza far uso di variabili condivise. IPC consente due operazioni: send(messaggio) – la dimensione del messaggio può essere fissa o variabile receive(messaggio) Se P e Q vogliono comunicare, hanno bisogno di: stabilire un canale di comunicazione fra di loro scambiare messaggi per mezzo di send e receive Implementazione del canale di comunicazione fisica (es. memoria condivisa, bus hardware) logica (es. proprietà logiche) Sistemi Operativi
Informazioni di implementazione Come vengono stabiliti i canali (connessioni)? Si può assegnare un canale a più di due processi? Quanti canali possono esserci fra ciascuna coppia di processi comunicanti? Qual è la capacità di un canale? Dimensione del messaggio che può gestire un canale fissa o variabile? Canale monodirezionale o bi-direzionale? Sistemi Operativi
Comunicazione diretta I processi devono “nominare” esplicitamente i loro interlocutori: send (P, messaggio) – invia un messaggio al processo P receive(Q, messaggio) – riceve un messaggio dal processo Q Proprietà del canale di comunicazione I canali vengono stabiliti automaticamente. Un canale è associato esattamente a due processi. Tra ogni coppia di processi comunicanti esiste esattamente un canale. Il canale può essere unidirezionale, ma usualmente è bidirezionale. Sistemi Operativi
Comunicazione indiretta I messaggi vengono inviati a delle mailbox (indicate anche come porte) e da esse ricevuti. Ciascuna mailbox è idendificata con un unico id. I processi possono comunicare solamente se condividono una mailbox. Proprietà dei canali di comunicazione: Un canale viene stabilito solo se i processi hanno una mailbox in comune Un canale può essere associato a più di un processo. Ogni coppia di processi può condividere più canali di comunicazione. I canali possono essere unidirezionali o bidirezionali. Operazioni creare una nuova mailbox inviare e ricevere messaggi attraverso la mailbox distruggere una mailbox Sistemi Operativi
Comunicazione indiretta Condivisione di mailbox P1, P2, e P3 condividono la mailbox A. P1, invia; P2 e P3 ricevono. Chi prende il messaggio? Soluzioni Permettere ad un canale di essere associato ad al più due processi. Permettere ad un solo processo alla volta di eseguire un’operazione di ricezione. Permettere al sistema di selezionare arbitrariamente il ricevente. Il sistema può comunicare l’identità del ricevente al trasmittente. Sistemi Operativi
Buffering La coda dei messaggi legati ad un canale può essere implementata in tre modi. 1. Capacità zero – il canale non può avere messaggi in attesa al suo interno. Il trasmittente deve attendere che il ricevente abbia ricevuto il messaggio (rendezvous). 2. Capacità limitata – lunghezza finita: n messaggi. Il trasmittente deve attendere se il canale è pieno. 3. Capacità illimitata – lunghezza infinita. Il trasmittente non attende mai. Sistemi Operativi
Condizioni di eccezione Terminazione del processo Messaggi perduti Messaggi alterati Sistemi Operativi
Thread supportati sotto Solaris 2 Solaris 2 è una versione di UNIX con supporto per thread a livello kernel e utente, con multprocessing simmetrico, e scheduling in tempo reale. LWP – è ad un livello intermedio fra thread di utente e thread di kernel. Requisiti di risorse a seconda dei tipi di thread: Kernel thread: piccola struttura dati e uno stack; il cambiamento di thread non richiede di cambiare le informazioni di accesso alla memoria. Relativamente veloce. LWP: PCB con dati dei registri, informazioni di contabilizzazione e informazioni di memoria. Cambiamento fra LWP è relativamente lento. User–level thread: ha bisogno solamente dello stack e del program–counter; non essendo impiegato il kernel, è più veloce. Il kernel vede solo LWP che supportano thread a livello utente. Sistemi Operativi
Thread di Solaris 2 Sistemi Operativi