Wykład 6 Planista procesora funkcja schedule. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Podobne dokumenty
Wykład 2 Proces, stany procesu i przejścia pomiędzy nimi. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

Szeregowanie zadań w Linux Kernel 2.6. Daniel Górski Przemysław Jakubowski

Wykład 5 Przerwania i wywołania systemowe. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Wykład 6. Planowanie (szeregowanie) procesów (ang. process scheduling) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

przydziału procesora Przykłady implementacji planowania przydziału procesora Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Przykłady implementacji planowania przydziału procesora

Prezentacja systemu RTLinux

Wykład 13. Linux 2.0.x na maszynach SMP. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Planowanie przydziału procesora

Planowanie przydziału procesora

Planowanie przydziału procesora

Ogólna koncepcja planowania. Planowanie przydziału procesora. Komponenty jądra w planowaniu. Tryb decyzji. Podejmowanie decyzji o wywłaszczeniu

Jadro Linux 2.6. a zadania czasu rzeczywistego. Artur Lewandowski. Jądro Linux 2.6 p.1/14

4. Procesy pojęcia podstawowe

4. Procesy pojęcia podstawowe

Zarządzanie w systemach i sieciach komputerowych. Dr inż. Robert Wójcik. Wykład 3. Zarządzanie przydziałami procesora w systemach komputerowych

Linux Scheduler Szeregowanie procesów w systemie Linux. Andrzej Ambroziewicz Piotr Marat Mieszko Michalski

Laboratorium 7: Liczniki czasu (jedne zajęcia) dr inż. Arkadiusz Chrobot

Systemy operacyjne II

Zarządzanie procesorem

Przykłady implementacji planowania przydziału procesora. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Procesy, wątki i zasoby

Linux Adam Bułak Ha Nhat Viet Damian Klata

Fazy procesora i wejścia-wyjścia. Planowanie przydziału procesora. Czasy faz procesora. Planowanie przydziału procesora

Planowanie przydziału procesora

Szeregowanie zadań we współczesnych systemach operacyjnych. Szeregowanie zadań w Linux Kernel 2.6

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Podstawy programowania komputerów

BSD - alternatywa dla Linuksa

Wykład 7 Podręczna pamięć buforowa (ang. buffer cache) w systemie Linuks. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Przełączanie kontekstu. Planista średnioterminowy. Diagram kolejek. Kolejki planowania procesów. Planiści

7. Szeregowanie procesów w systemie QNX6 Neutrino

Procesy, zasoby i wątki

Procesy, zasoby i wątki

Embedded Systems Programming

Systemy operacyjne III

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Programowanie współbieżne Wykład 2. Iwona Kochańska

Planowanie przydziału procesora

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Wątki jądra. Maciej Szwaja

Procesy, zasoby i wątki

Zarządzanie procesami i wątkami

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

1.1 Definicja procesu

4. Procesy pojęcia podstawowe

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Przeplot. Synchronizacja procesów. Cel i metody synchronizacji procesów. Wątki współbieżne

Przerwania, polling, timery - wykład 9

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

SYSTEMY OPERACYJNE WYKLAD 6 - procesy

Futex (Fast Userspace Mutex) Łukasz Białek

Metody obsługi zdarzeń

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

7. Szeregowanie procesów w systemie QNX6 Neutrino

Struktury. Przykład W8_1

Wykład 8. Pamięć wirtualna. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Kurs programowania. Wykład 8. Wojciech Macyna

projektowanie systemu

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Real-Time Linux. Wprowadzenie

Laboratorium 5: Wątki jądra i mechanizmy synchronizacji (jedne zajęcia) dr inż. Arkadiusz Chrobot

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Technika mikroprocesorowa. Systemy operacyjne czasu rzeczywistego

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Mechanizmy pracy równoległej. Jarosław Kuchta

Planowanie przydziału procesora CPU scheduling. Koncepcja szeregowania. Planista przydziału procesora (planista krótkoterminowy) CPU Scheduler

1. Tworzenie nowego projektu.

Program jest więc strukturą statyczną zapisaną na jakimś nośniku. Natomiast proces jest wykonującym się programem.

Projektowanie oprogramowania systemów PROCESY I ZARZĄDZANIE PROCESAMI

Simulator of Operating System

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Aplikacje w Javie- wykład 11 Wątki-podstawy

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Informatyka, systemy, sieci komputerowe

Materiały pomocnicze 1

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

1. Timery i zdarzenia

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

