sched_setscheduler

Autres langues

Langue: pl

Autres versions - même langue

Version: 2002-06-25 (openSuse - 09/10/07)

Autres sections - même nom

Section: 2 (Appels système)

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

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).