sched_setscheduler(2)

NAZWA
sched_setscheduler, sched_getscheduler - ustawia i pobiera algorytm/parametry szeregowania zadań

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <sched.h>

int sched_setscheduler(pid_t pid, int policy,
                       const struct sched_param *param);
int sched_getscheduler(pid_t pid);

OPIS
Wywołanie systemowe sched_getscheduler ustawia zarówno algorytm jak i parametry szeregowania zadań wątku, którego identyfikator podano w pid. Jeśli pid jest równe zeru, to ustawiany jest algorytm i parametry szeregowania zadań wątku wywołującego.

Parametry szeregowania zadań są określane w argumencie param, który jest wskaźnikiem do struktury w następującej postaci:

    struct sched_param {
        ...
        int sched_priority;
        ...
    };

W bieżącej implementacji, struktura zawiera tylko jedno pole: sched_priority. Interpretacja param zależy od wybranego algorytmu.

Obecnie, Linux obsługuje następujące „zwykłe” (tj. nie czasu rzeczywistego) algorytmy szeregowania zadań, które można podać jako wartości policy:

SCHED_OTHER
    standardowy algorytm dzielenia czasu za pomocą szeregowania rotacyjnego;

SCHED_BATCH
    do wykonywania procesów w stylu „wsadowym” oraz

SCHED_IDLE
    do uruchamiania zadań tła, o bardzo niskim priorytecie.

Dla każdego z powyższych algorytmów, param->sched_priority musi wynosić 0.

Obsługiwane są również różne algorytmy „czasu rzeczywistego”, nadające się do specjalnych aplikacji, gdzie krytyczna jest precyzyjna kontrola nad sposobem, w jaki działające wątki są wybierane do wykonania. Aby dowiedzieć się więcej o zasadach regulujących okoliczności, w jakich wątki procesu mogą używać tych algorytmów, należy zapoznać się z podręcznikiem sched(7). Algorytmy czasu rzeczywistego, jakie można określić w policy to:

SCHED_FIFO
    algorytm: pierwszy na wejściu, pierwszy na wyjściu oraz

SCHED_RR
    szeregowanie rotacyjne (karuzelowe).

Dla każdego z powyższych algorytmów, param->sched_priority określa priorytet szeregowania zadań dla wątku. Jest to liczba w zakresie zwracanym przez wywołanie sched_get_priority_min(2) i sched_get_priority_max(2) z podanym policy. W Linuksie te wywołania systemowe zwracają, odpowiednio: 1 i 99.

Od Linuksa 2.6.32, znacznik SCHED_RESET_ON_FORK może być zsumowany logicznie (OR) w policy, przy wywoływaniu sched_setscheduler(). Dzięki podaniu tego znacznika, potomkowie utworzeni przez fork(2) nie dziedziczą uprzywilejowanych algorytmów szeregowania zadań. Więcej informacji w podręczniku sched(7).

sched_getscheduler() zwraca bieżący algorytm szeregowania zadań, który dotyczy wątku określonego przez pid. Jeśli pid jest równe zeru, to pobierany jest algorytm dotyczący wątku wywołującego.

WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu, sched_setscheduler() zwraca zero. Po pomyślnym zakończeniu, sched_getscheduler zwraca algorytm dotyczący wątku (nieujemna liczba całkowita). Po błędzie, oba wywołania zwracają -1 i ustawiają errno wskazując błąd.

BŁĘDY

EINVAL
    Nieprawidłowe argumenty: pid jest ujemne lub param wynosi NULL.

EINVAL
    (sched_setscheduler()) policy nie jest jednym ze znanych algorytmów.

EINVAL
    (sched_setscheduler()) param nie ma sensu w podanym policy.

EPERM
    Wątek wywołujący nie ma odpowiednich przywilejów.

ESRCH
    Nie znaleziono wątku o identyfikatorze równym pid.

WERSJE
POSIX.1 nie określa szczegółowo, jakich uprawnień wymaga wątek nieuprzywilejowany, do wywołania sched_setscheduler(), a detale te różnią się między systemami. Przykładowo, strona podręcznika systemu Solaris 7 informuje, że rzeczywisty lub efektywny identyfikator użytkownika wywołującego musi odpowiadać rzeczywistemu identyfikatorowi użytkownika lub zapisanemu set-user-ID celu.

Algorytm i parametry szeregowania zadań są w Linuksie w rzeczywistości atrybutami przypisanymi wątkowi. Wartość zwracaną przez wywołanie gettid(2) można przekazać w argumencie pid. Podanie pid równego 0 będzie oznaczało działanie na atrybutach wątku wywołującego, a przekazanie wartości zwróconej przez wywołanie getpid(2), będzie oznaczało działanie na atrybutach głównego wątku w grupie wątku (jeśli korzysta się z interfejsu programistycznego wątków POSIX, należy korzystać z pthread_setschedparam(3), pthread_getschedparam(3) i pthread_setschedprio(3), zamiast z wywołań systemowych sched_*(2)).

STANDARDY
POSIX.1-2024 (lecz zob. USTERKI poniżej).

SCHED_BATCH() i SCHED_IDLE() są typowo linuksowe.

HISTORIA
POSIX.1-2001.

UWAGI
Dalsze szczegóły odnośnie semantyki wszystkich powyższych algorytmów szeregowania zadań „zwykłych” i „czasu rzeczywistego” opisano w podręczniku systemowym sched(7). Zawarto tam także opis dodatkowego algorytmu, SCHED_DEADLINE, który można ustawić jedynie za pomocą sched_setattr(2).

Systemy POSIX-owe, na których dostępne są sched_setscheduler() i sched_getscheduler(), definiują w <unistd.h> _POSIX_PRIORITY_SCHEDULING.

USTERKI
POSIX.1 wskazuje, że przy powodzeniu, sched_setscheduler() powinno zwrócić poprzedni algorytm szeregowania zadań. sched_setscheduler() w Linuksie nie jest zgodne z tym wymaganiem, ponieważ w przypadku powodzenia zawsze zwraca 0.

ZOBACZ TAKŻE
chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getattr(2), sched_getparam(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setattr(2), sched_setparam(2), sched_yield(2), setpriority(2), capabilities(7), cpuset(7), sched(7)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.