Üst çıktıda hoş değer ve öncelik arasındaki fark


11

üst , varsayılan olarak her iki sütunu da listeler. Aradaki farkın ne olduğunu merak ediyorum. Adam sayfalarına baktım ve anlayamıyorum:

Öncelik:

   h: PR  --  Priority
      The priority of the task.

Güzel değer:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

Nice değerinin Kernel'in CPU zamanlayıcı sırası ile ilişkili olduğunu anlıyorum ; Peki Öncelik neyi gösterir? I / O ile ilgili bir şey olabilir mi?

Yanıtlar:


8

Güzel değer "küresel" bir mekanizma iken, öncelik şu anda görev değiştiriciyle ilgilidir .


Görev değiştirici ile ne demek istiyorsun?
Belmin Fernandez

1
Görev değiştirici (düzgün bir şekilde "zamanlayıcı" olarak adlandırılır), çekirdek içinde bir sonraki işlemin ne olacağına karar veren küçük bir koddur.
Ignacio Vazquez-Abrams

25

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 topKomutu çalıştırarak bunu kontrol edebilirsiniz (root olması gerekir). En işlemi olacaktır PR -2 . Bu chrt -r 90 topdurumda ü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 -lnice -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

Garip bir şekilde, 2 çekirdek hiper iş parçacıklı i3 üzerinde 5 sonsuz döngü (int main {while (1);}) çalıştırırsam, öncelikleri sabit kalır. Bu debian sid testinde.
Vorac

2
@BelminFernandez Bu cevabı "kabul" etmenin adil olacağını düşünüyorum.
z0lupka

1

Kısa cevap

PR öncelik seviyesidir. PR ne kadar düşük olursa, sürecin önceliği o kadar yüksek olacaktır.

PR aşağıdaki gibi hesaplanır:

  • normal süreçler için: PR = 20 - NI (NI güzel ve -20 ila 19 aralığında)
  • gerçek zamanlı süreçler için: PR = - 1 - real_time_priority (real_time_priority 1 ile 99 arasında değişir)

Uzun cevap

Normal süreçler ve gerçek zamanlı olmak üzere 2 tür süreç vardır: Normal olanlar için (ve sadece bunlar için), nice aşağıdaki gibi uygulanır:

Güzel

"Güzellik" ölçeği -20'den 19'a geçerken, -20 en yüksek öncelik ve 19 en düşük önceliktir. Öncelik seviyesi aşağıdaki gibi hesaplanır:

PR = 20 + NI

NI güzel seviye ve PR öncelik düzeyidir. Gördüğümüz gibi, -20 aslında 0 ile, 19 ise 39 ile eşleşiyor.

Varsayılan olarak, bir program hoş değeri 0 bittir Bir kök kullanıcının aşağıdaki komutu kullanarak belirli bir hoş değeri olan programları öğle yemeğine bırakması mümkündür:

nice -n <nice_value> ./myProgram 

Gerçek zaman

Daha da ileri gidebiliriz. Güzel öncelik aslında kullanıcı programları için kullanılır. UNIX / LINUX genel önceliği 140 değere sahipken, güzel değer, işlemin aralığın son kısmına (100'den 139'a) eşlemesini sağlar. Bu denklem, negatif PR seviyesine (-100 ila -1) karşılık gelen 0 ila 99 arasındaki değerleri erişilemez bırakır. Bu değerlere erişebilmek için süreç "gerçek zamanlı" olarak belirtilmelidir.

LINUX ortamında aşağıdaki komutla görüntülenebilen 5 zamanlama ilkesi vardır:

chrt -m 

Bu aşağıdaki listeyi gösterecektir:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Çizelgeleme süreçleri 2 gruba ayrılabilir, normal çizelgeleme politikaları (1-3) ve gerçek zamanlı çizelgeleme politikaları (4 ve 5). Gerçek zamanlı süreçler her zaman normal süreçlere göre önceliklidir. Aşağıdaki komut kullanılarak gerçek zamanlı bir işlem çağrılabilir (Örnek, bir SCHED_RR ilkesinin nasıl bildirileceği):

chrt --rr <priority between 1-99> ./myProgram

Gerçek zamanlı bir işlem için PR değerini elde etmek için aşağıdaki denklem uygulanır:

PR = -1 - rt_prior

Burada rt_prior, 1 ile 99 arasındaki önceliğe karşılık gelir. Bu nedenle, diğer işlemlere göre daha yüksek önceliğe sahip olan işlem, 99 sayısı ile çağrılan işlem olacaktır.

Gerçek zamanlı süreçler için hoş değerin kullanılmadığına dikkat etmek önemlidir.

Bir işlemin geçerli "güzelliğini" ve PR değerini görmek için aşağıdaki komut yürütülebilir:

top

PR değeri -51 olan işlemlerin gerçek zamanlı bir değere karşılık geldiğine dikkat etmek önemlidir. PR değeri "rt" olarak belirtilen bazı işlemler de vardır. Bu değer aslında -100'lük bir PR değerine karşılık gelir.

(PS: En iyi sonucu gösteren bir resim yayınlardım ama bunu yapacak itibarım yok)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.