Fark, PR'nin çekirdeğin içindeki bir sürecin gerçek bir önceliği olması ve NI , çekirdeğin sürecin önceliğine sahip olması gereken bir ipucu olmasıdır.
Çoğu durumda PR değeri aşağıdaki formülle hesaplanabilir: PR = 20 + NI . Böylece 3 nolu incelikteki işlem 23 (20 + 3) önceliğine ve 7 nolu incelikli işlem 13 (20 - 7) önceliğine sahiptir. Komutu çalıştırarak ilkini kontrol edebilirsiniz nice -n 3 top
. Üst sürecin NI 3 ve PR 23 olduğunu gösterecektir . Ancak nice -n -7 top
çoğu Linux sisteminde çalıştırmak için kök ayrıcalıklarına sahip olmanız gerekir, çünkü aslında daha düşük PR değeri daha yüksek gerçek önceliktir. Dolayısıyla, PR 13 ile proses, standart öncelik PR 20 ile proseslerden daha yüksek önceliğe sahiptir.. Bu yüzden kök olmalısın. Ancak, root olmayan işlem için izin verilen minimum nicelik değeri /etc/security/limits.conf dosyasında yapılandırılabilir .
Teorik olarak çekirdek PR değerini ( NI değil ) kendi başına değiştirebilir. Örneğin, çok fazla CPU tüketiyorsa bir işlemin önceliğini azaltabilir veya diğer yüksek öncelikli işlemler nedeniyle uzun süre çalışma şansı yoksa bir işlemin önceliğini artırabilir. Bu durumlarda PR değeri çekirdek tarafından değiştirilecek ve NI aynı kalacaktır, bu nedenle "PR = 20 + NI" formülü doğru olmayacaktır. Bu nedenle NI değeri, işlem için önceliğe sahip olması gereken çekirdek için ipucu olarak yorumlanabilir, ancak çekirdek , duruma bağlı olarak kendi başına gerçek önceliği ( PR değeri) seçebilir . Ama genellikle formül"PR = 20 + NI" doğrudur.
Çekirdek önceliğini nasıl değiştirdiğinin kesin kuralları açık değildir. setpriority (güzel değeri değiştiren işlev) el kitabı:
Hoş değerin değiştirilmesinin etkisi, yürürlükteki işlem planlama algoritmasına bağlı olarak değişebilir.
Pthread kılavuzu şunları söylüyor:
Dinamik öncelik, güzel değere (nice (2), setpriority (2) veya sched_setattr (2) ile ayarlanır) dayanır ve iş parçacığının çalışmaya hazır olduğu her bir kuantum için artar, ancak zamanlayıcı tarafından çalıştırılması reddedilir.
PR değerinin dinamik önceliğe karşılık geldiği görülmektedir .
NI değerinin aralığı -20..19'dur . Böylece PR değeri 0 (20-20) ile 39 (20 + 19) arasında değerlere sahip olabilir . Ancak, yalnızca varsayılan zamanlama ilkesine ( SHED_OTHER ) sahip işlemler için doğrudur . "Gerçek zamanlı" zamanlama politikalarına sahip süreçler de olabilir . Bu politikalar SCHED_RR ve SCHED_FIFO'dur . Bu tür işlemlerin PR değeri 0'dan düşüktür. chrt -r 1 top
Komutu çalıştırarak bunu kontrol edebilirsiniz (root olması gerekir). En işlemi olacaktır PR -2 . Bu chrt -r 90 top
durumda üstte bile çalışabilirsinişlem PR -91 olacaktır .
O için görünüyor SCHED_RR işler PR değeri formül ile hesaplanabilir:
PR = - 1 - sched_rr_priority .
Böylece bir SCHED_RR işlemi en az PR -1 değerine sahiptir, bu da herhangi bir SCHED_RR işleminin herhangi bir SCHED_OTHER değerinden daha yüksek önceliğe sahip olduğu anlamına gelir . Bu pthread kılavuzuna karşılık gelir:
SCHED_FIFO yalnızca 0'dan yüksek statik önceliklerle kullanılabilir, yani bir SCHED_FIFO iş parçacığı çalıştırılabilir hale geldiğinde, o anda çalışan SCHED_OTHER, SCHED_BATCH veya SCHED_IDLE iş parçacığını her zaman hemen önler.
SCHED_RR, SCHED_FIFO'nun basit bir geliştirmesidir. SCHED_FIFO için yukarıda açıklanan her şey SCHED_RR için de geçerlidir,
Gerçek zamanlı işlemlerin önceliği, çekirdek tarafından değiştirilemeyen statik öncelik olarak adlandırılır. Yani pozitif PR değerleri olmayan gerçek zamanlı (dinamik öncelik olarak tedavi edilebilir SCHED_OTHER , SCHED_BATCH ) süreçleri ve negatif PR statik gerçek zamanlı işlemleri için öncelikli (olarak değer SCHED_RR , SCHED_FIFO ).
Ben de koşmaya çalıştım nice -n 10 chrt -r 50 top
(ve chrt -r 50 nice -n 10 top
). NI değeri 10 oldu, ama PR hala -51 . Yani NI değerinin SCHED_RR işlemlerinin önceliğini etkilemediği anlaşılıyor . Bu setpriority kılavuzuna karşılık gelir :
SCHED_FIFO veya SCHED_RR kullanan herhangi bir işlem veya iş parçacığı, setpriority () çağrısından etkilenmez. Bu bir hata olarak değerlendirilmez. Daha sonra SCHED_OTHER klasörüne geri dönen bir işlemin önceliğinin böyle bir setpriority () çağrısından etkilenmesi gerekmez.
Bir komik not. Çalıştırırsanız chrt -r 99 top
, PR sütununda bir sayı yerine RT değeri görürsünüz .
PID KULLANICI PR NI VIRT RES SHR S% CPU% MEM ZAMANI + KOMUT
28489 kök RT 0 2852 1200 896 R 0 0.1 0: 00.01 üst
Bunun sürecin artık özel olduğu anlamına geldiğini sanmıyorum. Bunun üst kısmın sadece -100 yazdırmayacağı anlamına geldiğini düşünüyorum, çünkü yazdırmak 4 karakter alacaktı.
Daha uygun olabilecek tüm örneklerde üst yerine htop da kullanabilirsiniz . kullanılabilir, ancak gerçek zamanlı ve gerçek zamanlı olmayan öncelikleri ayıran temel nokta 0 değil, 60'tır, bu nedenle yazdırılacaktırps -l
nice -n -20 ps -l
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY ZAMAN CMD
4 R 0 28983 28804 0 60-20 - 1176 - puan / 6 00:00:00 ps