Różnica polega na tym, że PR jest w tej chwili prawdziwym priorytetem procesu w jądrze, a NI jest jedynie wskazówką dla jądra, jaki priorytet powinien mieć proces.
W większości przypadków wartość PR można obliczyć według następującego wzoru: PR = 20 + NI . Zatem proces z nicością 3 ma priorytet 23 (20 + 3), a proces z nicią -7 ma priorytet 13 (20 - 7). Możesz sprawdzić pierwszy, uruchamiając polecenie nice -n 3 top
. Pokaże, że najwyższy proces ma NI 3 i PR 23 . Ale do działania nice -n -7 top
w większości systemów Linux musisz mieć uprawnienia roota, ponieważ w rzeczywistości niższa wartość PR jest tym wyższym priorytetem. Zatem proces z PR 13 ma wyższy priorytet niż procesy ze standardowym priorytetem PR 20. Dlatego musisz być rootem. Ale minimalną dopuszczalną wartość dla procesu innego niż root można skonfigurować w /etc/security/limits.conf .
Teoretycznie jądro może samo zmieniać wartość PR (ale nie NI ). Na przykład może zmniejszyć priorytet procesu, jeśli zużywa zbyt dużo procesora, lub może zwiększyć priorytet procesu, jeśli proces ten nie miał szansy działać przez długi czas z powodu innych procesów o wyższym priorytecie. W takich przypadkach wartość PR zostanie zmieniona przez jądro, a NI pozostanie taki sam, dlatego formuła „PR = 20 + NI” nie będzie poprawna. Tak więc wartość NI może być interpretowana jako wskazówka dla jądra, jaki priorytet powinien mieć proces, ale jądro może samodzielnie wybrać rzeczywisty priorytet ( wartość PR ) w zależności od sytuacji. Ale zwykle formuła„PR = 20 + NI” jest poprawne.
Dokładne zasady zmiany priorytetu jądra nie są jasne. Instrukcja setpriority (funkcja, która zmienia niezłą wartość) mówi:
Efekt zmiany wartości Nicei może się różnić w zależności od obowiązującego algorytmu szeregowania procesów.
Podręcznik Pthread mówi:
Dynamiczny priorytet jest oparty na wartości Nicei (ustawianej przez nice (2), setpriority (2) lub schedul_setattr (2)) i zwiększany za każdym razem, gdy kwant wątek jest gotowy do uruchomienia, ale nie został uruchomiony przez program planujący.
Wydaje się, że wartość PR odpowiada dynamicznemu priorytetowi.
Zakres wartości NI wynosi -20..19 . Zatem wartość PR może mieć wartości od 0 (20-20) do 39 (20 + 19). Ale jest to poprawne tylko dla procesów z domyślną polityką planowania ( SHED_OTHER ). Mogą istnieć również procesy z tak zwanymi zasadami planowania w „czasie rzeczywistym” . Te zasady to SCHED_RR i SCHED_FIFO . Takie procesy mają wartość PR mniejszą niż 0. Możesz to sprawdzić, uruchamiając chrt -r 1 top
polecenie (musisz być rootem). Góry proces ma PR -2 . Możesz nawet uruchomić chrt -r 90 top
w takim przypadku góręproces będzie miał PR -91 .
Wydaje się, że dla procesów SCHED_RR wartość PR można obliczyć ze wzoru:
PR = - 1 - schedule_rr_priority .
Zatem proces SCHED_RR ma przynajmniej PR -1, co oznacza, że każdy proces SCHED_RR ma wyższy priorytet niż jakikolwiek SCHED_OTHER . Odpowiada to instrukcji pthread:
SCHED_FIFO może być używane tylko z priorytetami statycznymi wyższymi niż 0, co oznacza, że gdy wątki SCHED_FIFO staną się uruchamialne, zawsze natychmiast zapobiegnie wszelkim działającym wątkom SCHED_OTHER, SCHED_BATCH lub SCHED_IDLE.
SCHED_RR to proste rozszerzenie SCHED_FIFO. Wszystko opisane powyżej dla SCHED_FIFO dotyczy również SCHED_RR,
Priorytet procesów w czasie rzeczywistym nazywany jest priorytetem statycznym, którego jądro nie może zmienić. Tak pozytywne PR wartości mogą być traktowane jako priorytet dynamiczny dla non-realtime ( SCHED_OTHER , SCHED_BATCH ) procesy i negatywnym PR wartości jako statyczny priorytet dla procesów w czasie rzeczywistym ( SCHED_RR , SCHED_FIFO ).
Próbowałem także uruchomić nice -n 10 chrt -r 50 top
(i chrt -r 50 nice -n 10 top
). Wartość NI wynosiła 10, ale PR nadal wynosił -51 . Wygląda więc na to, że wartość NI nie wpływa na priorytet procesów SCHED_RR . Odpowiada to instrukcji setpriority :
Wszelkie procesy lub wątki używające SCHED_FIFO lub SCHED_RR nie będą miały wpływu na wywołanie setpriority (). To nie jest uważane za błąd. Proces, który następnie powraca do SCHED_OTHER, nie musi mieć wpływu na priorytet takiego wywołania setpriority ().
Jedna zabawna notatka. Jeśli uruchomisz chrt -r 99 top
, zobaczysz wartość RT zamiast liczby w kolumnie PR .
PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND
28489 root RT 0 2852 1200 896 R 0 0,1 0: 00,01 góra
Nie sądzę, że oznacza to, że proces ten jest teraz wyjątkowy. Myślę, że to oznacza, że top po prostu nie drukuje -100, ponieważ wydruk wymagałby 4 znaków.
Możesz również użyć htop zamiast góry we wszystkich przykładach, które mogą być wygodniejsze. ps -l
może być również użyty, ale punktem bazowym oddzielającym priorytety w czasie rzeczywistym i nie w czasie rzeczywistym nie jest 0, ale 60, więc nice -n -20 ps -l
zostanie wydrukowany
FS UID PID PPID C PRI NI ADRES SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60-20 - 1176 - pkt / 6 00:00:00 ps