Gestione dei processi A. Ferrari Multiprogrammazione Tutti i Sistemi Operativi moderni sono in grado di eseguire contemporaneamente più di un programma Il numero di programmi in esecuzione è superiore al numero di processori del sistema. L’utente ha la sensazione che le proprie applicazioni siano eseguite contemporaneamente dal computer. In realtà la sensazione di contemporaneità è data dall’elevata velocità di esecuzione dei programmi da parte del computer. Esecuzione “parallela” MAC OSX Monitoraggio attività Windows Task Manager Linux System monitor Programma -> Processo Un programma è costituito dal codice oggetto generato dalla compilazione del codice sorgente E’ salvato sotto forma di uno o più file. E’ un'entità statica, che rimane immutata durante l'esecuzione. Il programma esiste indipendentemente dal computer che è in grado di eseguirlo. Un processo è definito come un’istanza di un programma in esecuzione. Al momento dell’esecuzione del programma il SO crea il processo. E’ un'entità dinamica, che dipende dai dati che vengono elaborati, e dalle operazioni eseguite su di essi. E’ caratterizzato, oltre che dal codice eseguibile, dall'insieme di tutte le informazioni che ne definiscono lo stato. Da un solo programma possono scaturire più processi distinti. Thread Un thread è una suddivisione di un processo in due o più filoni, che vengono eseguiti concorrentemente dal processore. In generale, si può dire che un thread è contenuto all'interno di un processo. Un processo ha sempre almeno un thread (se stesso), ma in alcuni casi un processo può avere più thread che vengono eseguiti in parallelo. I vari thread dello stesso processo condividono alcune risorse (lo spazio d'indirizzamento del processo), mentre processi differenti non condividono le loro risorse. I thread sono spesso utilizzati per la parallelizzazione di un programma, per sfruttare i moderni processori multi core. Processo vs Thread Processo Il processo è l'oggetto del sistema operativo a cui sono assegnate tutte le risorse di sistema per l'esecuzione di un programma, tranne la CPU. Thread Il thread è l'oggetto del sistema operativo o dell'applicazione a cui è assegnata la CPU per l'esecuzione. Un esempio Un esempio di applicazione che può far uso di più thread è un browser Web, che usa un thread distinto per scaricare ogni immagine in una pagina Web che contiene più immagini. Dual Core - multi core Una CPU dual core (doppio nucleo) unisce due processori indipendenti in un singolo package. I primi dual core sono gli IBM PowerPC del 2003. Il termine multi core si usa per descrivere una CPU composta da tre o più core: più nuclei di processori fisici montati sullo stesso package. Identificativo di processo Il Sistema Operativo assoccia a ogni processo (al momento della creazione) un identificativo numerico univoco, detto PID (Process Identifier). Ad un processo sono associate le seguenti strutture dati: Uno o più segmenti di codice. Uno o più segmenti di memoria dati. I descrittori di eventuali risorse in uso (file, finestre, periferiche, ecc.) Uno o più thread. Process control block Il Process Control Block (Blocco di Controllo del Processo) o PCB di un processo è una struttura dati del nucleo del sistema operativo che contiene le informazioni essenziali per la gestione del processo. Contenuto del PCB Program counter Area per il salvataggio dei registri Stato corrente di avanzamento del processo (Pronto, In Esecuzione, Bloccato) Identificatore unico del processo Puntatore al processo padre e ai processi figli se esistenti Livello di priorità Informazioni per la gestione della memoria Identificatore della CPU su cui è in esecuzione Informazioni per lo scheduling (gestione) del processo, come il tempo di run (esecuzione) o wait (attesa) accumulato … Informazioni sullo stato di I/O del processo Context-switching Operazioni eseguite dal SO per passare la risorsa processore da un processo ad un altro. Si interrompe momentaneamente il primo processo per riprendere temporaneamente l’esecuzione del secondo. Nel context-switching viene salvato il PCB del primo processo e caricato il PCB del secondo. CPU e context-switching Stati di un processo Ogni processo può essere in uno dei 3 stati: Pronto (ready) Il processo non è in esecuzione, ha tutte le risorse necessarie tranne la CPU Attesa (wait) (sleep) Il processo non è in esecuzione, ha invocato un servizio (es I/O) ed è in attesa di un segnale da parte di un altro processo relativo al completamento del servizio richiesto. Esecuzione (run) Il processo dispone di tutte le risorse necessarie ed è in esecuzione sulla CPU Stati di un processo Ready Wait Run Transizione 1 Il processo viene creato e posto nello stato di “pronto” (ready) Ready Wait Run Code d’attesa Più processi possono essere in stato di ready pronti per ottenere la risorsa CPU e passare in esecuzione. I processi vengono quindi messi in coda d’attesa. Transizione 2 Il Sistema Operativo seleziona uno dei processi in stato Ready e lo pone in esecuzione (run) Ready Wait Run Scheduler Lo scheduler (da to schedule letteralmente "mettere in lista”) è un programma che, dato un insieme di richieste di accesso ad una risorsa, stabilisce un ordinamento temporale per l'esecuzione di tali richieste, privilegiando quelle che rispettano determinati parametri, in modo da ottimizzare l'accesso a tale risorsa e consentire così l'espletamento del servizio. Lo short-time-scheduler (scheduler della CPU) deve garantire l’esecuzione di ogni processo, in modo ordinato, concedendo e revocando la CPU alternativamente mediante operazioni dette commutazioni di contesto tra i processi. Politiche di scheduling L'attenzione posta su alcuni parametri piuttosto che su altri, differenzia la politica di scheduling: lo scheduler può eseguire le richieste in base al loro ordine di arrivo (politica FIFO), oppure dare precedenza a quelle che impegnano per meno tempo la risorsa; possono esistere politiche che si basano su principi statistici o sulla predizione per individuare un ordinamento delle richieste che si avvicini il più possibile quello ottimale. Obiettivi dello scheduler Fairness (Equità) - processi della stesso tipo devono avere trattamenti simili Massimizzare il throughput (produttività dell'intero sistema), minimizzando i tempi in cui la risorsa è inutilizzata. Minimizza il tempo che intercorre tra l'istante in cui la richiesta è generata e quello in cui la richiesta è soddisfatta. Evitare fenomeni indesiderati come la starvation ovvero "l'attesa eterna" di alcune richieste. "Corre voce che quando fu chiuso l'IBM 7094 al MIT, nel 1973, si scoprì che un processo con bassa priorità sottoposto nel 1967 non era ancora stato eseguito". Dare all'utilizzatore del sistema la percezione che le richieste vengano soddisfatte contemporaneamente. Transizione 3 Il Sistema Operativo interrompe l’esecuzione di un processo e lo pone in stato di ready Ready Wait Run Time sharing I Sistemi Operativi moderni adottano la tenica del time-sharing per la gestione del processore. Ad ogni processo viene assegnato un “quanto” di tempo (time slice dell’ordine dei millisecondi) dopo il quale deve rilasciare il processore passando dallo stato di run a quello di ready. Preemption (prerilascio) è l'operazione in cui un processo viene temporaneamente interrotto, senza alcuna cooperazione da parte del processo stesso, al fine di permettere l'esecuzione di un altro processo. Transizione 4 Nel corso dell’esecuzione il processo richiede un servizio al Sistema Operativo e viene posto nello stato di wait Ready Wait Run Transizione 5 Il Sistema Operativo completa la richiesta di un processo che passa quindi allo stato di ready Ready Wait Run Transizione 6 Il processo termina l’esecuzione e viene distrutto dal Sistema Operativo Ready Wait Run Algoritmi di schedulazione Round-robin time-sharing e politica FIFO (First In First Out) di selezione dei processi in coda di ready Scheduling a priorità Un valore di priorità (intero) è associato a ciascun processo. La CPU viene allocata al processo con la priorità più alta Tipi di processi CPU Bound Processi che sfruttano pesantemente le risorse computazionali del processore, ma non richiedono servizi di ingresso/uscita dati al sistema operativo in quantità rilevanti. Es. i programmi di calcolo matematico, i quali necessitano spesso di un'enorme potenza di calcolo, ma sfruttano l'I/O solo all'inizio della loro vita (per caricare gli input) ed alla fine di essa (per produrre gli output). I/O Bound molti accessi alle periferiche, il processo è spesso interrotto per attendere il completamento delle richieste di I/O. P1 (CPU bound) P2 /I/O bound) P1 Lungo burst di CPU Attesa completamento I/O Corto burst di CPU P2 tempo In esecuzione In attesa