sched_setattr(2) System Calls Manual sched_setattr(2) NAZWA sched_setattr, sched_getattr - ustawia i pobiera algorytm i parametry szeregowania BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include /* Definicja stalych SCHED_* */ #include /* Definicja stalych SYS_* */ #include int syscall(SYS_sched_setattr, pid_t pid, struct sched_attr *attr, unsigned int flags); int syscall(SYS_sched_getattr, pid_t pid, struct sched_attr *attr, unsigned int size, unsigned int flags); Uwaga: glibc nie udostepnia opakowania dla tych wywolan systemowych, co wymusza uzycie syscall(2). OPIS sched_setattr() Wywolanie systemowe sched_setattr() ustawia algorytm szeregowania i powiazane atrybuty watku, ktorego identyfikator podano w pid. Jesli pid rowna sie zero, ustawi algorytm i parametry szeregowania watku wywolujacego. Obecnie, Linux obsluguje nastepujace ,,zwykle" (tj. nie czasu rzeczywistego) algorytmy szeregowania zadan, ktore mozna podac jako wartosci policy: SCHED_OTHER standardowy algorytm dzielenia czasu za pomoca szeregowania rotacyjnego; SCHED_BATCH do wykonywania procesow w stylu ,,wsadowym" oraz SCHED_IDLE do uruchamiania zadan tla, o bardzo niskim priorytecie. Obslugiwane sa rowniez rozne algorytmy ,,czasu rzeczywistego", nadajace sie do specjalnych aplikacji, gdzie krytyczna jest precyzyjna kontrola nad sposobem, w jaki dzialajace watki sa wybierane do wykonania. Aby dowiedziec sie wiecej o zasadach regulujacych okolicznosci, w jakich watki procesu moga uzywac tych algorytmow, nalezy zapoznac sie z podrecznikiem sched(7). Algorytmy czasu rzeczywistego, jakie mozna okreslic w policy to: SCHED_FIFO algorytm: pierwszy na wejsciu, pierwszy na wyjsciu oraz SCHED_RR szeregowanie rotacyjne (karuzelowe). Linux zapewnia rowniez ponizszy algorytm: SCHED_DEADLINE szeregowanie sporadyczne z budzetem czasu; wiecej szczegolow w podreczniku sched(7). Argument attr jest wskaznikiem do struktury definiujacej nowy algorytm szeregowania, wraz z atrybutami, danego watku. Struktura ma postac: struct sched_attr { u32 size; /* Rozmiar tej struktury */ u32 sched_policy; /* Algorytm (SCHED_*) */ u64 sched_flags; /* Znaczniki */ s32 sched_nice; /* Wartosc nice (SCHED_OTHER, SCHED_BATCH) */ u32 sched_priority; /* Priorytet statyczny (SCHED_FIFO, SCHED_RR) */ /* W SCHED_DEADLINE */ u64 sched_runtime; u64 sched_deadline; u64 sched_period; /* Wskazowki dot. uzycia */ u32 sched_util_min; u32 sched_util_max; Polami struktury sched_attr sa: size Pole powinno byc ustawione na rozmiar struktury w bajtach, jak w sizeof(struct sched_attr). Jesli zapewniona struktura jest mniejsza niz struktura jadra, dodatkowe pola sa przyjmowane jako '0'. Jesli zapewniona struktura jest wieksza niz struktura jadra, jadro weryfikuje, czy wszystkie dodatkowe pola wynosza 0; jesli tak nie jest, sched_setattr() zawodzi z bledem E2BIG i aktualizuje size tak, aby zawieralo rozmiar struktury jadra. Powyzsze zachowanie dotyczace przypadku, gdy rozmiar struktury sched_attr z przestrzeni uzytkownika nie pasuje do rozmiaru struktury jadra, pozwala na rozszerzenie interfejsu w przyszlosci. Nieprawidlowe aplikacje przekazujace nadmiarowe struktury beda wciaz dzialac w przyszlosci, jesli rozmiar struktury sched_attr jadra ulegnie zwiekszeniu. W przyszlosci, moze rowniez pozwolic aplikacjom, ktore wiedza o wiekszej strukturze sched_attr w przestrzeni uzytkownika na okreslenie, czy dzialaja na starszym jadrze, nieobslugujacym wiekszej struktury. sched_policy Pole okresla algorytm szeregowania, bedacy jedna z wartosci SCHED_* podanych wyzej. sched_flags Pole zawiera jeden lub wiecej zsumowanych (OR) ponizszych znacznikow, sluzacych do kontroli zachowania szeregowania zadan: SCHED_FLAG_RESET_ON_FORK Potomkowie utworzeni przez fork(2) nie odziedzicza uprzywilejowanych algorytmow szeregowania. Wiecej szczegolow w podreczniku sched(7). SCHED_FLAG_RECLAIM (od Linuksa 4.13) Znacznik pozwala watkowi SCHED_DEADLINE na odzyskanie przepustowosci nieuzywanej przez inne watki czasu rzeczywistego. SCHED_FLAG_DL_OVERRUN (od Linuksa 4.16) Znacznik pozwala na informowanie aplikacji o przekroczeniu czasu dzialania w watkach SCHED_DEADLINE. Moze byc ono spowodowane (na przyklad) przez zbyt zgrubne liczenie czasu lub nieprawidlowe przypisanie parametrow. Informowanie zachodzi za posrednictwem sygnalu SIGXCPU, wysylanego przy kazdym przekroczeniu czasu dzialania. Sygnal SIGXCPU jest sygnalem skierowanych do procesu (zob. signal(7)), a nie skierowanym do watku. Nalezy to prawdopodobnie traktowac jako usterke. Z jednej strony, sched_setattr() jest uzywane do ustawienia atrybutu przynaleznemu watkowi. Z drugiej strony, jesli sygnal skierowany do procesu jest dostarczony do watku wewnatrz procesu, innego niz ten, ktory przekroczyl czas dzialania, aplikacja nie ma sposobu, aby zidentyfikowac watek winowajce. SCHED_FLAG_UTIL_CLAMP_MIN SCHED_FLAG_UTIL_CLAMP_MAX (oba od Linuksa 5.3) Znaczniki wskazuja, ze obecne jest, odpowiednio, pole sched_util_min lub sched_util_max, reprezentujac oczekiwane minimalne i maksymalne uzycie przez watek. Atrybuty uzycia zakreslaja dyspozytorowi granice, pomiedzy ktorymi powinien szeregowac watek, potencjalnie pomagajac podejmowac decyzje dotyczace umieszczenia zadania i czestotliwosci jego wyboru. sched_nice Pole okresla wartosc nice do ustawienia przy przekazywaniu algorytmu szeregowania sched_policy SCHED_OTHER lub SCHED_BATCH. Wartosc nice jest liczba z przedzialu od -20 (wysoki priorytet) do +19 (niski priorytet); zob. sched(7). sched_priority Pole okresla statyczny priorytet do ustawienia przy przekazywaniu algorytmu szeregowania sched_policy SCHED_FIFO lub SCHED_RR. Dozwolony przedzial priorytetow w tych algorytmach mozna sprawdzic za pomoca sched_get_priority_min(2) i sched_get_priority_max(2). Przy innych algorytmach, to pole musi byc ustawione na 0. sched_runtime Pole okresla parametr ,,Czas Dzialania" przy szeregowaniu z budzetem czasu. Wartosc jest wyrazana w nanosekundach. Pole to, razem z kolejnymi dwoma, jest uzywane tylko przy algorytmie SCHED_DEADLINE; szerszy opis w podreczniku sched(7). sched_deadline Pole okresla parametr ,,Limit" przy szeregowaniu z budzetem czasu. Wartosc jest wyrazana w nanosekundach. sched_period Pole okresla parametr ,,Okres" przy szeregowaniu z budzetem czasu. Wartosc jest wyrazana w nanosekundach. sched_util_min sched_util_max (oba od Linuksa 5.3) Pola okreslaja, odpowiednio, minimalne i maksymalne oczekiwane uzycie. Sa ignorowane, chyba ze w sched_flags ustawiono, odpowiednio, SCHED_FLAG_UTIL_CLAMP_MIN lub SCHED_FLAG_UTIL_CLAMP_MAX . Uzycie jest wartoscia z przedzialu [0, 1024], reprezentujaca procentowy czas procesora uzywany przez zadania dzialajace przy maksymalnej czestotliwosci na najmocniejszym procesorze w systemie. Jest to reprezentacja stalopozycyjna, gdzie 1024 odpowiada 100%, a 0 odpowiada 0%. Na przyklad zadanie z 20% uzyciem jest zadaniem dzialajacym przez 2ms co kazde 10ms przy maksymalnej czestotliwosci i jest reprezentowane przez wartosc uzycia rowna 0.2 * 1024 = 205. Zadanie o minimalnej wartosci uzycia wiekszej od 0 ma wieksze prawdopodobienstwo uzyskania dostepu do procesora, ktorego mozliwosci sa wystarczajace do pomieszczenia podanej wartosci. Zadanie o maksymalnej wartosci uzycia mniejszej od 1024 ma wieksze prawdopodobienstwo uzyskania dostepu do procesora, ktorego mozliwosci sa nie wieksze niz podana wartosc. Granice uzycia zadania mozna zresetowac ustawiajac dane pole na UINT32_MAX (od Linuksa 5.11). Argument flags pozwala na przyszle rozszerzenia interfejsu; w biezacej implementacji musi byc okreslony jako 0. sched_getattr() Wywolanie systemowe sched_getattr() pobiera algorytm szeregowania, wraz z powiazanymi atrybutami, dla watku, ktorego identyfikator podano w pid. Jesli pid jest rowne zero, pobiera algorytm szeregowania, wraz z powiazanymi atrybutami, watku wywolujacego. Argument size nalezy ustawic na rozmiar struktury sched_attr znany przestrzeni uzytkownika. Wartosc musi byc co najmniej tak duza, jak rozmiar pierwotnie ogloszonej struktury sched_attr (por. opis E2BIG w rozdziale BLEDY - przyp. tlum.), w innym przypadku wywolanie zawiedzie z bledem EINVAL. Pobrane atrybuty szeregowania sa umieszczane w polach struktury sched_attr, na ktora wskazuje attr. Jadro ustawi attr.size na rozmiar jego struktury sched_attr. Jesli bufor attr zapewniony przez wywolujacego jest wiekszy niz struktura jadra sched_attr, dodatkowe bajty w strukturze w przestrzeni uzytkownika nie sa modyfikowane. Jesli struktura zapewniona przez wywolujacego jest mniejsza od struktury jadra sched_attr, jadro po cichu niz zwroci wartosci, ktore znalazlyby sie poza zapewniona przestrzenia. Podobnie jak przy sched_setattr(), takie zachowanie pozwala na przyszle rozszerzanie interfejsu. Argument flags pozwala na przyszle rozszerzenia interfejsu; w biezacej implementacji musi byc okreslony jako 0. WARTOSC ZWRACANA W przypadku powodzenia, sched_setattr() i sched_getattr() zwracaja 0. W razie wystapienia bledu zwracaja -1 i ustawiaja errno wskazujac blad. BLEDY sched_getattr() oraz sched_setattr() moga zawiesc z nastepujacych powodow: EINVAL attr wynosi NULL; albo pid jest ujemne; albo flags nie jest zerem. ESRCH Nie znaleziono watku o identyfikatorze rownym pid. Dodatkowo, sched_getattr() moze zawiesc z nastepujacych powodow: E2BIG Bufor okreslony przez size i attr jest zbyt maly. EINVAL size jest nieprawidlowy; tj. jest mniejszy niz pierwotna wersja struktury sched_attr (48 bajtow) lub jest wiekszy od systemowego rozmiaru strony. Dodatkowo, sched_setattr() moze zawiesc z nastepujacych powodow: E2BIG Bufor okreslony przez size i attr jest wiekszy niz struktura jadra, a jeden lub wiecej nadmiarowych bajtow jest niezerowy. EBUSY Blad testu przyjecia SCHED_DEADLINE, zob. sched(7). EINVAL attr.sched_policy nie jest jednym z rozpoznawanych algorytmow szeregowania. EINVAL attr.sched_flags zawiera znacznik inny niz SCHED_FLAG_RESET_ON_FORK. EINVAL attr.sched_priority jest nieprawidlowy. EINVAL attr.sched_policy wynosi SCHED_DEADLINE, a parametry szeregowania z budzetem czasu w attr sa nieprawidlowe. EINVAL attr.sched_flags zawiera SCHED_FLAG_UTIL_CLAMP_MIN lub SCHED_FLAG_UTIL_CLAMP_MAX, a attr.sched_util_min lub attr.sched_util_max sa spoza zakresu. EOPNOTSUPP Podano SCHED_FLAG_UTIL_CLAMP, lecz jadro zbudowano bez obslugi CONFIG_UCLAMP_TASK. EPERM Wywolujacy nie ma odpowiednich przywilejow. EPERM Maska koligacji procesora dla watku okreslonego przez pid nie obejmuje wszystkich procesorow w systemie (zob. sched_setaffinity(2)). STANDARDY Linux. HISTORIA Linux 3.14. UWAGI glibc nie zapewnia opakowan tych wywolan systemowych; nalezy je wywolac za pomoca syscall(2). sched_setattr() zapewnia nadzbior funkcjonalnosci sched_setscheduler(2), sched_setparam(2), nice(2) i (poza mozliwoscia ustawienia priorytetu wszystkich procesow nalezacych do podanego uzytkownika i wszystkich procesow w podanej grupie) setpriority(2). Analogicznie, sched_getattr() zapewnia nadzbior funkcjonalnosci sched_getscheduler(2), sched_getparam(2) i (czesciowo) getpriority(2). USTERKI W wersjach Linuksa do 3.15, sched_setattr() zawodzil z bledem EFAULT zamiast E2BIG, w przypadku opisanym w rozdziale BLEDY. Do Linuksa 5.3, sched_getattr() zawodzil z bledem EFBIG, jesli struktura jadra sched_attr byla wieksza od rozmiaru size przekazanego z przestrzeni uzytkownika. ZOBACZ TAKZE chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getparam(2), sched_getscheduler(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setparam(2), sched_setscheduler(2), sched_yield(2), setpriority(2), pthread_getschedparam(3), pthread_setschedparam(3), pthread_setschedprio(3), capabilities(7), cpuset(7), sched(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.18 8 lutego 2026 r. sched_setattr(2)