Szeregowanie procesów w Linuksie

Łukasz Bieniasz-Krzywiec

Dobromiła Górczyńska

Jakub Łącki

Plan

Wstęp

Co to jest scheduler?

Wstęp

Jak powiedzieć 'scheduler'?

Polityka zarządzania procesami

Wywłaszczanie procesora

Długość kwantu czasu

Scheduler w jądrze 2.4 - ogólnie

Epoki

Priorytety procesów

Struktury danych schedulera cz. 1

Struktury danych schedulera cz. 2

Struktury danych procesora

Funkcja schedule()

Funkcja schedule() - Wyw. bezpośrednie

Funkcja schedule() - Wyw. leniwe

Przed przełączeniem procesów cz.1

Przed przełączeniem procesów cz. 2

Przed przełączeniem procesów cz. 3

Przed przełączeniem procesów cz. 4

Strategia wybierania najlepszego procesu

Działanie na systemie wieloprocesorowym

Efektywność działania schedulera

Wady algorytmu cz. 1

Wady algorytmu cz. 2

Scheduler w jądrze 2.6 - ogólnie

Zalety schedulera O(1)

Podstawowe struktury danych

Wsparcie dla SMP

Wywłaszczanie procesora

Dynamiczne wyznaczanie priorytetów

Zbalansowanie przeciążenia proc. w SMP

Najciekawsze funkcje schedulera O(1)

Podsumowanie

AFERA SCHEDULEROWA

W połowie kwietnia 2007 wybuchła afera schedulerowa:

Con Kolivas - bohater [1/2]

Con Kolivas - bohater [2/2]

Scheduler SD

Główne cechy schedulera SD:

SD - realizacja

Podstawowa zasada działania:

SD - przykład

Procesy "spadają po schodach"



SD - przykład

Procesy "spadają po schodach"



SD - przykład

Procesy "spadają po schodach"



SD - przykład

Procesy "spadają po schodach"



SD - przykład

Procesy "spadają po schodach"



SD - przykład

Procesy "spadają po schodach"



SD - przykład

Procesy "spadają po schodach"



SD - przykład

Skąd wiadomo jak spadają procesy?



Stąd:


nice -20 0000000000000000000000000000000000000000
nice -10 1000100010001000100010001000100010010000
nice   0 1010101010101010101010101010101010101010
nice   5 1011010110110101101101011011010110110110
nice  10 1110111011101110111011101110111011101110
nice  15 1111111011111110111111101111111011111110
nice  19 1111111111111111111111111111111111111110

Przydział czasu

SD - procesy interaktywne

SD nie ma herurystyk do obsługi procesów interaktywnych

Nowości w kernelu 2.6.23

Podział schedulera na moduły (1)

Jak napisać własny scheduler?

Podział schedulera na moduły (2)

Jak napisać własny scheduler?

CFS - założenia

CFS - realizacja

Symulację przeprowadzamy w następujący sposób:

CFS - szczegóły (1)

Problem:

klucze wszystkich elementów w drzewie zmieniają się w czasie



Rozwiązanie:

CFS - szczegóły (2)

Obsługa priotytetów

CFS - szczegóły (3)

Ile czasu może wykonywać się proces?


static long sched_granularity(struct cfs_rq *cfs_rq)
{
    unsigned int gran = sysctl_sched_latency;
    unsigned int nr = cfs_rq->nr_running;
    if (nr > 1) { 
	gran = gran/nr - gran/nr/nr;
	gran = max(gran, sysctl_sched_min_granularity);
    }
    return gran;
}

Que? Skąd się bierze '- gran/nr/nr'?

CFS - szczegóły (4)

Obliczanie granularności


Mamy dwa procesy: A i B. B rozpoczyna działanie, A właśnie skończył się wykonywać:
klucz_przedA + gran = klucz_przedB
klucz_poB + gran = klucz_poA
klucz_poA = klucz_przedA
klucz_poB = klucz_przedB - d + d/nr
opoznienie = d * nr

CFS - szczegóły (5)

Co z procesami interaktywnymi?

CFS - szczegóły (6)

Kiedy proces zostaje wywłaszczony?


    s64 __delta = curr->fair_key - se->fair_key;
    unsigned long ideal_runtime, delta_exec;
    
    ideal_runtime = max(sysctl_sched_latency / cfs_rq->nr_running,
	(unsigned long)sysctl_sched_min_granularity);

    delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
    if (delta_exec > ideal_runtime)
	granularity = 0;

    if (__delta > niced_granularity(curr, granularity))
	resched_task(rq_of(cfs_rq)->curr);

Porównanie schedulerów cz. 1

Porównanie schedulerów cz. 2

Porównanie schedulerów cz. 2

Plan - Testowanie

Testowanie

Po co testować?

Co testować?

Jak testować? [1/2]

Jak testować? [2/2]

Czym testować? [1/2]

Micro-Benchmarki:

Czym testować? [2/2]

Macro-Benchmarki:


Używanie:

pipe-test

pipe-test - Nasze Wyniki

pipe-test - Wyniki z KernelTrap

lat_ctx

lat_ctx - Nasze Wyniki

lat_ctx - Wyniki z KernelTrap

hackbench

hackbench - Nasze Wyniki

hackbench - Wyniki z KernelTrap

hackbench - Nasze Wyniki

massive_intr

starve

Co nas czeka?