dr inż. Jarosław Forenc

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Współbieżność w środowisku Java

Laboratorium 6: Tasklety i kolejki prac (jedne zajęcia) dr inż. Arkadiusz Chrobot

Podstawy Programowania C++

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

dr inŝ. Jarosław Forenc

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Wykład 3: Implementacja programów wbudowanych

Język ludzki kod maszynowy

Transkrypt:

Wykład 6 Planista procesora funkcja schedule Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Typowe punkty wywołania planisty Procedura sleep_on (usypanie procesu). Powrót z wywołania systemowego lub przerwania (ret_from_sys_call) Przerwanie musi przerwać proces wykonujący się w trybie użytkownika. Planista jest wywoływany o ile ustawiona jest zmienna need_resched. need_resched może być ustawiona przy budzeniu!!! Ten punkt wywołania pozwala na wywłaszczenie procesu. Aktywne oczekiwanie w sterowniku urządzenia Na przykład oczekiwanie na transfer danych. W pętli czekającej należy wstawić instrukcję: if (need_resched) schedule(); Oraz w innych miejscach. Wojciech Kwedlo, Systemy Operacyjne II -2- Wydział Informatyki PB

Przeznaczenie funkcji schedule jedno zdanie Wybierz odpowiedni proces w stanie TASK_RUNNING i przełącz do niego kontekst (sterownie) Wojciech Kwedlo, Systemy Operacyjne II -3- Wydział Informatyki PB

Przypomnienie: Pola w struct task_struct state: bieżący stan procesu, dwa najważniejsze to: TASK_RUNNING wykonywujący się lub gotowy do wykonania. task_struct wykonywującego się procesu jest wskazywane przez zmienną current TASK_INTERRUPTIBLE uśpiony, ale mogący odbierać sygnały counter, priority, rt_priority Pola związane z priorytetami procesów (statyczny i dynamiczny) prev_run, next_run wskaźniki na następny i poprzedni element na dwukierunkowej liście wszystkich procesów gotowych do wykonania. Policy klasa szeregowania zgodnie ze standardem POSIX 1003.4 Dopuszczalne wartości to SCHED_FIFO, SCHED_RR oraz SCHED_OTHER SCHED_OTHER tradycyjne szeregowanie Uniksowe SCHED_RR oraz SCHED_FIFO to szeregowanie czasu rzeczywistego. Funkcja systemowa sched_setscheduler pozwala m.in na zmianę klasy szeregowania, szeregowanie czasu rzeczywistego może być wykorzystane wyłącznie przez root-a Wojciech Kwedlo, Systemy Operacyjne II -4- Wydział Informatyki PB

Cykliczna lista dwukierunkowa procesów gotowych next_run init_task prev_run Podobnie lista wszystkich procesów (utrzymywana przy pomocy pól next_task i prev_task) #define for_each_task(p) \ for (p = &init_task ; (p = p->next_task)!= &init_task ; ) Wojciech Kwedlo, Systemy Operacyjne II -5- Wydział Informatyki PB

Klasy szeregowania SCHED_FIFO. (First In First Out pierwszy przyszedł pierwszy odszedł). Klasa szeregowania czasu rzeczywistego. Proces o tej klasie może zostać wywłaszczony jedynie przez inny proces czasu rzeczywistego o wyższym priorytecie. SCHED_RR (Round Robin - w kółko Macieju) Klasa szeregowania czasu rzeczywistego. Proces tej klasy po zużyciu swego kwantu czasu jest przemieszczany na koniec kolejki procesów gotowych. SCHED_OTHER tradycyjna klasa procesów UNIXowych. Procesy klasy SCHED_FIFO i SCHED_RR wykonywane są zawsze przed procesami klasy SCHED_OTHER. O kolejności wykonywania procesów klasy czasu rzeczywistego decyduje Priorytet (pole rt_priority). Przy identycznym priorytecie kolejność procesów w kolejce procesów gotowych. Wojciech Kwedlo, Systemy Operacyjne II -6- Wydział Informatyki PB

