2011-11-04 11 views
13

Sono un principiante del kernel Linux e sto cercando di capire come Linux pianifica i processi.Latenza di CFS (Completely Fair Scheduler)

Ho letto alcuni libri sul Kernel Linux e ho seguito i collegamenti da IBM http://www.ibm.com/developerworks/linux/library/l-cfs/ e tutti, ma mi rimangono ancora alcuni dubbi.

  1. In che modo lo scheduler pianifica tutte le attività entro il tempo sysctl_sched_latency?
  2. Quando un processo si attiva, cosa è effettivamente eseguito nella funzione place_entity?
  3. Quando si verifica un processo, perché lo vruntime viene regolato sottraendo da sched_latency? Non è possibile che ciò porti a processi nella coda di esecuzione con grandi differenze nel valore vruntime?

risposta

10

Innanzitutto il runtime virtuale di un compito

  • in teoria è quando il compito inizierebbe sua temporale successiva di esecuzione su un teoricamente perfetta CPU multiple filettato.
  • in pratica è la sua effettiva esecuzione normalizzati per il numero totale delle attività in esecuzione

1. Come funziona il programma scheduler tutte le attività entro il tempo sysctl_sched_latency?

Mantiene un albero rosso e nero ordinato nel tempo, in cui tutte le attività eseguibili sono ordinate dal loro runtime virtuale. I nodi a sinistra hanno funzionato per il minor tempo possibile. CFS seleziona l'attività più a sinistra e la esegue, finché l'attività non viene pianificata o lo schedulatore non fa clic su , quindi il tempo di CPU trascorso in esecuzione viene aggiunto al suo runtime virtuale. Quando non è più il nodo più a sinistra, viene eseguita la nuova attività con il virtual più breve e il vecchio task interrotto.

2. Quando un processo riattiva ciò che viene effettivamente eseguito nella funzione place_entity?

Versione corta:

Quando un processo si sveglia la funzione place_entity o lascia runtime virtuale del compito come lo era o aumenta.

Versione lunga:

Quando un processo si sveglia la funzione place_entity esegue le seguenti cose

  1. Inizializzare il runtime virtuale temporanea al runtime virtuale del coda di esecuzione del CFS del più piccolo compito.

  2. Poiché i periodi di inattività inferiori a una singola latenza non vengono conteggiati, inizializza una variabile di soglia su sysctl_sched_latency. Se la funzione GENTLE_FAIR_SLEEPERS è abilitata, quindi metà del valore di questa variabile. Decrementa il runtime temporaneo temporaneo precedentemente inizializzato con questo valore di soglia.

  3. Assicurarsi che il runtime virtuale temporaneo sia almeno uguale al runtime virtuale dell'attività, impostando il runtime virtuale calcolato al massimo di se stesso e il runtime virtuale dell'attività.

  4. Impostare il runtime virtuale dell'attività sul runtime temporaneo.

3. Quando un processo si sveglia Perché le vruntime regolata sottraendo dal sched_latency?

Il runtime virtuale viene decrementato perché i periodi di inattività inferiori a una singola latenza non vengono conteggiati. E.g l'attività non dovrebbe avere la sua posizione modificata nell'albero nero rosso modificato se ha solo dormito per una singola latenza dello scheduler.

4. Non può portare a processi nella coda di esecuzione con grandi differenze nel valore di vruntime?

Credo che la logica descritta nel passaggio 3 per la domanda 2, impedisca o almeno lo minimizzi.

Riferimenti

sched.c Linux Kernel Source

sched_fair.c Linux Kernel Source

Notes on the CFS Scheduler Design

+0

risposta alla domanda 1 in realtà non rispondere sulla pianificazione CFS all'interno 'sysctl_sched_latency'. – kavadias