Multiprogrammazione Sistemi Operativi Giuseppe Prencipe Obiettivi (????) Avere sempre processi in esecuzione per massimizzare l’utilizzo della CPU IDEA alla base della MultiP (????) Scheduling della CPU Un processo è in esecuzione finché non deve attendere un evento Durante l’attesa la CPU NON resta inattiva, e si esegue un nuovo processo tra quelli pronti 1 Scheduling dei processi 2 Scheduling Lo scheduler si occupa di decidere quale fra i processi pronti può essere mandato in esecuzione L’algoritmo di scheduling ha impatto su: prestazioni percepite dagli utenti efficienza nell’utilizzo delle risorse della macchina Lo scheduling ha obiettivi diversi in diversi sistemi (batch, interattivi…) NOTA: quasi tutte le risorse del calcolatore vengono sottoposte a scheduling 3 4 Sequenza di CPU e I/O burst Scheduling L’ultima sequenza di operazioni della CPU si conclude con una richiesta di terminare l’esecuzione (come????) Osservazione: i processi si alternano fra due stati Ciclo d’elaborazione Attesa completamento I/O 5 1 6 Diagramma delle durate delle sequenze di operazioni della CPU Tipi di processi P1 Lungo burst di CPU Attesa completamento i/o Corto burst di CPU P2 tempo Processi compute bound (P1) and I/O bound (P2) -- durata della sequenza Curva di frequenza 7 8 Tipi di processi Tipi di processi P1 P1 P2 P2 tempo tempo Priorità agli I/O bound Priorità ai compute bound il funzionamento del sistema è più bilanciato 9 Tipi di processi 10 Scheduler della CPU Quale scheduler si occupa dello scheduling della CPU? Breve termine!!!! Due tipologie di processi : processi CPU-bound -- lunghi periodi di eleborazione fra due richieste successive di I/O processi I/O-bound -- brevi periodi di elaborazione fra due richieste successive di I/O La coda dei processi pronti può essere realizzata in vari modi, a seconda del tipo di algoritmo usato dallo scheduler Coda in ordine d’arrivo (FIFO – First In First Out) Coda con priorità Albero Lista concatenata non ordinata .... Gli elementi delle code sono generalmente i PD 11 2 12 Tipi di scheduling Tipi di scheduling Lo scheduler della CPU può interevnire quando un processo Lo scheduler della CPU può interevnire Passa da esecuzione attesa (esempio?) quando un processo Richiesta I/O o attesa terminazione figli Passa da esecuzione attesa (esempio?) Passa da esecuzione pronto (esempio?) Richiesta I/O o attesa terminazione figli Al verificarsi di un interrupt Passa da esecuzione pronto (esempio?) Passa da attesa pronto (esempio?) Al verificarsi di un interrupt Completamento I/O Passa da attesa pronto (esempio?) termina Completamento I/O termina 13 Tipi di scheduling Nessuna scelta di scheduling: si esegue un processo tra i pronti (scheduling senza diritto di 14 prerilascio – non preemptive) Tipi di scheduling Lo scheduler della CPU può interevnire Scheduling senza prerilascio quando un processo lo scheduler interviene solo quando un processo viene creato, termina o si blocca su una SC Passa da esecuzione attesa (esempio?) Richiesta I/O o attesa terminazione figli Passa da esecuzione pronto (esempio?) Scheduling con prerilascio Al verificarsi di un interrupt lo scheduler può intervenire ogni volta che è necessario per ottenere gli obiettivi perseguiti Passa da attesa pronto (esempio?) Completamento I/O termina Va fatta una scelta di scheduling: (scheduling con diritto di prerilascio – preemptive) quando diventa pronto un processo a più alta priorità rispetto a quello in esecuzione quando il processo in esecuzione ha sfruttato la CPU per un tempo abbastanza lungo 15 Problemi con prerilascio Due processi condividono dati, e mentre uno li aggiorna si ha il suo prerilascio Dispatcher È il modulo che passa il controllo della CPU al Necessari meccanismi per coordinare l’accesso a dati condivisi processo scelto dallo scheduler Si occupa Durante il servizio di una SC, il nucleo può aggiornare/modificare dati del nucleo (ad es. coda di I/O) per conto del processo invocante. Se avviene il prerilascio del processo: probelmi!!!! Del cambio di contesto Del passaggio al modo utente Dei saltare alla giusta posizione del programma utente per riavviarne l’esecuzione Alcuni SO attendono il completamento della SC o bloccano I/O prima che possa avvenire un cambio di contesto. Quindi non si ha prerilascio se le strutture dati del nucleo sono incoerenti Le interruzioni si possono verificare in ogni istante Si attiva a ogni cambio di contesto deve Le sezioni di codice delle procedure di servizio delle interruzioni devono essere protette da un uso simultaneo essere rapido, per diminuire il più possibile la latenza di dispatch Tipicamente, l’inizio della procedura di servizio consiste nel disattivare le interruzioni e le riattiva quando termina 17 3 16 18 Scheduling Scheduling Diversi algoritmi di scheduling hanno proprietà differenti Criteri per confrontare algoritmi di scheduling Utilizzo CPU Produttività (throughput): numero di processi completati nell’unità di tempo Tempo di completamento (turnaround time): intervallo che intercorre tra la sottomissione del processo e il suo completamento Tempo d’attesa: somma dei tempi passati nella coda dei processi pronti Tempo di risposta: tempo tra la sottomissione di una richiesta e la prima risposta prodotta Obiettivi principali degli Algoritmi di Scheduling: Fairness (Equità) - processi della stesso tipo devono avere trattamenti simili Balance (Bilanciamento) - tutte le parti del sistema devono essere sfruttate (CPU, dispositivi …) 19 Tipi di Scheduling 20 First—come, fisrt—served (FCFS) Scheduling in ordine d’arrivo Si realizza con una coda di PD Quando un processo entra in coda, diventa l’ultimo elemento della coda Si estraggono elementi dalla testa Tempi d’attesa medi abbastanza lunghi 21 First—come, fisrt—served (FCFS) First—come, fisrt—served (FCFS) Process Burst Time P1 24 P2 3 P3 3 Assumiamo che i processi arrivino nell’ordine: P1, P 2, P3 Lo schema di Gantt per lo schedule FCFS è P1 0 P2 24 30 Tempo d’attesa per P1 = 0; P 2 = 24; P3 = 27 Tempo d’attesa medio: (0 + 24 + 27)/3 = 17 23 4 Se i processi arrivassero nell’ordine P2 , P 3 , P 1 (????) Lo schema di Gantt è P2 0 P3 27 22 P3 3 P1 6 30 Tempo d’attesa per P1 = 6; P2 = 0; P3 = 3 Tempo d’attesa medio: (6 + 0 + 3)/3 = 3 Molto meglio!!!! Si può avere l’e ffetto convoglio 24 FCFS: effetto convoglio Effetto convoglio Si crea quando i processi CPU bound hanno priorità su quelli I/O bound (cosa che capita con FCFS) Es.: un processo CPU bound e tanti I/O bound Man mano che i processi entrano nel sistema, il processo CPU bound occupa la CPU Gli altri processi, terminano I/O e entrano in pronto: dispositivi I/O inattivi Il processo CPU bound esegue un I/O Tutti gli altri processi eseguono rapidamente le operazioni CPU e tornano alle code I/O, lasciando inattiva la CPU 25 Shortest—Job—First (SJF) Tutti i processi attendono che un lungo processo liberi la CPU La situazione migliorerebbe (come risulta dall’esempio fatto con i 3 processi) se si dà priorità ai processi brevi NOTA: Con l’FCFS non si ha prerilascio 26 Shortest—Job—First (SJF) Associa ad ogni processo la lunghezza della sua prossima sequenza CPU (CPU burst). Queste lunghezze vengono usate per dare priorità ai processi brevi 2 schemi Senza prerilascio – quando la CPU viene assegnata a un processo, non viene prerilasciato fino al termine della sequenza Con prerilascio – se arriva un processo con una sequenza CPU più corta del tempo che rimane al processo in esecuzione per terminare la sua sequenza, allora il processo corrente viene prerilasciato. Questo schema è noto con il nome di Shortest-Remaining-Time-First (SRTF). Si può dimostrare l’ottimalità dello SJF: rende minimo il tempo d’attesa medio per un dato insieme di processi Perchè? Si considerino 4 processi A,B,C,D con tempi di esecuzione a, b, c, d Turnaround (tempo di completamento) (A) -- a turnaround(B) -- a + b turnaround(C) -- a + b + c turnaround(D) -- a + b + c + d turnaround totale 4a + 3b + 2c + 1d minimo quando a, b, c, d sono in ordine crescente 27 Esempio di SJF senza prerilascio Process P1 P2 P3 P4 3 Esempio di SJF con prerilascio Arrival Time Burst Time 0.0 7 2.0 4 4.0 1 5.0 4 P1 0 P3 7 P2 8 Process P1 P2 P3 P4 P1 P4 12 0 16 Average waiting time = (0 + 6 + 3 + 7)/4 = 4 P2 2 Arrival Time 0.0 2.0 4.0 5.0 P3 4 P2 5 Burst Time 7 4 1 4 P4 7 P1 11 16 Average waiting time = (9 + 1 + 0 +2)/4 = 3 29 5 28 30 Determinare la lunghezza della successiva sequenza CPU SJF Il problema con SJF è che non esistono metodi per conoscere la lunghezza della successiva sequenza di operazioni CPU Si stima la lunghezza del successivo CPU burst calcolando la media esponenziale delle effettive lunghezze delle precedenti sequenze di operazioni della CPU. Siano t n = Lunghezza dell’n-esimo CPU burst Informazioni recenti Spesso viene utilizzato come scheduling a lungo termine Un possibile modo per usare SJF è quello di τ n+1 = valore previsto per il successivo CPU burst approssimarlo, cercando di predire il valore della lunghezza della sequenza di operazioni CPU Storia passata 0≤α≤1 Peso relativo tra storia recente e passata Osservazione: è probabile che sia simile alle precedenti τn+1 = α tn + (1- α) τn 31 Predizione lunghezza successivo CPU burst 32 Predizione α =0 τn+1 = τn Storia recente non conta α =1 τn+1 = tn Solo l’ultimo CPU burst conta Se espandiamo la formula, otteniamo τn+1 = α tn+(1 - α) α tn-1 + … +(1 - α )j α tn-j + …+(1 - α )n+1τ0 Dato che sia α che (1 - α) sono ≤ 1, ogni termine α=1/2 ha peso minore o uguale a quello del suo predecessore 33 Scheduling con priorità Ogni processo ha una priorità La CPU è assegnata al processo con priorità maggiore (smallest integer ≡ highest priority) 34 Scheduling con priorità Quali tra gli algoritmi di scheduling visti finora è a priorità???? SJF Preemptive Non-preemptive Punti chiave : come assegnare le priorità (statiche, dinamiche…) come evitare attesa indefinita della CPU nei processi a priorità più bassa come individuare i processi I/O bound Lavori con lungo CPU burst: priorità bassa Lavori con corto CPU burst: priorità alta per elevare la loro priorità 35 6 36 Scheduling con priorità Scheduling con priorità Molte strategie per il calcolo della priorità Tipicamente : Problema ≡ Starvation – processi a bassa priorità dinamica (es. più elevata per i processi che passano da bloccato a pronto) legata alla percentuale f del quanto di tempo che è stato consumato l’ultima volta che il processo è andato in esecuzione priorità potrebbero non essere mai eseguiti Soluzione ≡ Aging – con il passare del tempo, la priorità dei processi aumenta 37 Scheduling Round Robin (sistemi interattivi) Ogni processo ottiene la CPU per un quanto di 38 Scheduling Round Robin tempo, tipicamente 10-100 millisecondi. Dopo questo periodo, il processo è prerilasciato e messo nella coda dei pronti (realizzata FIFO) Se ci sono n processi nella coda dei pronti, e il quanto dura q, allora ogni processo ottiene 1/n del tempo CPU in blocchi di al più q unità di tempo Nessun processo attende più di (n-1)q unità di tempo Performance q grande ⇒ FCFS q piccolo ⇒ q deve essere grande rispetto alla durata del cambio di contesto (a) lista dei processi pronti (b) lista dei pronti dopo che B ha usato il suo quanto (quantum) di tempo 39 40 Esempio di RR con q = 20 Scheduling Round Robin Process P1 P2 P3 P4 Come fissare il quanto di tempo deve essere abbastanza lungo da ammortizzare il costo di un context switch (ordine 1 ms) deve essere abbastanza breve da permettere una risposta veloce agli utenti interattivi 0 RR non favorisce i processi I/O bound È uno scheduling con prerilascio???? P2 20 37 P3 P4 57 P1 77 P3 97 117 P4 P1 P3 P3 121 134 154 162 Tipicamente, si ha un tempo d’attesa medio maggiore del SJF, ma un migliore tempo di risposta 41 7 P1 Burst Time 53 17 68 24 42 Quanto e cambio di contesto Tempo di completamento e quanto 43 Sistemi interattivi: Round Robin+Priority È possibile combinare RR e priorità Es.: sia P un processo I/O bound. CPU burst di P sono più corti del quanto di tempo. Se P è pronto, dovrebbe essere eseguito. Quindi si assegna a P alta priorità “La priorità associata a un processo I/O bound è 1/f, con f la frazione del quanto di tempo utilizzata dal processo” 44 Scheduling – sommario Scheduling in sistemi batch (insieme dei job da schedulare tipicamente noto a priori) SJF (shortest job first) Scheduling in sistemi interattivi Round Robin Code Multiple 45 46 Scheduling con code multiple Scheduling con code multiple La coda di pronti è partizionata in code separate, a seconda dei tipi di processi In primo piano (foreground o interattivi) In sottofondo (background o batch) Ogni coda utilizza il proprio algoritmo di scheduling foreground – RR o priorità background – FCFS È necessario uno scheduling tra le varie code A priorità fissa (prima i foreground e poi i background): possibilità di starvation Time slice – ogni coda ottiene una certa quantità di CPU che schedula tra I suoi processi. Es.: 80% ai foreground in RR, e 20% ai background in FCFS 47 8 48 Scheduling con Code multiple Scheduling con Code multiple Scheduling Round Robin all’interno della classe con priorità più elevata Alcuni sistemi danno quanti più lunghi ai Esempio di algoritmo di scheduling a code multiple con 4 classi di priorità processi nelle classi basse (compute-bound) per minimizzare l’overhead del cambio di contesto Tipicamente i processi sono assegnati in modo permanente alle code 49 Code multiple con retroazione (feedabck) 50 Esempio di Multilevel Feedback Queues Un processo può cambiare coda Sono caratterizzate dai seguenti parametri Numeri di code Algoritmi di scheduling per ogni coda Metodo usati per “upgrade” di un processo Metodo usati per spostare in basso un processo Metodo usato per determinare in quale coda inserire un processo che richiede un servizio 51 3 code Q0 – quanto di 8 millisecondi Q1 – quanto di 16 millisecondi Q2 – FCFS Lo scheduler esegue tutti i lavori in Q0, poi quelli in Q1 e infine quelli in Q2 Un processo in ingresso in Q1 ha la prelazione su quelli in Q2, e uno in ingresso in Q0 ha prelazione su quelli in Q1 Un nuovo lavoro entra in Q0 (servito FCFS). Quando ottiene la CPU, viene eseguito per 8 millisec. Se non termina, viene messo in Q1 In Q1 (servito FCFS) riceve altri 16 millisec. Se ancora non termina, viene spostato in Q2 52 Scheduling per multi processore Multilevel Feedback Queues Lo scheduling della CPU diviene più complesso quando più CPU sono disponibili Si considerano i sistemi omogenei: qualunque unità può essere usata per eseguire qualsiasi processo in coda Condivisione del carico Invece di usare una coda per ogni processore (qualche coda potrebbe risultare vuotaprocessore inattivo) si usa un’unica coda dei pronti Due criteri di scheduling Ogni processore può esaminare la coda e scegliere il processo da eseguire Bisogna porre attenzione ai problemi derivanti da accessi a una struttura dati comune Quindi, a quale tipo di processo viene data la priorità???? Spingendosi oltre si ha la multielaborazione simmetrica: tutte le decisioni di scheduling, elaborazione delle op. di I/O e le altre attività di sistema sono svolte da un’unica unità (master server); le altre eseguono solo codice 53 9 Due processori non possono scegliere lo stesso processo I processi non devono essere perduti dalla coda Si fissa un processore responsabile dello scheduling 54 Scheduling per sistemi real-time Latenza di dispatch Hard real-time: garantiscono il completamento delle funzioni critiche entro un tempo definito I processo dichiarano il tempo entro cui devono completare le proprie funzioni Lo scheduler deve conoscere esattamente la durata dell’esecuzione di qualsiasi tipo di funzione del sistema Sono specifici in applicazioni industriali Soft real-time: richiedono che i processi critici abbiano una priorità maggiore di quelli multimediali, grafica interattiva) ordinari (applicazioni Scheduling a priorità I processi critici devono avere priorità fissa (non variabile nel tempo): niente aging per i processi critici Latenza di dispatch deve essere bassa (processi critici pronti devono passare presto in esecuzione) Le chiamate di sistema devono poter subire il prerilascio (punti di prerilascio nelle SC lunghe: in questi punti il SO verifica la presenza di processi critici da eseguire. Questi punti devono essere collocati in punti “sicuri” del codice) L’intero nucleo può subire prerilascio (Solaris 2) 55 Valutazione degli algoritmi Modelli deterministici: fornisce una valutazione analitica dell’algoritmo. Cioè, dato un algoritmo e un carico di lavoro del sistema, fornisce una formula che valuta le prestazioni dell’algoritmo per quel carico di lavoro Molto specifica e richiede conoscenze troppo dettagliate Reti di code: tipicamente è impossibile determinare un insieme (statico) di processi da usare nei modelli deterministici (I processi variano!!!!). Però è possibile determinare le distribuzioni delle sequenze di operazioni CPU e I/O, perché si possono misurare e/o stimare 56 Reti di code Il sistema si descrive come una rete di unità serventi, ciascuna con una coda d’attesa Se sono noti l’andamento degli arrivi e dei servizi, si possono calcolare l’utilizzo, la lunghezza media delle code e il tempo medio d’attesa (analisi delle reti di code) Es.: siano n: lunghezza media di una coda W: tempo medio d’attesa in coda, e λ l’andamento medio d’arrivo dei nuovi processi in coda Durante W , quanti nuovi processi arrivano in coda???? λW Se il sistema è stabile, il numero dei processi che escono dalla coda è uguale an numero dei processi che entrano, quindi n= ???? λW (formula di Little) Si utilizza per calcolare una delle tre variabili, note le altre due È comunuqe complicato fornire distribuzioni realistiche 57 Valutazione tramite simulazioni 58 Valutazione tramite simulazioni Per avere valutazioni più precise si usano simulazioni I dati (utilizzo CPU, I/O, arrivi in coda, terminazioni, ecc) si possono ottenere tramite numeri generati casualmente (utilizzando varie distribuzioni: uniforme, Poisson, esponenziale) Oppure tramite trace tape 59 10 60 Scheduling dei Thread Valutazione tramite realizzazione Costi alti Lo scheduling dei thread utilizza algoritmi simili a quelli visti finora viene implementato in modo diverso nel thread a livello utente e a livello kernel 61 62 Scheduling thread user-level Scheduling dei Thread Lo scheduling dei thread user level il SO non conosce l’esistenza dei thread, quindi schedula i processi durante l’esecuzione di un processo lo schedulatore della libreria dei thread decide quale thread mandare in esecuzione le interruzioni del clock non sono visibili allo schedulatore di livello utente lo schedulatore può intervenire solo se invocato esplicitamente (es. thread_yield) non c’è prerilascio (all’interno di un singolo processo) Possible scheduling of user-level threads 50-msec process quantum threads run 5 msec/CPU burst 63 64 Scheduling thread kernel-level Scheduling dei Thread Lo scheduling dei thread kernel level il SO schedula i thread (non i processi) quando un thread si blocca il SO può decidere di mandare in esecuzione un altro thread di quel processo o un thread di un processo diverso può scegiere se pagare il cambio di contesto o no le interruzioni del clock permettono allo schedulatore di tornare in esecuzione alla fine del quento di tempo i quanti di tempo sono assegnati direttamente ai thread si può effettuare prerilascio Possible scheduling of kernel-level threads 50-msec process quantum threads run 5 msec/CPU burst 65 11 66 Per oggi basta.... 67 12