ความแตกต่างคือPRเป็นลำดับความสำคัญที่แท้จริงของกระบวนการในขณะนี้ภายในเคอร์เนลและNIเป็นเพียงคำแนะนำสำหรับเคอร์เนลสิ่งที่กระบวนการสำคัญควรมี
ในกรณีส่วนใหญ่ประชาสัมพันธ์ค่าสามารถคำนวณได้จากสูตรต่อไปนี้: PR = 20 + NI ดังนั้นกระบวนการที่มีความนุ่มนวล 3 จึงมีลำดับความสำคัญ 23 (20 + 3) และกระบวนการที่มีความสวยงาม -7 มีลำดับความสำคัญ 13 (20 - 7) nice -n 3 top
คุณสามารถตรวจสอบครั้งแรกโดยใช้คำสั่ง มันจะแสดงให้เห็นว่าด้านบนกระบวนการมีNI 3และประชาสัมพันธ์ 23 แต่สำหรับการใช้งานnice -n -7 top
ในระบบ Linux ส่วนใหญ่คุณต้องมีสิทธิ์ใช้งานรูทเพราะที่จริงแล้วค่าPR ที่ต่ำกว่านั้นคือลำดับความสำคัญที่แท้จริงที่สูงกว่าคือ ดังนั้นกระบวนการที่มีPR 13จึงมีความสำคัญสูงกว่ากระบวนการที่มีลำดับความสำคัญมาตรฐานPR 20. นั่นเป็นสาเหตุที่คุณต้องรูท แต่ค่าความอ่อนโยนต่ำสุดที่อนุญาตสำหรับกระบวนการที่ไม่ใช่รากสามารถกำหนดค่าใน/etc/security/limits.conf
ในทางทฤษฎีเคอร์เนลสามารถเปลี่ยนค่าPR (แต่ไม่ใช่NI ) ด้วยตัวเอง ตัวอย่างเช่นอาจลดระดับความสำคัญของกระบวนการหากใช้ CPU มากเกินไปหรืออาจเพิ่มระดับความสำคัญของกระบวนการหากกระบวนการนั้นไม่มีโอกาสทำงานเป็นเวลานานเนื่องจากกระบวนการลำดับความสำคัญสูงกว่าอื่น ๆ ในกรณีเหล่านี้ค่าPRจะถูกเปลี่ยนโดยเคอร์เนลและNIจะยังคงเหมือนเดิมดังนั้นสูตร"PR = 20 + NI"จะไม่ถูกต้อง ดังนั้นค่าNIสามารถตีความได้ว่าเป็นคำแนะนำสำหรับเคอร์เนลสิ่งที่กระบวนการสำคัญควรมี แต่เคอร์เนลสามารถเลือกลำดับความสำคัญจริง ( ค่าPR ) ด้วยตัวเองขึ้นอยู่กับสถานการณ์ แต่มักจะเป็นสูตร"PR = 20 + NI"ถูกต้อง
กฎที่แน่นอนว่าเคอร์เนลเปลี่ยนลำดับความสำคัญไม่ชัดเจน setpriority (ฟังก์ชันที่เปลี่ยนค่าที่ดี) คู่มือพูดว่า:
ผลของการเปลี่ยนค่า nice อาจแตกต่างกันไปขึ้นอยู่กับอัลกอริทึมการจัดตารางกระบวนการในลักษณะพิเศษ
คู่มือ Pthreadกล่าวว่าต่อไปนี้:
ลำดับความสำคัญแบบไดนามิกขึ้นอยู่กับค่า nice (กำหนดโดย nice (2), setpriority (2) หรือ sched_setattr (2)) และเพิ่มขึ้นสำหรับควอนตัมแต่ละครั้งที่เธรดพร้อมทำงาน แต่ปฏิเสธที่จะเรียกใช้โดยตัวกำหนดตารางเวลา
ดูเหมือนว่าค่าPRสอดคล้องกับลำดับความสำคัญแบบไดนามิก
ช่วงของNIค่า-20..19 ดังนั้นค่าPRสามารถมีค่าตั้งแต่0 (20 - 20) ถึง39 (20 + 19) แต่ถูกต้องเฉพาะสำหรับกระบวนการที่มีนโยบายการตั้งเวลาเริ่มต้น ( SHED_OTHER ) อาจมีกระบวนการที่เรียกว่านโยบายการตั้งเวลา"แบบเรียลไทม์" นโยบายเหล่านี้SCHED_RRและSCHED_FIFO กระบวนการดังกล่าวมีค่าPRน้อยกว่า 0 คุณสามารถตรวจสอบสิ่งนี้ได้โดยการรันchrt -r 1 top
คำสั่ง (จำเป็นต้องเป็นรูท) ด้านบนขั้นตอนจะมีการประชาสัมพันธ์ -2 คุณยังสามารถเรียกใช้chrt -r 90 top
ในกรณีที่ด้านบนกระบวนการจะมีการประชาสัมพันธ์ -91
ดูเหมือนว่าสำหรับกระบวนการSCHED_RRค่าPRสามารถคำนวณได้จากสูตร:
PR = - 1 - sched_rr_priority
ดังนั้นSCHED_RRกระบวนการมีอย่างน้อยPR -1ซึ่งหมายความว่าการใด ๆSCHED_RRกระบวนการมีลำดับความสำคัญสูงกว่าใด ๆSCHED_OTHER สิ่งนี้สอดคล้องกับคู่มือ pthread:
SCHED_FIFO สามารถใช้ได้เฉพาะกับลำดับความสำคัญคงที่สูงกว่า 0 ซึ่งหมายความว่าเมื่อเธรด SCHED_FIFO สามารถรันได้เธรดนั้นจะยึดเอาทันทีทุกครั้งที่มีการรันเธรด SCHED_OTHER, SCHED_BATCH หรือ SCHED_IDLE นี้ทันที
SCHED_RR เป็นการปรับปรุงอย่างง่ายของ SCHED_FIFO ทุกอย่างที่อธิบายไว้ข้างต้นสำหรับ SCHED_FIFO ยังนำไปใช้กับ SCHED_RR ด้วย
ลำดับความสำคัญของกระบวนการเรียลไทม์เรียกว่าลำดับความสำคัญแบบคงที่ที่ไม่สามารถเปลี่ยนแปลงได้โดยเคอร์เนล ดังนั้นค่าPRเชิงบวกสามารถถือว่าเป็นลำดับความสำคัญแบบไดนามิกสำหรับกระบวนการที่ไม่ใช่เรียลไทม์ ( SCHED_OTHER , SCHED_BATCH ) และค่าPRเชิงลบเป็นลำดับความสำคัญแบบคงที่สำหรับกระบวนการเรียลไทม์ ( SCHED_RR , SCHED_FIFO )
ฉันยังพยายามเรียกใช้nice -n 10 chrt -r 50 top
(และchrt -r 50 nice -n 10 top
) NIค่าเป็น 10 แต่พีอาร์ยังคงเป็น-51 ดังนั้นดูเหมือนว่าค่าNIจะไม่ส่งผลกระทบต่อลำดับความสำคัญของกระบวนการSCHED_RR สิ่งนี้สอดคล้องกับคู่มือsetpriority :
กระบวนการหรือเธรดใด ๆ ที่ใช้ SCHED_FIFO หรือ SCHED_RR จะไม่ได้รับผลกระทบจากการเรียกไปยัง setpriority () นี่ไม่ใช่ข้อผิดพลาด กระบวนการที่เปลี่ยนกลับเป็น SCHED_OTHER ไม่จำเป็นต้องมีลำดับความสำคัญที่ได้รับผลกระทบจากการเรียก setpriority () ดังกล่าว
หมายเหตุหนึ่งที่ตลก หากคุณเรียกใช้chrt -r 99 top
คุณจะเห็นค่าRTแทนตัวเลขในคอลัมน์PR
PID ผู้ใช้ PR NI VIRT RES SHR S% CPU% MEM TIME + คำสั่ง
28489 รูท RT 0 2852 1200 896 R 0 0.1 0: 00.01
ฉันไม่คิดว่านี่หมายความว่ากระบวนการนี้พิเศษแล้ว ฉันคิดว่านี่หมายความว่าส่วนบนไม่พิมพ์-100เพราะมันต้องใช้อักขระ 4 ตัวในการพิมพ์
นอกจากนี้คุณยังสามารถใช้htopแทนด้านบนในตัวอย่างทั้งหมดซึ่งสะดวกกว่า ps -l
สามารถใช้งานได้เช่นกัน แต่เป็นจุดฐานที่แยกลำดับความสำคัญแบบเรียลไทม์และไม่ใช่เรียลไทม์ไม่ใช่ 0 แต่เป็น 60 ดังนั้นnice -n -20 ps -l
จะพิมพ์
FS 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