Scheduling multiprocessore
Scheduling real-time
Accoppiamento lasco
Collezione di sistemi autonomi collegati in rete, ogni processore ha la sua memoria e i suoi canali di I/O (ad es., cluster o supercomputer, non trattati in questo corso).
Accoppiamento stretto
Insieme di processori che condividono la stessa memoria e sono sotto il controllo di un singolo sistema operativo (ad es., SMP).
Assegnazione dei processi ai processori.
Uso del multitasking sui singoli processori.
Dispatching dei processi.
L’approccio da seguire dipende dal grado di sincronizzazione e dal numero di processori.
Assegnazione statica: ogni processo o thread è assegnato permanentemente ad uno dei processori.
Assegnazione dinamica: durante la sua vita un processo può eseguire su processori differenti, utilizzando:
Approccio master/slave: il kernel esegue su un solo processore, detto master, responsabile dello scheduling; gli altri (slave) possono eseguire solo processi utente.
Approccio peer: il kernel esegue su tutti i processori; ogni processore gestisce autonomamente lo scheduling.
I singoli processori devono essere multiprogrammati?
Nel caso di grado di sincronizzazione indipendente o coarse grain, è conveniente che ogni processore esegua più processi o thread in concorrenza.
Nel caso di sincronizzazione medium grain è meglio che processi o thread costituenti un’applicazione eseguano contemporaneamente su tutti i processori disponibili.
Nei sistemi multiprocessore le prestazioni dipendono meno dalla politica di scheduling adottata.
Un approccio semplice può portare a buoni risultati e minor overhead.
Nei sistemi mono-processore i thread sono usati per strutturare meglio i programmi e per consentire il paral-lelismo tra CPU e I/O nell’ambito di uno stesso processo.
Nei sistemi multiprocessore i thread possono essere usati per sfruttare a pieno il parallelismo presente in un processo.
Thread dispatching:
Approccio su cui è basato lo scheduler del Mach OS.
I thread “ready” sono memorizzati in un’unica coda globale, condivisa da tutti i processori.
Appena un processore diviene libero, preleva un thread dalla coda e lo esegue.
Diverse politiche di selezione dei thread dalla coda:
Il carico è distribuito equamente tra i processori.
Non è necessario un controllo centralizzato dello scheduling (può essere adottato un approccio peer).
Quando un processore diviene disponibile, l’algoritmo di scheduling può essere eseguito direttamente dal quel processore.
La coda condivisa occupa una regione di memoria che deve essere protetta da accessi concorrenti (mutua esclusione).
Non è detto che i thread bloccati o prelazionati riprendano l’esecuzione sullo stesso processore.
Siccome tutti i thread sono trattati allo stesso modo, è poco probabile che i thread di uno stesso processo vengano eseguiti contemporaneamente su più processori.
La politica di scheduling si applica a gruppi di thread.
Thread fortemente correlati tra loro eseguono in parallelo, con un notevole guadagno prestazionale:
Politica utile per le applicazioni con grado di sincronizzazione medio e/o fine (ad es., rendering 3D).
Come assegnare i processi ai processori?
Assegnazione uniforme:
Assegnazione pesata
La correttezza del sistema non dipende solo dal risultato di una computazione ma anche dal tempo in cui il risultato viene prodotto.
In genere i processi real-time, o task, devono reagire ad eventi esterni al sistema in “tempo reale”.
In altre parole i task, a seguito di eventi esterni, devono compiere un’elaborazione entro un certo tempo D, denominato deadline.
Con riferimento alla deadline si possono avere:
I task possono essere:
Determinism
Le operazioni sono eseguite entro un intervallo di tempo T predeterminato. Il tempo di attesa di un task nel sistema non può superare soglie predeterminate.
Spesso misurato come tempo che intercorre dalla ricezione di un interrupt a quando il servizio inizia.
Responsiveness
Il tempo di servizio di un task non può superare una certa soglia.
User control
L’utente può specificare la priorità di un task, indicare se una pagina può essere soggetta a swapping o no e selezionare gli algoritmi da utilizzare (l’utente è parte attiva del sistema).
Reliability
Tecniche di ridondanza possono da sole non essere sufficienti per i sistemi RT. Il sistema, in presenza di fallimenti, deve degradare il servizio in maniera predeterminata.
Fail-soft operation
La capacità di un sistema di fallire “dolcemente”, cercando di preservare la consistenza dello stato e delle risorse del sistema.
Stability. Anche in presenza di guasti il sistema deve portare a termine i task a più alta priorità.
Context-switch ottimizzato.
Il SO deve essere “snello” e veloce (l’overhead deve essere quanto più basso è possibile).
Un sistema delle interruzioni veloce ed affidabile (in modo da rispondere ad eventi esterni il più veloce possibile).
IPC ottimizzato.
Scheduling Preemptive basato su priorità.
Static table-driven
Lo scheduling avviene a runtime in base ad una analisi statica preliminare per determinare uno schedule fattibile.
Static priority-driven preemptive
L’analisi statica viene usata per assegnare delle priorità ai task, in modo da usare uno scheduler tradizionale a priorità.
Dynamic planning-based
La fattibilità è determinata a run-time, all’arrivo dei task.
Dynamic best effort
Non viene fatta alcuna analisi di fattibilità. Il sistema prova a soddisfare tutte le deadline e abortisce i task la cui deadline è scaduta.
In un sistema time-triggered, il sequenziamento temporale dei vari tasks viene stabilito a priori da strumenti off-line e memorizzato in una Task Descriptor List (TDL) che contiene lo scheduling ciclico per tutti i task, considerando anche le relazioni di dipendenza.
Un dispatcher viene attivato da un clock sincrono che invoca le azioni che sono pianificate per l’istante corrente nelle TDL.
Per i task sporadici si stabilisce di controllare periodicamente l’eventuale presenza (i task sporadici vengono trattati come caso degenere di task periodici).
Dynamic best effort
Static priority-driven preemptive
Parametri di ogni task
Modello Semplificato
Limite di utilizzo del sistema
La priorità è assegnata in base al periodo del task (priorità massima ai task con periodo più corto)
E’ possibile dimostrare che, utilizzando l’algoritmo RMS, esiste un limite superiore all’utilizzo del sistema al variare del numero di task n:
U ≤ n(2 1/n -1) Tende a ln 2 ≈ 0.693
Questo limite può essere utilizzato per effettuare dei test di schedulabilità di un insieme di task.
Sono schedulabili?
U1 + U2 + U3=0.753 ≤ 3 (21/3-1)=0.779
OK
La maggior parte dei sistemi RT ha anche componenti non RT (o soft RT) e pertanto con l’RMS si possono ottenere utilizzi medi maggiori del 90%.
L’algoritmo RMS è più stabile di quello EDF nel caso di sistemi in cui l’occorrenza di un errrore comporti la variazione delle deadline di alcuni task.
Deadline monotonic
Può accadere in qualunque scheduling a prelazione basato a priorità.
Indica quella circostanza in cui il sistema forza un task ad alta priorità ad attenderne uno a più bassa.
La durata di questa attesa può essere impredicibile.
I task a bassa priorità ereditano la priorità dei task ad alta priorità bloccati sulla risorsa che condividono, nel tempo in cui permangono nella sezione critica
I task a bassa priorità ereditano la priorità dei task ad alta priorità bloccati sulla risorsa che condividono, nel tempo in cui permangono nella sezione critica.
1. Introduzione ai Sistemi Operativi
5. Scheduling nei sistemi mono-processore
6. Threads, SMP
8. Scheduling Multiprocessore e Real-Time
9. Gestione dei processi nei sistemi operativi Unix/Linux e Window...
10. Introduzione alla Programmazione Concorrente
11. Sincronizzazione nel modello ad ambiente globale
12. Problemi di cooperazione nel modello ad ambiente globale
14. Sincronizzazione nel modello ad ambiente locale
15. Deadlock
16. Programmazione Multithread
18. Memoria Virtuale
20. Il File System
21. Primitive di sincronizzazione nel kernel Linux
22. Esercitazione: System call per la gestione dei processi
23. Esercitazione: Inteprocess Communication e Shared Memory
24. Esercitazione: System Call per la gestione dei semafori in Linu...
25. Esercitazione: Problema dei Produttori e dei Consumatori
26. Posix Threads
Stallings, “Operating Systems” 6th ed., par. 10.1 e 10.2