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