NAZWA¶
sched_setscheduler, sched_getscheduler - ustawienie i pobranie
algorytmu/parametrów szeregowania zadań
SKŁADNIA¶
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy,
const struct sched_param *p);
int sched_getscheduler(pid_t pid);
struct sched_param {
...
int sched_priority;
...
};
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
sched_setscheduler ustawia dla procesu identyfikowanego przez
pid
politykę szeregowania zadań oraz związane z nią parametry.
Jeśli
pid jest równe zeru, to skonfigurowane zostanie
szeregowanie dla procesu wołającego tę funkcję.
Interpretacja parametru
p zależy od wybranej polityki. Obecnie,
pod Linuksem obsługiwane są następujące trzy polityki:
SCHED_FIFO,
SCHED_RR i
SCHED_OTHER; ich semantyki są
opisane poniżej.
sched_getscheduler zapytuje o bieżącą politykę
szeregowania zadań, która dotyczy procesu określonego przez
pid. Jeśli
pid jest równe zeru, to pobierana jest
polityką dotycząca procesu wywołującego tę
funkcję.
Polityki szeregowania zadań¶
Procedura szeregująca jest częścią jądra, która
decyduje o kolejności wykonywania działających procesów
przez procesor. Linuksowa procedura szeregująca oferuje trzy
różne polityki szeregowania zadań: jedną dla zwykłych
procesów oraz dwie dla aplikacji czasu rzeczywistego. Każdemu
procesowi przypisywana jest wartość priorytetu statycznego,
sched_priority, która może być zmieniana tylko poprzez
wywołania systemowe. Koncepcyjnie, procedura szeregująca
zarządza listami działających procesów przypisanymi
każdej z możliweych wartości
sched_priority, która
to wartość musi mieścić się w zakresie od 0 do 99.
Aby zdecydować, który proces należy uruchomić jako
następny, procedura szeregująca poszukuje niepustej listy o
najwyższym priorytecie statycznym i bierze proces z początku tej
listy. Polityka szeregowania zadań określa dla każdego z
procesów o danyej wartości priorytetu statycznego, gdzie zostanie on
wstawiony na listę i jak będzie się w jej obrębie
przemieszczał.
SCHED_OTHER jest domyślną, uniwersalną polityką
dzielenia czasu, używaną przez większość
procesów.
SCHED_FIFO i
SCHED_RR są przeznaczone dla
specjalnych aplikacji, dla których czas jest sprawą krytyczną i
które muszą mieć dokładną kontrolę nad sposobem,
w jaki podejmowane są decyzje o wykonywaniu działających
procesów. Procesy korzystające z polityki szeregowania
SCHED_OTHER muszą mieć przypisany priorytet statyczny
równy 0, a procesy korzystające z
SCHED_FIFO lub
SCHED_RR mogą mieć wartość tego priorytetu z
zakresu od 1 do 99. Priorytet statyczny wyższy niż 0 mogą
uzyskiwać tylko procesy działające z uprawnieniami
superużytkownika i wobec tego tylko one mogą korzystające z
polityk szeregowania
SCHED_FIFO i
SCHED_RR. Wywołania
systemowe
sched_get_priority_min i
sched_get_priority_max
służą do określania zakresów priorytetów
odpowiadających określonym politykom w sposób przenośny,
właściwy dla systemów zgodnych z POSIX.1b.
Szeregowanie zadań jest wywłaszczające: jeśli proces o
wyższym priorytecie statycznym staje się gotowy do działania,
proces bieżący zostanie wywłaszczony i wróci do swojej
kolejki oczekiwania. Polityka szeregowania zadań określa tylko
kolejność na liście działających procesów o tym
samym priorytecie statycznym.
SCHED_FIFO: Szeregowanie typu pierwszy na wejściu-pierwszy
na wyjściu¶
(First In-First Out),
SCHED_FIFO, może być używane tylko
ze statycznymi priorytetami wyższymi niż 0 oznaczającymi,
że gdy proces
SCHED_FIFO stanie się gotowy do działania,
to zawsze i natychmiast wywłaszczy wszystkie aktualnie
działające procesy
SCHED_OTHER.
SCHED_FIFO jest
prostym algorytmem szeregowania bez kwantowania czasu. Procesów
szeregowanych według polityki
SCHED_FIFO dotyczą
następujące reguły: Proces
SCHED_FIFO, który
został wywłaszczony przez inny proces o wyższym priorytecie
pozostanie na początku listy dla swojego priorytetu i jego wykonywanie
zostanie wznowione, gdy tylko procesy o wyższym priorytecie zostaną
znów zablokowane. Gdy proces
SCHED_FIFO staje się gotowy do
działania, jest on wstawiany na koniec listy dla swojego priorytetu.
Wywołanie
sched_setscheduler lub
sched_setparam wstawia
proces
SCHED_FIFO (lub
SCHED_RR), określony przez
pid na początek listy (o ile był on uruchamialny). W wyniku
tego, może on wywłaszczyć aktualnie działający
proces, jeśli oba mają ten sam priorytet. (POSIX 1003.1
określa, że proces powinien trafiać na koniec listy.) Proces
wywołujący
sched_yield zostanie wstawiony na koniec listy.
Żadne inne zdarzenia nie mogą przesunąć procesu,
szeregowanego wedłu polityki
SCHED_FIFO, a znajdującego
się na liście procesów oczekujących o jednakowych
statycznych priorytetach. Proces
SCHED_FIFO działa dopóki nie
zostanie zablokowany przez żądanie we/wy, wywłaszczenie przez
proces o wyższym priorytecie, lub przez wywołanie (samodzielne)
funkcji
sched_yield.
SCHED_RR: Szeregowanie typu cyklicznego (Round Robin),¶
SCHED_RR, jest prostym rozszerzeniem
SCHED_FIFO. Wszystko, co
powiedziano o
SCHED_FIFO, dotyczy także
SCHED_RR, z tym
że każdy z procesów może działać tylko przez
określony okres (kwant) czasu. Jeśli proces działający
według polityki
SCHED_RR działa przez czas dłuższy
lub równy temu okresowi, zostanie on wstawiony na koniec listy dla
swojego priorytetu. Proces
SCHED_RR, który został
wywłaszczony przez proces o wyższym priorytecie i wznowił
działanie, dokończy niewykorzystaną część
cyklicznego kwantu czasu. Długość kwantu czasu można
odczytać za pomocą funkcji
sched_rr_get_interval.
SCHED_OTHER: Domyślne szeregowanie linuksowe,¶
SCHED_OTHER, może być używane tylko ze statycznym
priorytetem równym 0.
SCHED_OTHER jest standardową
linuksową procedurą szeregowania zadań poprzez przydzielanie
czasu, przeznaczoną dla wszystkich procesów, które nie
mają specjalnych wymagań odnośnie czasu rzeczywistego
wymagających wykorzystania mechanizmu priorytetów statycznych.
Proces, który ma być uruchomiony, jest wybierany z listy dla
priorytetu statycznego 0 w oparciu o określany jedynie wewnątrz tej
listy priorytet dynamiczny. Wspomniany priorytet dynamiczny jest oparty na
wartości "nice" (ustawianej za pomocą funkcji systemowych
nice i
setpriority) i zwiększany w każdym kwancie
czasu, w którym proces jest gotów do działania, lecz procedura
szeregująca mu tego zabrania. Zapewnia to uczciwy postęp wszystkim
procesom polityki
SCHED_OTHER.
Czas odpowiedzi¶
Zablokowany proces o wysokim priorytecie, oczekujący na we/wy ma
określony czas odpowiedzi przed ponownym jego szeregowaniem. Autor
sterownika urządzenia może znacznie zmniejszyć czas odpowiedzi,
używając procedury obsługi przerwań typu "slow
interrupt".
Różne¶
Procesy potomne dziedziczą poprzez
fork(2) algorytm szeregowania i
parametry.
Procesom czasu rzeczywistego do unikania opóźnień stronicowania
zazwyczaj potrzebne jest blokowanie pamięci. Może ono być
wykonane za pomocą
mlock(2) lub
mlockall(2).
Ponieważ nieblokująca nieskończona pętla w procesie,
szeregowanym wegług polityki
SCHED_FIFO lub
SCHED_RR
będzie (wiecznie) blokować wszystkie procesy o niższym
priorytecie, twórca oprogramowania powinien na konsoli zawsze
trzymać dostępną powłokę, szeregowaną z
wyższym priorytetem statycznym niż testowana aplikacja.
Umożliwi ona awaryjne ubicie testowanych aplikacji czasu rzeczywistego,
które nie blokują, lub nie kończą się zgodnie z
oczekiwaniami. Jako że procesy
SCHED_FIFO i
SCHED_RR
mogą wywłaszczać inne procesy na zawsze, tylko procesy roota
mogą włączać te polityki szeregowania zadań.
Systemy POSIX-owe, na których dostępne są
sched_setscheduler i
sched_getscheduler, definiują w
<unistd.h>
_POSIX_PRIORITY_SCHEDULING.
WARTOŚĆ ZWRACANA¶
Po pomyślnym zakończeniu,
sched_setscheduler zwraca zero. Po
pomyślnym zakończeniu,
sched_getscheduler zwraca
politykę dla procesu (nieujemna liczba całkowita). Po
błędzie, zwracane jest -1 i odpowiednio ustawiane
errno.
BŁĘDY¶
- ESRCH
- Proces o identyfikatorze pid nie został
znaleziony.
- EPERM
- Proces wołający nie ma odpowiednich
uprawnień. Tylko procesy roota mogą włączać
polityki SCHED_FIFO oraz SCHED_RR. Proces wołający
sched_setscheduler musi mieć efektywny uid równy euid lub
uid procesu identyfikowanego przez pid lub musi być procesem
superużytkownika.
- EINVAL
- Polityka szeregowania zadań policy nie jest
żadną ze znanych polityk lub parametr p nie ma sensu dla
danej polityki.
ZGODNE Z¶
POSIX.1b (wcześniej POSIX.4)
USTERKI¶
W systemie linux-1.3.81 polityka
SCHED_RR nie została jeszcze
dokładnie przetestowana i może nie zachowywać się
dokładnie tak, jak opisano w POSIX.1b.
UWAGA¶
Standardowy Linux jest systemem operacyjnym do ogólnych zastosowań i
wspiera: procesy drugoplanowe, aplikacje interakcyjne i aplikacje
miękkiego czasu rzeczywisyego (aplikacje, które zazwyczaj
napotykają na nieprzekraczalne terminy w przebiegach czasowych).
Niniejsza strona podręcznika jest zorientowana na te rodzaje aplikacji.
Standardowy Linux
nie jest zaprojektowany do obsługi aplikacji
twardego czasu rzeczywistego, to znaczy aplikacji, w których
nieprzekraczalne terminy (często znacznie krótsze niż sekunda)
muszą być zagwarantowane lub system zawiedzie katastroficznie.
Podobnie, jak wszystkie systemy do ogólnych zastosowań, Linux
został zaprojektowany aby zmaksymalizować wydajność dla
przypadków przeciętnych, zamiast wydajności dla przypadków
najgorszych. Wydajność Linuksa w obsłudze przerwań jest
dla przypadków najgorszych znacznie gorsza niż dla przypadków
przeciętnych. Jego liczne blokady kernela (takie, jak dla SMP)
powodują długie maksymalne czasy oczekiwania, a wiele z
zastosowanych w nim technik zwiększających wydajność,
zmniejsza średni czas poprzez zwiększenie czasu dla przypadków
najgorszych. W większości sytuacji jest to to, czego się
oczekuje, lecz gdy rzeczywiście rozwijana jest aplikacja twardego czasu
rzeczywistego, należy rozważyć zastosowanie rozszerzeń
twardego czasu rzeczywistego dla Linuksa, takich jak RTLinux
(
http://www.rtlinux.org) lub skorzystać z innego systemu operacyjnego,
zaprojektowanego specjalnie dla aplikacji twardego czasu rzeczywistego.
ZOBACZ TAKŻE¶
sched_setaffinity(2),
sched_getaffinity(2),
sched_setparam(2),
sched_getparam(2),
sched_yield(2),
sched_get_priority_max(2),
sched_get_priority_min(2),
sched_rr_get_interval(2),
nice(2),
setpriority(2),
getpriority(2),
mlockall(2),
munlockall(2),
mlock(2),
munlock(2)
Programming for the real world - POSIX.4 Billa O. Gallmeistera, O'Reilly
& Associates, Inc., ISBN 1-56592-074-0
IEEE Std 1003.1b-1993 (standard POSIX.1b)
ISO/IEC 9945-1:1996 - jest to nowa rewizja (1996) POSIX.1, która
zawiera jako jednolity tekst standardy POSIX.1(1990), POSIX.1b(1993),
POSIX.1c(1995) i POSIX.1i(1995).
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 2 sched_setscheduler
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.