Bedanya itu PR adalah prioritas nyata dari sebuah proses saat ini di dalam kernel dan NI hanyalah sebuah petunjuk untuk kernel apa prioritas yang harus dimiliki proses tersebut.
Dalam kebanyakan kasus PR nilai dapat dihitung dengan rumus berikut:PR =20 + NI . Dengan demikian proses dengan kebaikan 3 memiliki prioritas 23 (20 + 3) dan proses dengan kebaikan -7 memiliki prioritas 13 (20 - 7). Anda dapat memeriksanya terlebih dahulu dengan menjalankan perintah nice -n 3 top
. Ini akan menunjukkan bahwa atas proses memiliki NI 3 dan PR 23 . Tetapi untuk menjalankan nice -n -7 top
di sebagian besar sistem Linux Anda harus memiliki hak akses root karena sebenarnya PR lebih rendah nilai adalah prioritas aktual yang lebih tinggi. Demikian proses dengan PR 13 memiliki prioritas lebih tinggi daripada proses dengan prioritas standar PR 20 . Itu sebabnya Anda harus menjadi root. Tetapi nilai kebaikan minimum yang diizinkan untuk proses non-root dapat dikonfigurasi di /etc/security/limits.conf .
Secara teoritis kernel dapat mengubah PR nilai (namun bukan NI ) dengan sendirinya. Misalnya dapat mengurangi prioritas suatu proses jika mengkonsumsi terlalu banyak CPU, atau dapat meningkatkan prioritas suatu proses jika proses tersebut tidak memiliki kesempatan untuk berjalan dalam waktu yang lama karena proses lain dengan prioritas lebih tinggi. Dalam kasus ini, PR nilai akan diubah oleh kernel dan NI akan tetap sama, sehingga rumusnya "PR =20 + NI" tidak akan benar. Jadi NI value dapat diartikan sebagai petunjuk untuk kernel apa prioritas yang harus dimiliki proses tersebut, tetapi kernel dapat memilih prioritas sebenarnya (PR nilai) sendiri tergantung pada situasi. Tapi biasanya rumusnya "PR =20 + NI" benar.
Aturan pasti bagaimana kernel mengubah prioritas tidak jelas. tetapkan prioritas (fungsi yang mengubah nilai bagus) manual mengatakan:
Efek mengubah nilai Nice dapat bervariasi tergantung pada algoritme penjadwalan proses yang berlaku.
Manual Pthread mengatakan sebagai berikut:
Prioritas dinamis didasarkan pada nilai bagus (diatur oleh nice(2), setpriority(2), atau sched_setattr(2)) dan ditingkatkan untuk setiap kali kuantum utas siap dijalankan, tetapi ditolak untuk dijalankan oleh penjadwal.
Sepertinya PR nilai sesuai dengan prioritas dinamis.
Kisaran NI nilainya adalah -20..19 . Demikianlah PR nilai dapat memiliki nilai dari 0 (20 - 20) hingga 39 (20 + 19). Tapi itu benar hanya untuk proses dengan kebijakan penjadwalan default (SHED_OTHER ). Mungkin juga ada proses dengan apa yang disebut "real time" kebijakan penjadwalan. Kebijakan ini adalah SCHED_RR dan SCHED_FIFO . Proses tersebut memiliki PR nilainya kurang dari 0. Anda dapat memeriksanya dengan menjalankan chrt -r 1 top
perintah (harus root). atas proses akan memiliki PR -2 . Anda bahkan dapat menjalankan chrt -r 90 top
dalam hal ini atas proses akan memiliki PR -91 .
Sepertinya untuk SCHED_RR memproses PR nilai dapat dihitung dengan rumus:
PR =- 1 - sched_rr_priority .
Jadi SCHED_RR proses memiliki setidaknya PR -1 yang artinya SCHED_RR proses memiliki prioritas lebih tinggi daripada SCHED_OTHER mana pun . Ini sesuai dengan manual pthread:
SCHED_FIFO hanya dapat digunakan dengan prioritas statis lebih tinggi dari 0, yang berarti bahwa ketika untaian SCHED_FIFO dapat dijalankan, untaian tersebut akan selalu mendahului untaian SCHED_OTHER, SCHED_BATCH, atau SCHED_IDLE yang sedang berjalan.
SCHED_RR adalah penyempurnaan sederhana dari SCHED_FIFO. Semua yang dijelaskan di atas untuk SCHED_FIFO juga berlaku untuk SCHED_RR,
Prioritas proses waktu nyata disebut sebagai prioritas statis yang tidak dapat diubah oleh kernel. PR yang sangat positif nilai dapat diperlakukan sebagai prioritas dinamis untuk non-realtime (SCHED_OTHER , SCHED_BATCH ) proses dan PR negatif nilai sebagai prioritas statis untuk proses waktu nyata (SCHED_RR , SCHED_FIFO ).
Saya juga mencoba menjalankan nice -n 10 chrt -r 50 top
(dan chrt -r 50 nice -n 10 top
). NI nilainya 10, tapi PR masih -51 . Jadi sepertinya NI nilai tidak memengaruhi prioritas SCHED_RR proses. Ini sesuai dengan setpriority petunjuk:
Setiap proses atau utas yang menggunakan SCHED_FIFO atau SCHED_RR tidak akan terpengaruh oleh panggilan ke setpriority(). Ini tidak dianggap sebagai kesalahan. Sebuah proses yang kemudian kembali ke SCHED_OTHER tidak perlu prioritasnya dipengaruhi oleh panggilan setpriority() tersebut.
Satu catatan lucu. Jika Anda menjalankan chrt -r 99 top
, Anda akan melihat RT nilai alih-alih angka di PR kolom.
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
Saya tidak berpikir bahwa ini berarti prosesnya sekarang istimewa. Saya pikir ini berarti teratas jangan cetak -100 karena akan membutuhkan 4 karakter untuk dicetak.
Anda juga dapat menggunakan htop bukannya atas dalam semua contoh yang bisa lebih nyaman. ps -l
bisa dipakai juga, tapi base point yang memisahkan prioritas realtime dan non realtime bukan 0, tapi 60, jadi nice -n -20 ps -l
akan mencetak
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
Nilai bagus adalah mekanisme "global", sedangkan prioritas relevan untuk pengalih tugas saat ini .