Perbedaannya adalah bahwa PR adalah prioritas nyata dari suatu proses pada saat di dalam kernel dan NI hanyalah sebuah petunjuk untuk kernel apa prioritas dari proses tersebut.
Dalam kebanyakan kasus, nilai PR dapat dihitung dengan rumus berikut: PR = 20 + NI . Jadi proses dengan kebaikan 3 memiliki prioritas 23 (20 + 3) dan proses dengan kebaikan -7 memiliki prioritas 13 (20 - 7). Anda dapat memeriksa yang pertama dengan menjalankan perintah nice -n 3 top
. Ini akan menunjukkan bahwa proses teratas memiliki NI 3 dan PR 23 . Tetapi untuk menjalankan nice -n -7 top
di sebagian besar sistem Linux Anda perlu memiliki hak akses root karena sebenarnya nilai PR yang lebih rendah adalah prioritas aktual yang lebih tinggi. Dengan 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 nilai PR (tetapi tidak NI ) dengan sendirinya. Misalnya ia dapat mengurangi prioritas suatu proses jika terlalu banyak mengkonsumsi CPU, atau dapat meningkatkan prioritas suatu proses jika proses itu tidak memiliki kesempatan untuk berjalan untuk waktu yang lama karena proses prioritas yang lebih tinggi lainnya. Dalam kasus ini nilai PR akan diubah oleh kernel dan NI akan tetap sama, sehingga rumus "PR = 20 + NI" tidak akan benar. Jadi nilai NI dapat diartikan sebagai petunjuk untuk kernel apa prioritas proses yang seharusnya, tetapi kernel dapat memilih prioritas nyata ( nilai PR ) sendiri tergantung pada situasinya. Tapi biasanya formulanya"PR = 20 + NI" benar.
Aturan yang tepat bagaimana prioritas perubahan kernel tidak jelas. manual setpriority (fungsi yang mengubah nilai bagus) mengatakan:
Efek mengubah nilai baik dapat bervariasi tergantung pada algoritma penjadwalan proses yang berlaku.
Manual Pthread mengatakan yang berikut:
Prioritas dinamis didasarkan pada nilai nice (ditetapkan oleh nice (2), setpriority (2), atau sched_setattr (2)) dan meningkat untuk setiap kali kuantum utas siap dijalankan, tetapi ditolak untuk dijalankan oleh penjadwal.
Tampaknya nilai PR sesuai dengan prioritas dinamis.
Kisaran nilai NI adalah -20..19 . Dengan demikian nilai PR dapat memiliki nilai dari 0 (20 - 20) hingga 39 (20 + 19). Tapi itu benar hanya untuk proses dengan kebijakan penjadwalan default ( SHED_OTHER ). Mungkin ada juga proses dengan apa yang disebut kebijakan penjadwalan "waktu nyata" . Kebijakan ini adalah SCHED_RR dan SCHED_FIFO . Proses tersebut memiliki nilai PR kurang dari 0. Anda dapat memeriksa ini dengan menjalankan chrt -r 1 top
perintah (harus di-root). Proses teratas akan memiliki PR -2 . Anda bahkan dapat menjalankan chrt -r 90 top
dalam hal ini bagian atasproses akan memiliki PR -91 .
Tampaknya untuk proses SCHED_RR nilai PR dapat dihitung dengan rumus:
PR = - 1 - sched_rr_priority .
Jadi proses SCHED_RR memiliki setidaknya PR -1 yang berarti bahwa setiap proses SCHED_RR memiliki prioritas lebih tinggi daripada SCHED_OTHER . Ini sesuai dengan manual pthread:
SCHED_FIFO hanya dapat digunakan dengan prioritas statis lebih tinggi dari 0, yang berarti bahwa ketika sebuah thread SCHED_FIFO menjadi runnable, itu akan selalu segera mendahului setiap thread yang sedang berjalan SCHED_OTHER, SCHED_BATCH, atau SCHED_IDLE.
SCHED_RR adalah peningkatan sederhana dari SCHED_FIFO. Segala sesuatu 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. Jadi nilai PR positif dapat diperlakukan sebagai prioritas dinamis untuk proses non-realtime ( SCHED_OTHER , SCHED_BATCH ) dan nilai PR negatif sebagai prioritas statis untuk proses realtime ( SCHED_RR , SCHED_FIFO ).
Saya juga mencoba menjalankan nice -n 10 chrt -r 50 top
(dan chrt -r 50 nice -n 10 top
). Nilai NI adalah 10, tetapi PR masih -51 . Jadi sepertinya nilai NI tidak mempengaruhi prioritas proses SCHED_RR . Ini sesuai dengan manual setpriority :
Setiap proses atau utas yang menggunakan SCHED_FIFO atau SCHED_RR tidak akan terpengaruh oleh panggilan ke setpriority (). Ini tidak dianggap sebagai kesalahan. Suatu proses yang kemudian kembali ke SCHED_OTHER tidak perlu memiliki prioritas yang dipengaruhi oleh panggilan setpriority ().
Satu catatan lucu. Jika Anda menjalankan chrt -r 99 top
, Anda akan melihat nilai RT alih-alih angka di kolom PR .
PID PENGGUNA PR NI VIRT RES SHR S% CPU% MEM TIME + PERINTAH
28489 root RT 0 2852 1200 896 R 0 0,1 0: 00,01 teratas
Saya tidak berpikir ini berarti bahwa prosesnya sekarang istimewa. Saya pikir ini berarti top itu tidak mencetak -100 karena akan butuh 4 karakter untuk dicetak.
Anda juga dapat menggunakan htop daripada atas dalam semua contoh yang bisa lebih mudah. ps -l
dapat digunakan juga, tapi itu titik dasar yang memisahkan prioritas realtime dan non-realtime bukanlah 0, tetapi 60, sehingga nice -n -20 ps -l
akan mencetak
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY WAKTU CMD
4 R 0 28983 28804 0 60 -20 - 1176 - Poin / 6 00:00:00 ps