Sự khác biệt là PR là ưu tiên thực sự của một quy trình tại thời điểm bên trong kernel và NI chỉ là một gợi ý cho kernel về mức độ ưu tiên mà quy trình nên có.
Trong hầu hết các trường hợp, giá trị PR có thể được tính theo công thức sau: PR = 20 + NI . Do đó, quá trình với độ đẹp 3 có mức độ ưu tiên 23 (20 + 3) và quá trình có độ đẹp -7 có mức độ ưu tiên 13 (20 - 7). Bạn có thể kiểm tra đầu tiên bằng cách chạy lệnh nice -n 3 top
. Nó sẽ chỉ ra rằng quá trình hàng đầu có NI 3 và PR 23 . Nhưng để chạy nice -n -7 top
trong hầu hết các hệ thống Linux, bạn cần phải có quyền root vì thực sự giá trị PR thấp hơn là mức ưu tiên thực tế cao hơn. Do đó, quy trình với PR 13 có mức độ ưu tiên cao hơn các quy trình có mức ưu tiên tiêu chuẩn PR 20. Đó là lý do tại sao bạn cần phải root. Nhưng giá trị độ đẹp tối thiểu được phép cho quy trình không root có thể được định cấu hình trong /etc/security/limits.conf .
Về mặt lý thuyết, hạt nhân có thể tự thay đổi giá trị PR (chứ không phải NI ). Ví dụ, nó có thể giảm mức độ ưu tiên của quy trình nếu tiêu thụ quá nhiều CPU hoặc có thể tăng mức độ ưu tiên của quy trình nếu quy trình đó không có cơ hội chạy trong thời gian dài do các quy trình ưu tiên cao hơn khác. Trong những trường hợp này, giá trị PR sẽ được thay đổi bởi kernel và NI sẽ giữ nguyên, do đó công thức "PR = 20 + NI" sẽ không chính xác. Vì vậy, giá trị NI có thể được hiểu là gợi ý cho kernel về mức độ ưu tiên mà quá trình nên có, nhưng hạt nhân có thể tự chọn mức độ ưu tiên thực ( giá trị PR ) tùy theo tình huống. Nhưng thường là công thức"PR = 20 + NI" là chính xác.
Quy tắc chính xác làm thế nào hạt nhân thay đổi ưu tiên không rõ ràng. hướng dẫn setp Warriority (hàm thay đổi giá trị đẹp) cho biết:
Hiệu quả của việc thay đổi giá trị đẹp có thể thay đổi tùy thuộc vào thuật toán lập lịch quy trình có hiệu lực.
Hướng dẫn sử dụng Pthread cho biết như sau:
Mức độ ưu tiên động dựa trên giá trị đẹp (được đặt bởi Nice (2), setp Warriority (2) hoặc calendar_setattr (2)) và tăng lên cho mỗi lần lượng tử luồng sẵn sàng để chạy, nhưng bị từ chối bởi trình lập lịch.
Có vẻ như giá trị PR tương ứng với ưu tiên động.
Phạm vi của giá trị NI là -20..19 . Do đó, giá trị PR có thể có các giá trị từ 0 (20 - 20) đến 39 (20 + 19). Nhưng nó chỉ đúng cho các quy trình có chính sách lập lịch mặc định ( SHED_OTHER ). Cũng có thể có các quy trình với cái gọi là chính sách lập lịch "thời gian thực" . Các chính sách này là SCHED_RR và SCHED_FIFO . Các quy trình như vậy có giá trị PR nhỏ hơn 0. Bạn có thể kiểm tra điều này bằng cách chạy chrt -r 1 top
lệnh (cần phải là root). Các đầu quá trình sẽ có PR -2 . Bạn thậm chí có thể chạy chrt -r 90 top
trong trường hợp hàng đầuquá trình sẽ có PR -91 .
Dường như đối với các quy trình SCHED_RR , giá trị PR có thể được tính theo công thức:
PR = - 1 - calendar_rr_p Warriority .
Do đó, quy trình SCHED_RR có ít nhất PR -1 , có nghĩa là mọi quy trình SCHED_RR có mức độ ưu tiên cao hơn bất kỳ SCHED_OTHER nào . Điều này tương ứng với hướng dẫn pthread:
SCHED_FIFO chỉ có thể được sử dụng với mức độ ưu tiên tĩnh cao hơn 0, điều đó có nghĩa là khi một luồng SCHED_FIFO có thể chạy được, nó sẽ luôn ưu tiên ngay lập tức bất kỳ luồng SCHED_OTHER, SCHED_BATCH hoặc SCHED_IDLE nào đang chạy.
SCHED_RR là một cải tiến đơn giản của SCHED_FIFO. Mọi thứ được mô tả ở trên cho SCHED_FIFO cũng áp dụng cho SCHED_RR,
Mức độ ưu tiên của các quy trình thời gian thực được gọi là mức ưu tiên tĩnh mà hạt nhân không thể thay đổi. Vì vậy, các giá trị PR dương có thể được coi là mức độ ưu tiên động đối với các quy trình không theo thời gian thực ( SCHED_OTHER , SCHED_BATCH ) và giá trị PR âm dưới dạng ưu tiên tĩnh cho các quy trình thời gian thực ( SCHED_RR , SCHED_FIFO ).
Tôi cũng đã cố gắng để chạy nice -n 10 chrt -r 50 top
(và chrt -r 50 nice -n 10 top
). Các NI giá trị là 10, nhưng PR vẫn là -51 . Vì vậy, dường như giá trị NI không ảnh hưởng đến mức độ ưu tiên của các quy trình SCHED_RR . Điều này tương ứng với hướng dẫn setp Warriority :
Bất kỳ quy trình hoặc luồng nào sử dụng SCHED_FIFO hoặc SCHED_RR sẽ không bị ảnh hưởng bởi một lệnh gọi đến setp Warriority (). Đây không được coi là một lỗi. Một quá trình mà sau đó trở lại SCHED_OTHER không cần phải có mức độ ưu tiên của nó bị ảnh hưởng bởi một lệnh gọi setp Warriority () như vậy.
Một lưu ý hài hước. Nếu bạn chạy chrt -r 99 top
, bạn sẽ thấy giá trị RT thay vì số trong cột PR .
NGƯỜI DÙNG PR PR VI VIRT RES SHR S% CPU% MEM TIME + HÀNH
28,49 gốc RT 0 2852 1200 896 R 0 0,1 0: 00,01 hàng đầu
Tôi không nghĩ rằng điều này có nghĩa là quy trình này đặc biệt. Tôi nghĩ rằng điều này có nghĩa là đầu chỉ không in -100 vì nó sẽ mất 4 ký tự để in.
Bạn cũng có thể sử dụng htop thay vì top trong tất cả các ví dụ có thể thuận tiện hơn. ps -l
cũng có thể được sử dụng, nhưng điểm cơ bản phân tách các ưu tiên thời gian thực và phi thời gian thực không phải là 0, mà là 60, do đó nice -n -20 ps -l
sẽ in
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME
4 R 0 28983 28804 0 60 -20 - 1176 - điểm / 6 00:00:00 ps