Sự khác biệt giữa giá trị tốt và ưu tiên trong đầu ra hàng đầu


11

trên cùng , theo mặc định, liệt kê cả hai cột. Tôi tò mò về sự khác biệt là gì. Tôi đã kiểm tra các trang người đàn ông và không thể tìm ra nó:

Sự ưu tiên:

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

Giá trị tốt đẹp:

   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.

Tôi hiểu rằng giá trị Nice có liên quan đến hàng đợi lập lịch CPU của Kernel; Vậy thì Ưu tiên biểu thị điều gì? Một cái gì đó liên quan đến I / O có lẽ?

Câu trả lời:


8

Giá trị tốt đẹp là một cơ chế "toàn cầu", trong khi ưu tiên có liên quan đến trình chuyển đổi tác vụ ngay bây giờ .


Bạn có ý nghĩa gì bởi trình chuyển đổi nhiệm vụ?
Belmin Fernandez

1
Trình chuyển đổi tác vụ (được gọi đúng là "trình lập lịch biểu") là một ít mã trong kernel quyết định tác vụ nào sẽ chạy tiếp theo.
Ignacio Vazquez-Abrams

25

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 đầuNI 3PR 23 . Nhưng để chạy nice -n -7 toptrong 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-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_RRSCHED_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 toplệ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 toptrong 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 -lcũ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 -lsẽ 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

Thật kỳ lạ, nếu tôi chạy 5 vòng lặp vô hạn (int main {while (1);}) trên i3 siêu phân luồng 2 thì mức độ ưu tiên của chúng không đổi. Điều này trong thử nghiệm sid debian.
Vorac

1
@BelminFernandez Tôi nghĩ sẽ công bằng khi đưa câu trả lời này "được chấp nhận".
z0lupka

1

Câu trả lời ngắn

PR là mức độ ưu tiên. PR càng thấp, mức độ ưu tiên của quy trình sẽ càng cao.

PR được tính như sau:

  • đối với các quy trình thông thường: PR = 20 - NI (NI là tốt và nằm trong khoảng từ -20 đến 19)
  • đối với các quy trình thời gian thực: PR = - 1 - real_time_p Warriority (real_time_p Warriority nằm trong khoảng từ 1 đến 99)

Câu trả lời dài

Có 2 loại quy trình, loại bình thườngthời gian thực Đối với loại bình thường (và chỉ dành cho loại), đẹp được áp dụng như sau:

Đẹp

Thang đo "độ đẹp" đi từ -20 đến 19, trong khi -20 là mức ưu tiên cao nhất và 19 mức ưu tiên thấp nhất. Mức độ ưu tiên được tính như sau:

PR = 20 + NI

Trong đó NI là mức độ tốt đẹp và PR là mức độ ưu tiên. Như chúng ta có thể thấy, -20 thực sự ánh xạ thành 0, trong khi 19 ánh xạ thành 39.

Theo mặc định, giá trị đẹp của chương trình là 0 bit, người dùng root có thể ăn trưa với các chương trình có giá trị đẹp được chỉ định bằng cách sử dụng lệnh sau:

nice -n <nice_value> ./myProgram 

Thời gian thực

Chúng ta có thể đi xa hơn nữa. Ưu tiên tốt đẹp thực sự được sử dụng cho các chương trình người dùng. Trong khi mức ưu tiên chung của UNIX / LINUX có phạm vi 140 giá trị, giá trị đẹp cho phép quá trình ánh xạ tới phần cuối của phạm vi (từ 100 đến 139). Phương trình này khiến các giá trị từ 0 đến 99 không thể truy cập được, sẽ tương ứng với mức PR âm (từ -100 đến -1). Để có thể truy cập vào các giá trị đó, quy trình phải được nêu là "thời gian thực".

Có 5 chính sách lập lịch trong môi trường LINUX có thể được hiển thị bằng lệnh sau:

chrt -m 

Mà sẽ hiển thị danh sách sau đây:

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

Các quy trình lập lịch có thể được chia thành 2 nhóm, chính sách lập lịch thông thường (1 đến 3) và chính sách lập lịch thời gian thực (4 và 5). Các quy trình thời gian thực sẽ luôn được ưu tiên hơn các quy trình thông thường. Một quy trình thời gian thực có thể được gọi bằng cách sử dụng lệnh sau (Ví dụ là cách khai báo chính sách SCHED_RR):

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

Để có được giá trị PR cho quy trình thời gian thực, phương trình sau được áp dụng:

PR = -1 - rt_p Warrior

Trong đó rt_p Warrior tương ứng với mức ưu tiên trong khoảng từ 1 đến 99. Vì lý do đó, quy trình có mức ưu tiên cao hơn các quy trình khác sẽ là quy trình được gọi với số 99.

Điều quan trọng cần lưu ý là đối với các quy trình thời gian thực, giá trị đẹp không được sử dụng.

Để xem "giá trị" và giá trị PR hiện tại của một quy trình, lệnh sau có thể được thực thi:

top

Thật tốt khi lưu ý rằng các quy trình có giá trị PR -51 chẳng hạn tương ứng với giá trị thời gian thực. Ngoài ra còn có một số quy trình có giá trị PR được nêu là "rt". Giá trị này thực sự tương ứng với giá trị PR là -100.

(PS: Tôi đã đăng một bức ảnh cho thấy kết quả hàng đầu nhưng tôi không có tiếng tăm để làm điều đó)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.