GNU/Linux >> Znalost Linux >  >> Linux

Rozdíl mezi pěknou hodnotou a prioritou v nejvyšším výstupu

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


Linux
  1. Jaký je rozdíl mezi InnoDB a MyISAM?

  2. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  3. Rozdíl mezi ~/.profile a ~/.bash_profile?

  1. Rozdíl mezi Nss a Pam?

  2. Rozdíl mezi haldou Java a nativní haldou C

  3. Jaký je rozdíl mezi fsck a e2fsck?

  1. Jaký je rozdíl mezi Sudo Su – a Sudo Su –?

  2. Jaký je rozdíl mezi adduser a useradd?

  3. Jaký je rozdíl mezi unlink a rm?