Od kilku tygodni na maszynie pod moim biurkiem działa kernel 2.5.67. Testuje się dość intensywnie – dysk pracuje prawie bez przerwy, aktywne są połączenia sieciowe, a w tle szaleje klient SETI. Jak dotąd, wszystko działa bez zarzutu. Musi – w końcu na koniec przyszłego miesiąca planowane jest wypuszczenie wersji 2.6.0. W ciągu kilku kolejnych miesięcy, sporo dystrybucji zacznie z niego korzystać, a o 2.4 powoli zaczniemy zapominać. Dlatego warto już dziś zapoznać się ze zmianami, które wprowadza seria 2.5.x. Część pierwsza krótkiego cyklu dotyczącego kernela – poniżej. Kolejne odcinki napiszę, kiedy znów będę potrzebował chwili wytchnienia od pracy licencjackiej 😉

Pierwszą rzeczą, na którą na pewno zwrócicie uwagę, jest nowy scheduler (moduł szeregujący). Jest to część jądra odpowiadająca za wybór procesów, które powinny być wykonywane w danej chwili, i za przełączanie między nimi. Właśnie dzięki niemu Linux jest systemem wielozadaniowym.

Dotychczas scheduler działał według następującego algorytmu:

  • weź pierwszy proces z brzegu
  • sprawdź, jak bardzo pilne jest wykonanie
  • jeśli bardziej, niż najpilniejszego do tej pory, zapamiętaj go
  • jeśli jest jeszcze jakiś niesprawdzony proces, skocz do punktu pierwszego
  • uruchom najpilniejszy proces

Jak się łatwo domyślić, im więcej procesów działa w systemie, tym dłużej trwa wybieranie tego najważniejszego. Może nawet dojść do sytuacji, w której wybór procesu zajmie więcej czasu niż jego wykonanie.

Z tego powodu zabrano się za stworzenie nowego schedulera, który nie dość, że będzie wydajniejszy, to jeszcze będzie działał idealnie na maszynach wieloprocesorowych. Przy jego projektowaniu zwracano również uwagę na to, żeby żaden proces nie zabrał zbyt wiele czasu procesora, ani żadne zadanie nie zostało tego czasu kompletnie pozbawione.

Rozwiązaniem jest tzw. scheduling O(1), który zapewnia stały czas przełączania między procesami, bez względu na ich ilość.

Nowy scheduler ma jedną podstawową cechę – cały czas śledzi wszystkie procesy i ma ich listę, na której znajdują się priorytety poszczególnych zadań. Algorytm działania schedulera O(1) jest następujący:

  • pobierz priorytet najbardziej „pilnego” procesu
  • pobierz z listy pierwszy proces, który ma taki priorytet
  • uruchom zadanie

Dzięki temu nie jest konieczne przeglądanie tablic wszystkich procesów w systemie, bo wszystkie dane są zgromadzone w jednym miejscu.

Drugą ważną sprawą, o której często zapominamy, jest skalowalność na maszyny wieloprocesorowe. W jądrach serii 2.4 wyglądało to tak, że istniała jedna kolejka procesów, z których scheduler pobierał procesy do wykonania. Problem polegał na tym, że sam kod schedulera mógł być wykonywany tylko na jednym procesorze na raz – w przeciwnym wypadku działające jednocześnie schedulery mogłyby nawzajem namieszać sobie w globalnej kolejce.

Rozwiązanie tego problemu jest bardzo proste – trzeba stworzyć odrębne kolejki dla każdego procesora. Dodatkową korzyścią z tego płynącą jest fakt, że teraz zadanie nie będzie skakać z procesora na procesor, lecz będzie wykonywane na jednym aż do momentu zakończenia lub pojawienia się dużej różnicy w obciążeniu procesorów.

Jaki wpływ na ostateczną szybkość systemu ma wprowadzenie nowego schedulera? Jak wynika z testów – ogromny. W ciągu jednej sekundy, pod kontrolą jądra 2.4, testowe procesy wymieniły między sobą około 80 tysięcy komunikatów. W tym samym czasie, te same procesy pod kontrolą 2.5 wymieniły tych komunikatów ponad 612 tysięcy! Jako zadanie domowe pozostawiam wam, drodzy Czytelnicy, obliczenie wzrostu wydajności.

Lektura:
kernel Linksa, a w szczególności kernel/sched.c oraz Documentation/sched-design.txt (koncepcja działania schedulera O(1)).
2.6 Kernel to Push the Envelope
Linux Kernel Mailing List
Archiwalny news dodany przez użytkownika: honey.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Oznaczone jako → 
Share →