Perbedaan antara nilai bagus dan prioritas di output atas

11

atas , secara default, mencantumkan kedua kolom. Saya ingin tahu apa bedanya. Saya memeriksa halaman manual dan tidak dapat menemukannya:

Prioritas:

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

Nilai bagus:

   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.

Saya mengerti bahwa nilai Nice terkait dengan antrian scheduler CPU Kernel; lalu apa yang ditunjukkan Prioritas ? Sesuatu tentang I / O mungkin?

Belmin Fernandez
sumber

Jawaban:

8

Nilai yang bagus adalah mekanisme "global", sedangkan prioritas relevan untuk pengalih tugas saat ini .

Ignacio Vazquez-Abrams
sumber
Apa yang Anda maksud dengan pengalih tugas?
Belmin Fernandez
1
Pengalih tugas (disebut "penjadwal") adalah sedikit kode di dalam kernel yang menentukan tugas apa yang akan dijalankan selanjutnya.
Ignacio Vazquez-Abrams
25

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 topdi 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 topperintah (harus di-root). Proses teratas akan memiliki PR -2 . Anda bahkan dapat menjalankan chrt -r 90 topdalam 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 -ldapat digunakan juga, tapi itu titik dasar yang memisahkan prioritas realtime dan non-realtime bukanlah 0, tetapi 60, sehingga nice -n -20 ps -lakan 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
Anton
sumber
Anehnya, jika saya menjalankan 5 loop tanpa batas (int main {while (1);}) pada i3 2 core hyperthreaded, prioritas mereka tetap konstan. Ini dalam pengujian sid debian.
Vorac
1
@BelminFernandez Saya pikir akan adil jika membuat jawaban ini "diterima".
z0lupka
1

Jawaban singkat

PR adalah level prioritas. Semakin rendah PR, semakin tinggi prioritas proses.

PR dihitung sebagai berikut:

  • untuk proses normal: PR = 20 - NI (NI bagus dan berkisar -20 hingga 19)
  • untuk proses waktu nyata: PR = - 1 - real_time_priority (real_time_priority berkisar dari 1 hingga 99)

Jawaban panjang

Ada 2 jenis proses, yang normal dan waktu nyata Untuk yang normal (dan hanya untuk itu), bagus diterapkan sebagai berikut:

Bagus

Skala "kebaikan" berubah dari -20 ke 19, sedangkan -20 itu adalah prioritas tertinggi dan 19 prioritas terendah. Tingkat prioritas dihitung sebagai berikut:

PR = 20 + NI

Di mana NI adalah level yang bagus dan PR adalah level prioritas. Jadi seperti yang bisa kita lihat, -20 sebenarnya memetakan ke 0, sedangkan 19 memetakan ke 39.

Secara default, nilai program bagus adalah 0 bit. Hal ini memungkinkan bagi pengguna root untuk program makan siang dengan nilai bagus yang ditentukan dengan menggunakan perintah berikut:

nice -n <nice_value> ./myProgram 

Waktu sebenarnya

Kita bisa melangkah lebih jauh. Prioritas yang bagus sebenarnya digunakan untuk program pengguna. Sedangkan prioritas keseluruhan UNIX / LINUX memiliki kisaran 140 nilai, nilai bagus memungkinkan proses untuk memetakan ke bagian terakhir dari rentang (dari 100 hingga 139). Persamaan ini membuat nilai dari 0 hingga 99 tidak dapat dijangkau yang akan sesuai dengan level PR negatif (dari -100 ke -1). Untuk dapat mengakses nilai-nilai itu, proses harus dinyatakan sebagai "waktu nyata".

Ada 5 kebijakan penjadwalan di lingkungan LINUX yang dapat ditampilkan dengan perintah berikut:

chrt -m 

Yang akan menampilkan daftar berikut:

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

Proses penjadwalan dapat dibagi menjadi 2 kelompok, kebijakan penjadwalan normal (1 hingga 3) dan kebijakan penjadwalan waktu nyata (4 dan 5). Proses waktu nyata akan selalu memiliki prioritas di atas proses normal. Proses waktu nyata dapat dipanggil menggunakan perintah berikut (Contohnya adalah bagaimana mendeklarasikan kebijakan SCHED_RR):

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

Untuk mendapatkan nilai PR untuk proses waktu nyata, persamaan berikut ini diterapkan:

PR = -1 - rt_prior

Dimana rt_prior sesuai dengan prioritas antara 1 dan 99. Untuk alasan itu proses yang akan memiliki prioritas lebih tinggi daripada proses lain adalah yang disebut dengan nomor 99.

Penting untuk dicatat bahwa untuk proses waktu nyata, nilai yang bagus tidak digunakan.

Untuk melihat "kebaikan" saat ini dan nilai PR dari suatu proses, perintah berikut ini dapat dijalankan:

top

Adalah baik untuk mencatat bahwa proses dengan nilai PR -51 misalnya sesuai dengan nilai waktu nyata. Ada juga beberapa proses yang nilai PR-nya dinyatakan sebagai "rt". Nilai ini sebenarnya sesuai dengan nilai PR -100.

(PS: Saya akan memposting gambar yang menunjukkan hasil teratas tetapi saya tidak memiliki reputasi untuk melakukan itu)

Agustin Barrachina
sumber