Priorytety (pola w struct task_struct) rt_priority: priorytet procesów czasu rzeczywistego. Wartość z zakresu 1-99, 0 dla zwykłych procesów. counter liczba taktów (przerwań zegara systemowego) pozostałych do czasu zużycia przyznanego kwantu czasu (zmniejszane o jeden po każdym przerwaniu). Jeżeli counter osiągnie zero ustawiana jest flaga need_resched counter jednocześnie pełni funkcję priorytetu dynamicznego dla procesów zwykłych. Jeżeli kilka takich procesów jest w stanie gotowym to zostanie wybrany proces o największej wartości counter. priority priorytet statyczny, ustawiany przy pomocy funkcji nice. Nice przyjmuje argument wartość od -20 do 20. priority ma wartość od 0 do 2*DEF_PRIORITY, domyślnie DEF_PRIORITY DEF_PRIORITY=20*HZ/100 (20 dla x86). Przy obliczaniu kwantu czasu dla procesów zwykłych wykorzystuje się algorytm: counter := priority (dla procesów w stanie TASK_RUNNING, kwant 200ms) counter := counter/2 + priority (dla procesów w stanie TASK_INTERRUPTIBLE) Wojciech Kwedlo, Systemy Operacyjne II -7- Wydział Informatyki PB

Kod funkcji schedule Pomijamy systemy z wieloma procesorami (SMP). Na maszynach SMP każdy procesor wykonuje funkcje schedule(). Pożądane jest aby proces otrzymał procesor na którym się poprzednio wykonywał (afiniczność procesorów). Ten procesor może już mieć właściwe dane w swojej pamięci cache. Funkcje pomocnicze operujące na kolejce procesów gotowych (prev_run, next_run) move_last_runqueue przesuwa proces na koniec kolejki del_from_runqueue usuwa proces z tej kolejk add_to_ruqueue dodaje proces do kolejki (wykorzystywana przez algorytm wakeup, więcej o niej później). Wojciech Kwedlo, Systemy Operacyjne II -8- Wydział Informatyki PB

