



























Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
In dettaglio il cpu scheduling nei sistemi operativi, con un focus particolare sui sistemi multitasking e multiprocessore. Vengono analizzati gli algoritmi di scheduling, come rr, fcfs e sjf, e le loro implementazioni in contesti monoprocessore e multiprocessore. Il documento evidenzia l'importanza di massimizzare l'efficienza del sistema attraverso la gestione della cpu e della memoria, affrontando temi come la starvation, l'affinità e i sistemi numa. Inoltre, vengono discusse le classi di scheduling in linux, come cfs e rt schedule class, e i meccanismi di retroazione per ottimizzare le prestazioni del sistema. L'obiettivo principale è fornire una comprensione approfondita delle strategie di scheduling utilizzate per gestire i processi e allocare le risorse della cpu in modo efficiente.
Tipologia: Appunti
1 / 35
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!




























L'obiettivo dello scheduling è decidere quale processo, tra quelli pronti, deve ottenere l'accesso alla CPU e per quanto tempo. L’esecuzione di un processo non è un'attività continua, ma un' alternanza di due fasi :
Questo diagramma mette insieme tutti i pezzi e mostra il ciclo di vita di un processo all'interno del sistema.
Individuiamo Tre tipologie di Scheduler
Il suo compito non è decidere chi usa la CPU adesso, ma chi ha il permesso di entrare nel sistema e competere per le risorse. il Job Scheduler gestisce la transizione di un processo dallo stato new allo stato ready. La sua funzione principale è controllare il grado di multiprogrammazione , ovvero quanti processi sono attivi in memoria contemporaneamente. Prima di ammettere un nuovo processo, si pone una domanda fondamentale: "C'è abbastanza memoria e risorse per un altro processo, o l'aggiunta di questo nuovo processo rallenterà tutti gli altri?". Il termine "trashing" si riferisce a una situazione in cui la memoria è così piena che il sistema passa più tempo a spostare dati tra RAM e disco (swapping) che a eseguire lavoro utile, causando un crollo delle prestazioni. Il Job Scheduler deve evitare questo. Se la risposta è sì e c'è spazio, lo scheduler seleziona uno o più processi dalla "coda dei lavori" (processi su disco in attesa di essere eseguiti). Una volta scelto un processo, il Job Scheduler lo carica in memoria, inserisce il suo descrittore (il PCB - Process Control Block) nella ready queue (coda dei pronti), e ne cambia lo stato da new a ready Da questo momento in poi, il processo è ufficialmente "dentro" il sistema e sarà gestito dallo scheduler a breve termine (CPU scheduler) per ottenere l'accesso alla CPU. Non si occupa di performance istantanee, ma della stabilità e performance complessiva del sistema a lungo termine, mantenendo un mix equilibrato di processi.
nell'area swapped-out processes su disco. Successivamente, lo riprende da lì e lo reinserisce nella ready queue.
Lo CPU Scheduler è il componente che decide a chi tocca adesso. il suo compito è selezionare un processo tra tutti quelli presenti nella ready queue (la coda dei pronti in memoria) e decidere di allocargli la CPU. Lo scheduler non è sempre attivo, ma entra in gioco in momenti specifici, quando avviene un cambio di stato di un processo:
o Come funziona: Il sistema operativo ha il potere di interrompere un processo e sottrargli la CPU con la forza , anche se questo non ha ancora finito il suo lavoro. o Caratteristica: Questo tipo di scheduling agisce in tutti e quattro i casi. È fondamentale per garantire la reattività e l'interattività dei sistemi moderni (come Windows, macOS, Linux, Android), perché impedisce a un singolo processo di bloccare tutti gli altri.
I cinque principali criteri di performance utilizzati per valutare e confrontare l'efficacia dei diversi algoritmi di scheduling. Un buon scheduler cerca di trovare il miglior equilibrio possibile tra questi indicatori, che spesso sono in conflitto tra loro. Vediamoli uno per uno.
finché non ha terminato il suo CPU burst. Ma cambiando i processi di arrivo Confrontando i due scenari, il tempo medio di attesa è passato da 17 ms a 3 ms, un miglioramento enorme. Questo evidenzia il difetto principale dell'algoritmo FCFS: l'Effetto Convoglio (Convoy Effect). L'effetto convoglio si verifica quando processi brevi sono costretti ad attendere in coda dietro a un processo molto lungo. Questo degrada notevolmente le prestazioni medie del sistema, in particolare il tempo di attesa medio. SJF: Shortest-Job-First non si basa sull'ordine di arrivo ma sulla durata del lavoro da compiere. L'idea è quella di dare la precedenza ai processi più brevi per "toglierli di mezzo"
Non-Preemptive SJF una volta che un processo ottiene la CPU, la tiene finché non ha completato il suo burst, anche se nel frattempo arriva un processo più breve. Tempo 0: L'unico processo nella ready queue è P1. Parte P1 e, siccome è non- preemptive, continuerà a girare per tutti i suoi 7ms. Tempo 2: Arriva P (burst=4). Va in coda. Tempo 4: Arriva P (burst=1). Va in coda. Tempo 5: Arriva P4 (burst=4). Va in coda. Tempo 7: P1 finisce. Lo scheduler ora guarda la ready queue, che contiene {P2(4), P3(1), P4(4)}. Sceglie il processo con il burst più breve: P3. Parte P3. Tempo 8: P3 finisce. La ready queue ora contiene {P2(4), P4(4)}. I due processi hanno la stessa durata. In caso di parità, si usa la politica FCFS (First-Come, First-Served). Poiché P2 è arrivato prima di P4, parte P. Tempo 12: P2 finisce. L'unico processo rimasto è P4 , che parte. Tempo 16: P4 finisce. Preemptive SJF (o SRTF) Se arriva un nuovo processo il cui burst è più breve del tempo rimanente del processo attualmente in esecuzione, il sistema interrompe (preemption) il processo corrente per far partire quello nuovo e più breve. Tempo 0: Arriva P1 (burst=7). Parte P1. Tempo 2: Arriva P2 (burst=4). Lo scheduler confronta: tempo rimanente di P1: 7 - 2 = 5ms; Burst di P2: 4ms. Poiché 4 < 5, P1 viene interrotto e parte P2. Segnaliamo cosa succede al Tempo 5: P3 finisce (il suo burst era di solo 1ms). Arriva P4 (burst=4). Lo scheduler guarda la ready queue, che ora contiene: {P1(rim. 5), P2(rim. 2), P4(burst 4)}. Il più breve è P2 , che riprende l'esecuzione. E continua così per i successivi tempi.
Tempo di Attesa = (Tempo Totale Trascorso) - (Tempo di Esecuzione Effettivo) - (Tempo di Arrivo) SJF è teoricamente ottimale ma ha un problema pratico insormontabile: come si fa a conoscere in anticipo la durata del prossimo CPU burst di un processo? La risposta è che non si può. Si può solo provare a stimarla (prevederla) basandosi sul comportamento passato del processo. La Media Esponenziale: L'idea è di prevedere il futuro basandosi sul passato, ma dando più peso agli eventi recenti. La prossima previsione (tau_n+1) τ n+1=α ⋅ tn + (1 − α)⋅ τn t_n: La durata reale dell'ultimo CPU burst (il dato misurato). tau_n: La previsione che avevamo fatto per l'ultimo CPU burst. alpha: È un peso (o fattore di smorzamento) compreso tra 0 e 1. Controlla l'importanza che diamo alla storia recente rispetto a quella passata. tau_n+1: La nuova previsione per il prossimo CPU burst. τ₁: Rappresenta la stima della durata del primissimo CPU burst di un processo appena creato. c: È una costante , un valore predefinito scelto dal sistema operativo. Rappresenta la nostra "migliore ipotesi a priori" quando non sappiamo assolutamente nulla del comportamento di un nuovo processo. Se alpha=0: La formula diventa tau_n+1=tau_n. la nostra previsione non cambia mai. Ignoriamo completamente l'ultimo dato reale e ci teniamo la stima iniziale per sempre. La storia del processo non conta nulla. Se alpha=1: La formula diventa tau_n+1=t_n. La nostra prossima previsione sarà semplicemente uguale all'ultima durata effettiva. Ignoriamo tutta la storia passata e ci basiamo solo sull'ultimo comportamento. Questo rende la stima molto reattiva ma anche molto instabile. alpha=0.5: In questo caso, la nuova stima è esattamente la media tra l'ultimo valore reale e l'ultima previsione, dando lo stesso peso alla realtà e alla stima passata. La linea a gradoni (t_i) rappresenta la durata reale dei successivi CPU burst di un processo.
l principale svantaggio di un sistema a priorità rigide è la starvation (attesa indefinita). se continuano ad arrivare processi con priorità alta, i processi con priorità bassa potrebbero non essere mai scelti dallo scheduler. La Soluzione: Aging (Invecchiamento): Per risolvere il problema della starvation, si usa una tecnica chiamata Aging (invecchiamento). È un meccanismo che aumenta dinamicamente la priorità di un processo man mano che questo invecchia, cioè man mano che passa tempo in attesa nella ready queue.
Round Robin L'algoritmo Round Robin è una versione preemptive dell'algoritmo FCFS. L'idea di base è di dare a ogni processo un "piccolo assaggio" della CPU, a turno, in modo equo. Viene definita una piccola unità di tempo, chiamata quanto di tempo o time slice (di solito tra 10 e 100 millisecondi). Ogni processo ottiene la CPU per un periodo di tempo non superiore a un quanto di tempo. Se il processo finisce il suo CPU burst prima che scada il quanto di tempo, rilascia la CPU volontariamente. Se il processo sta ancora girando quando il quanto di tempo scade, un timer genera un interrupt. Il sistema operativo interviene, interrompe (preemption) il processo e lo sposta alla fine della coda dei pronti. La ready queue viene gestita come una semplice coda circolare (FIFO). Il processo scelto è quello in testa alla coda; un processo interrotto viene messo in fondo. uesto meccanismo garantisce che nessun processo possa monopolizzare la CPU. se ci sono n processi nella coda, ogni processo riceverà il suo turno sulla CPU al massimo dopo aver atteso per il tempo di esecuzione degli altri n-1 processi. Le prestazioni dell'algoritmo Round Robin dipendono in modo critico dalla lunghezza del quanto di tempo q. Se q è molto grande: Immagina un q più lungo del più lungo dei CPU burst. In questo caso, nessun processo verrà mai interrotto perché scade il tempo. Ogni processo partirà e finirà il suo lavoro senza essere fermato. L'algoritmo RR diventa a tutti gli effetti un FCFS. Se q è molto piccolo: Un q piccolo migliora il tempo di risposta , perché i processi ottengono la CPU molto frequentemente per brevi periodi, dando all'utente la sensazione che il sistema sia molto reattivo. Ogni volta che un processo viene interrotto e ne parte un altro, c'è un costo operativo, la commutazione di contesto (context switch). Se il quanto di tempo q è troppo piccolo e si avvicina alla durata del context switch (es. q = 10ms, context switch = 5ms), il sistema passerà una parte enorme del suo tempo a fare cambi di contesto invece che lavoro utile.ù
scheduler serve sempre i processi della coda a priorità più alta. Passa a una coda a priorità più bassa solo se tutte le code a priorità superiore sono vuote. Se arriva un nuovo processo nella coda foreground mentre sta girando un processo background, quest'ultimo viene immediatamente interrotto (prelazione). Rischio di starvation.
Se un processo non finisce , allo scadere del tempo viene spostato nella coda sottostante, Q1.