Rozdíl je v tom, že PR je skutečnou prioritou procesu v současné době uvnitř jádra a NI je jen náznak pro jádro, jakou prioritu by proces měl mít.
Ve většině případů PR hodnotu lze vypočítat podle následujícího vzorce:PR =20 + NI . Proces s jemností 3 má tedy prioritu 23 (20 + 3) a proces s jemností -7 má prioritu 13 (20 - 7). První můžete zkontrolovat spuštěním příkazu nice -n 3 top
. Ukáže, že nahoře proces má NI 3 a PR 23 . Ale pro spuštění nice -n -7 top
ve většině linuxových systémů musíte mít práva root, protože ve skutečnosti mají nižší PR hodnota je vyšší skutečná priorita. Tedy proces s PR 13 má vyšší prioritu než procesy se standardní prioritou PR 20 . Proto musíte být root. Minimální hodnotu zdvořilosti povolenou pro proces bez oprávnění root však lze nakonfigurovat v /etc/security/limits.conf .
Teoreticky může jádro změnit PR hodnotu (ale ne NI ) sama o sobě. Může například snížit prioritu procesu, pokud spotřebovává příliš mnoho CPU, nebo může zvýšit prioritu procesu, pokud tento proces neměl šanci běžet po dlouhou dobu kvůli jiným procesům s vyšší prioritou. V těchto případech PR hodnota bude změněna jádrem a NI zůstane stejný, takže vzorec "PR =20 + NI" nebude správné. Takže NI hodnotu lze interpretovat jako nápovědu pro jádro, jakou prioritu by měl proces mít, ale jádro si může zvolit skutečnou prioritu (PR hodnota) sama o sobě v závislosti na situaci. Ale obvykle vzorec "PR =20 + NI" je správně.
Přesná pravidla, jak jádro mění prioritu, nejsou jasná. nastavení priority (funkce, která mění pěkné hodnoty) manual říká:
Účinek změny hodnoty nice se může lišit v závislosti na použitém algoritmu plánování procesu.
Pthread manual říká následující:
Dynamická priorita je založena na hodnotě nice (nastavené pomocí nice(2), setpriority(2) nebo sched_setattr(2)) a zvyšuje se pokaždé, když je vlákno připraveno ke spuštění, ale plánovač jej zakázal.
Zdá se, že PR hodnota odpovídá dynamické prioritě.
Rozsah NI hodnota je -20..19 . Tedy PR hodnota může mít hodnoty od 0 (20–20) až 39 (20 + 19). Ale je to správné pouze pro procesy s výchozí zásadou plánování (SHED_OTHER ). Mohou existovat i procesy s tzv. "reálným časem" zásady plánování. Tyto zásady jsou SCHED_RR a SCHED_FIFO . Takové procesy mají PR hodnotu menší než 0. Můžete to zkontrolovat spuštěním chrt -r 1 top
příkaz (musíte být root). nahoře proces bude mít PR -2 . Můžete dokonce spustit chrt -r 90 top
v takovém případě nahoře proces bude mít PR -91 .
Zdá se, že pro SCHED_RR zpracovává PR hodnotu lze vypočítat podle vzorce:
PR =- 1 - sched_rr_priority .
Tedy SCHED_RR proces má alespoň PR -1 což znamená, že jakékoli SCHED_RR proces má vyšší prioritu než jakýkoli SCHED_OTHER . To odpovídá návodu pthread:
SCHED_FIFO lze použít pouze se statickými prioritami vyššími než 0, což znamená, že když se vlákno SCHED_FIFO stane spustitelným, vždy okamžitě vyřadí jakékoli aktuálně běžící vlákno SCHED_OTHER, SCHED_BATCH nebo SCHED_IDLE.
SCHED_RR je jednoduché vylepšení SCHED_FIFO. Vše popsané výše pro SCHED_FIFO platí také pro SCHED_RR,
Priorita procesů v reálném čase je označována jako statická priorita, kterou jádro nemůže změnit. Takže pozitivní PR hodnoty lze považovat za dynamickou prioritu pro nereálný čas (SCHED_OTHER , SCHED_BATCH ) procesy a negativní PR hodnotu jako statickou prioritu pro procesy v reálném čase (SCHED_RR , SCHED_FIFO ).
Zkoušel jsem také spustit nice -n 10 chrt -r 50 top
(a chrt -r 50 nice -n 10 top
). NI hodnota byla 10, ale PR stále bylo -51 . Zdá se tedy, že NI hodnota nemá vliv na prioritu SCHED_RR procesy. To odpovídá nastavené prioritě manuál:
Žádné procesy nebo vlákna používající SCHED_FIFO nebo SCHED_RR nesmí být ovlivněny voláním setpriority(). To se nepovažuje za chybu. Proces, který se následně vrátí na SCHED_OTHER, nemusí mít takovou prioritu ovlivněnou voláním setpriority().
Jedna vtipná poznámka. Pokud spustíte chrt -r 99 top
, uvidíte RT hodnotu namísto čísla v PR sloupec.
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 top
Nemyslím si, že to znamená, že tento proces je nyní zvláštní. Myslím, že to znamená, že nahoře jen netiskněte -100 protože tisk by zabral 4 znaky.
Můžete také použít htop místo top ve všech příkladech, které mohou být pohodlnější. ps -l
lze také použít, ale základní bod, který odděluje priority v reálném čase a mimo něj, není 0, ale 60, takže nice -n -20 ps -l
vytiskne
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 R 0 28983 28804 0 60 -20 - 1176 - pts/6 00:00:00 ps
Hodnota nice je „globální“ mechanismus, zatímco priorita je relevantní pro přepínač úloh právě teď .