Funkcja pomocnicza goodness int goodness(struct task_struct *p) { if (p->policy!= SCHED_OTHER) return 1000+p->rt_priority; return p->counter; Funkcja ta wykorzystana jest do selekcji procesu z kolejki procesów gotowych do wykonania. Procesy klasy czasu rzeczywistego są sortowane na podstawie pola rt_priority. Procesy zwykłe na podstawie pola counter. - Im więcej czasu pozostało procesowi, tym większy priorytet. Ponieważ counter << 1000, to procesy czasu rzeczywistego mają bezwzględny priorytet. Wojciech Kwedlo, Systemy Operacyjne II -9- Wydział Informatyki PB

Funkcja schedule (1) void schedule() { int c; unsigned long timeout=0; struct task_struct *p, *prev, *next; if (bh_active & bh_mask) { intr_count = 1; do_bottom_half(); intr_count = 0; run_task_queue(&tq_scheduler); Uruchomienie dolnych połów i kolejki zadań tq_scheduler // need_resched==1 oznacza żądanie uruchomienia planisty need_resched = 0; // prev jest wskaźnikiem na poprzedni proces prev = current; cli(); // blokuj przerwania if(!prev->counter && prev->policy == SCHED_RR) { prev->counter = prev->priority; move_last_runqueue(prev); Jeżeli proces jest klasy SCHED_RR i zużył kwant procesora to przesuwany jest na koniec kolejki procesów gotowych i otrzymuje nowy kwant procesora. Wojciech Kwedlo, Systemy Operacyjne II -10- Wydział Informatyki PB

Funkcja schedule (2) switch (prev->state) { case TASK_INTERRUPTIBLE: if (prev->signal & ~prev->blocked) goto makerunnable; timeout = prev->timeout; // Programowana czasowo pobudka if (timeout && (timeout <= jiffies)) { prev->timeout = 0; timeout = 0; makerunnable: prev->state = TASK_RUNNING; break; default: del_from_runqueue(prev); case TASK_RUNNING: Jeżeli bieżący proces jest w stanie TASK_INTERRUPTIBLE (kładzie się spać) ale: b)otrzymał sygnał c) upłynął timeout o tym później to przełącz go z powrotem w stan TASK_RUNNING W przeciwnym wypadku usuń proces (o ile nie jest w stanie TASK_RUNNING) z kolejki procesów gotowych Wojciech Kwedlo, Systemy Operacyjne II -11- Wydział Informatyki PB

Funkcja schedule (3) c = -1000; p=init_task.next_run; next = init_task; while (p!= &init_task) { int weight = goodness(p, prev, this_cpu); if (weight > c) c = weight, next = p; p = p->next_run; Znajdź w kolejce procesów gotowych proces o największej dobroci Za chwilę otrzyma on procesor. if (!c) { for_each_task(p) p->counter = (p->counter >> 1) + p->priority; Jeżeli c==0, co oznacza że: W kolejce procesów gotowych brak procesów czasu rzeczywistego. Wszystkie procesy zwykłe zużyły swoje kwanty czasu to przydziel nowe kwanty czasu (wszystkim, nie tylko gotowym) procesom Możemy to nazwać przeliczeniem priorytetów dynamicznych Procesy spiące otrzymują większy kwant czasu. Wojciech Kwedlo, Systemy Operacyjne II -12- Wydział Informatyki PB

Przeliczenie priorytetów (kwantów czasu) Wykonywane po zużyciu przez wszyskie procesy w stanie TASK_RUNNING swoich kwantów czasu. UWAGA: nowe kwanty są nadawane także procesom śpiącym (w stanie TASK_INTERRUPTIBLE)! Proces który cały czas się wykonuje (a zatem zużył swój kwant otrzyma nowy równy polu priority) Proces, który przez cały czas śpi otrzyma, będzie miał kwant: priority // na początku priority+priority/2 // pierwsze przeliczenie priority+priority/2+priority/4 // drugie przeliczenie priority+priority/2+priority/4+priority/8 // trzecie przeliczenie... Szereg geometryczny zbieżny do 2*priority!!! W ten sposób Linuks preferuje procesy interakcyjne, to znaczy takie które (prawie) cały czas śpią (np. edytor tekstu vi) Wojciech Kwedlo, Systemy Operacyjne II -13- Wydział Informatyki PB

Dygresja oczekiwanie w jądrze (przypomnienie z poprzedniego tygodnia) Jednym ze sposobów realizacji aktywnego czekania w jądrze (np. w sterowniku urządzenia) jest wstawienie kodu: if (need_resched) schedule(); Wadą tego podejścia jest bezczynne oczekiwanie w pętli i marnowanie kwantu procesora. Alternatywne podejście polega na uśpieniu na co najmniej K milisekund: current->state=task_interruptible; current->timeout=jiffies+k*hz/1000; schedule(); Czas odliczany jest z dokładnością przerwań zegarowych (10ms na x86) Proces zostanie obudzony po zaprogramowanym czasie. Ale procesor może otrzymać o wiele później!!! O tym decyduje planista. Wojciech Kwedlo, Systemy Operacyjne II -14- Wydział Informatyki PB

API timerów jądra (można wykorzystać w projekcie) struct timer_list { struct timer_list *next; struct timer_list *prev; unsigned long expires; // Kiedy timer wygasa (w jiffies) unsigned long data; // Dane do przekazania funkcji void (*function)(unsigned long); // Adres handlera ; Timer jest typu single-shot Funkcje: init_timer, add_timer, del_timer (o ile timer zostanie odpalony, to nie ma potrzeby wołania tej funkcji) Działanie po wywołaniu init_timer po czasie zaprogramowanym przez expires funkcja function zostanie wywołana z argumentem równym polu data. Dużo bardziej pewne odmierzanie czasu niż w poprzenim przypadku, ponieważ handler zostanie wywołany przy najbliższej obsługi dolnej połowy. Haczyki: Nie wiemy w kontekście jakiego procesu nie można sięgać do danych w pamięci procesu!!! Synchronizacja => dolne połowy mogą przerwać kod jądra (w szczególności kod sterownika), a timer jest wywoływany z dolnych połów => potrzeba cli() Wojciech Kwedlo, Systemy Operacyjne II -15- Wydział Informatyki PB

Funkcja schedule (4) W tym momencie zmienna next wskazuje na nowy proces. if (prev!= next) { struct timer_list timer; Jeżeli ustawiliśmy timeout (patrz dygresja) to wykorzystaj timer jądra do wywołania funkcji process_timeout budzącej proces po zaprogramowanym czasie. kstat.context_swtch++; if (timeout) { init_timer(&timer); timer.expires = timeout; timer.data = (unsigned long) prev; timer.function = process_timeout; add_timer(&timer); switch_to(prev,next); // przełącz kontekst // powrót nastąpi dopiero po ponownym przełączeniu kontekstu if (timeout) // Możliwość obudzenia przed wywołaniem timera // Np sygnał del_timer(&timer); Funkcja przełączająca kontekst jest napisana w assemblerze add_timer pozwala na zaprogramowanie timerów jądra funkcji Wojciech Kwedlo, Systemy Operacyjne II -16- Wydział Informatyki PB

Funkcja process_timeout Proces uśpiony nie czekał na żadnej kolejce (wait_queue) więc wystarczy przełączyć stan na TASK_RUNNING i dodać do kolejki procesów gotowych.. inline void wake_up_process(struct task_struct * p) { unsigned long flags; save_flags(flags); cli(); p->state = TASK_RUNNING; if (!p->next_run) add_to_runqueue(p); restore_flags(flags); static void process_timeout(unsigned long data) { struct task_struct * p = (struct task_struct *) data; p->timeout = 0; wake_up_process(p); cli() - ponieważ kod funkcji może być przerwany przez przerwanie (lub dolną połowę, o ile nie jest wywołana ona z dolnej połowy), a przerywający kod może operować na kolejce procesów gotowych. Wojciech Kwedlo, Systemy Operacyjne II -17- Wydział Informatyki PB

Funkcja add_to_runqueue Jest wywoływana zawsze przy dodawaniu procesu do kolejki procesów gotowych (ang. run queue), między innymi przez funkcję rodziny wakeup. Pomijamy kod SMP i kontrolę błędów. static inline void add_to_runqueue(struct task_struct * p) { // Tu robi sie ciekawe if (p->policy!= SCHED_OTHER p->counter > current->counter + 3) need_resched = 1; nr_running++; // Dodanie do cyklicznej listy dwukierunkowej (kod szybki ale nieczytelny) (p->prev_run = init_task.prev_run)->next_run = p; p->next_run = &init_task; init_task.prev_run = p; Jeżeli nowo dodany proces jest czasu rzeczywistego, lub ma większy (co najmniej o 40ms) kwant czasu niż proces bieżący to uruchamiany jest planista (i oczywiście wywłaszczy proces bieżący, jeżeli nie jest on czasu rzeczywistego lub ma mniejszy kwant). Cel: przyspieszenie reakcji na procesy interakcyjne, spełnienie standardu POSIX dla procesów czasu rzeczywistego. Wojciech Kwedlo, Systemy Operacyjne II -18- Wydział Informatyki PB

Cechy algorytmu szeregowania Procesy zwykłe mogą zostać zagłodzone przez procesy czasu rzeczywistego. Wysokopriorytetowy proces klasy SCHED_FIFO, który wpadnie w pętlę nieskończoną może zawiesić system. Jeżeli brak procesów czasu rzeczywistego, to nie może dojść do zagłodzenia (dlaczego?) Algorytm jest sprawiedliwy i (prawie) nie faworyzuje żadnego z procesów z grupy procesów o tym samym priorytecie. Jeżeli proces wyczerpie swój kwant czasu to musi czekać na wyczerpanie kwantu czasu pozostałych procesów. Może to sprawiać problemy w przypadku procesów interaktywnych (ale takie procesy rzadko wyczerpują swój kwant czasu). Brak rozróżnienia pomiędzy procesami interaktywnymi i obliczeniowymi. Jeżeli system jest obciążony procesami obliczeniowymi, to utrudnia to pracę procesom interaktywnym. Wojciech Kwedlo, Systemy Operacyjne II -19- Wydział Informatyki PB

Kolejka wielopoziomowa rt_priority=99 rt_priority=98 rt_priority=1 rt_priority=0 Powyżej tej linii procesy czasu rzeczywistego 100 wartości rt_priority symuluje podział kolejki procesów gotowych na 100 poziomów kolejek koncepcyjnych, przy czym procesy są wybierane z najwyższego możliwego poziomu. Wojciech Kwedlo, Systemy Operacyjne II -20- Wydział Informatyki PB

Wybrane funkcje systemowe związane z szeregowaniem int nice(int increment) - zmiana wartości priorytetu statycznego o podaną wartość Wartość ujemna oznacza zwiększenie, może z niej korzystać tylko root. Wartość nice 0-20 jest przeliczana na wartość priority 0-2*DEFPRIORITY Na wartości priorytetu operują również funkcje getpriority/setpriority int sched_yield() - oddanie procesora na włąsne życzenie Proces jest jednocześnie przesyłany na koniec kolejki procesów gotowych. int sched_setscheduler(pid_t pid, int policy, struct sched_param *param) - ustawienie klasy szeregowania dla procesu o numerze pid, (pid==0 oznacza bieżący proces). policy może przyjmować wartość SCHED_FIFO, SCHED_RR, SCHED_OTHER. sched_param posiada tylko jedno pole sched_priority. Jest to priorytet czasu rzeczywistego sched_getscheduler pobiera klasę szeregowania Wojciech Kwedlo, Systemy Operacyjne II -21- Wydział Informatyki PB