अंतर यह है कि पीआर कर्नेल के अंदर एक प्रक्रिया की वास्तविक प्राथमिकता है और एनआई कर्नेल के लिए सिर्फ एक संकेत है कि प्रक्रिया की प्राथमिकता क्या होनी चाहिए।
ज्यादातर मामलों में पीआर मूल्य की गणना निम्न सूत्र द्वारा की जा सकती है: पीआर = 20 + एनआई । इस प्रकार निकेस 3 के साथ प्रक्रिया की प्राथमिकता 23 (20 + 3) है और निकनेस -7 के साथ प्रक्रिया की प्राथमिकता 13 (20 - 7) है। कमांड चलाकर आप पहले चेक कर सकते हैं nice -n 3 top
। यह दिखाएगा कि शीर्ष प्रक्रिया में एनआई 3 और पीआर 23 हैं । लेकिन nice -n -7 top
अधिकांश लिनक्स सिस्टम में चलने के लिए आपको रूट विशेषाधिकारों की आवश्यकता होती है क्योंकि वास्तव में कम पीआर मूल्य उच्च वास्तविक प्राथमिकता है। इस प्रकार पीआर 13 के साथ प्रक्रिया मानक प्राथमिकता पीआर 20 के साथ प्रक्रियाओं की तुलना में उच्च प्राथमिकता है। इसलिए आपको जड़ होने की जरूरत है। लेकिन गैर-रूट प्रक्रिया के लिए अनुमति दी गई न्यूनतम अच्छाता मान को /etc/security/limits.conf में कॉन्फ़िगर किया जा सकता है ।
सैद्धांतिक रूप से कर्नेल PR मान को बदल सकता है (लेकिन NI नहीं )। उदाहरण के लिए यह एक प्रक्रिया की प्राथमिकता को कम कर सकता है यदि यह बहुत अधिक सीपीयू खाता है, या यह एक प्रक्रिया की प्राथमिकता को बढ़ा सकता है यदि उस प्रक्रिया को अन्य उच्च प्राथमिकता प्रक्रियाओं के कारण लंबे समय तक चलने का कोई मौका नहीं मिला। इन मामलों में PR मान को कर्नेल द्वारा बदल दिया जाएगा और NI समान रहेगा, इस प्रकार सूत्र "PR = 20 + NI" सही नहीं होगा। तो NI मान को कर्नेल के लिए संकेत के रूप में समझा जा सकता है कि प्रक्रिया की प्राथमिकता क्या होनी चाहिए, लेकिन कर्नेल स्थिति के आधार पर वास्तविक प्राथमिकता ( PR मान) का चयन कर सकता है। लेकिन आमतौर पर सूत्र"PR = 20 + NI" सही है।
सटीक नियम कि कर्नेल परिवर्तन प्राथमिकता कैसे स्पष्ट है। सेटपैरिटी (फ़ंक्शन जो अच्छा मूल्य बदलता है) मैनुअल कहता है:
अच्छा मूल्य बदलने का प्रभाव प्रक्रिया-निर्धारण एल्गोरिथम के आधार पर भिन्न हो सकता है।
पायथ्रेड मैनुअल निम्नलिखित कहता है:
गतिशील प्राथमिकता अच्छा मूल्य (अच्छा (2) द्वारा निर्धारित), सेटपैरिटी (2), या शेड्यूल_सेटैटर (2) पर आधारित है और हर बार क्वांटम के लिए वृद्धि की जाती है ताकि धागा चलाने के लिए तैयार हो, लेकिन शेड्यूलर द्वारा चलाने से इनकार किया जाता है।
ऐसा लगता है कि पीआर मूल्य गतिशील प्राथमिकता से मेल खाती है।
NI मान की सीमा -20..19 है । इस प्रकार PR मान में 0 (20 - 20) से लेकर 39 (20 + 19) तक मान हो सकते हैं । लेकिन यह केवल डिफ़ॉल्ट शेड्यूलिंग नीति ( SHED_OTHER ) वाली प्रक्रियाओं के लिए सही है । तथाकथित "वास्तविक समय" शेड्यूलिंग नीतियों के साथ प्रक्रियाएं भी हो सकती हैं। ये नीतियां SCHED_RR और SCHED_FIFO हैं । ऐसी प्रक्रियाओं का पीआर मान 0 से कम है। आप इसे रनिंग chrt -r 1 top
कमांड (रूट होने की आवश्यकता) द्वारा जांच सकते हैं । शीर्ष प्रक्रिया होगा पीआर -2 । आप यहां तक कि chrt -r 90 top
किस मामले में शीर्ष पर चल सकते हैंप्रक्रिया में PR -91 होगा ।
ऐसा लगता है कि SCHED_RR प्रक्रियाओं के लिए PR मान की गणना सूत्र द्वारा की जा सकती है:
पीआर = - 1 - शेड्यूल_आरआर_पर्यटन ।
इस प्रकार एक SCHED_RR प्रक्रिया में कम से कम PR -1 होता है जिसका अर्थ है कि किसी भी SCHED_RR प्रक्रिया में किसी SCHED_RR की तुलना में अधिक प्राथमिकता होती है । यह प्रीथ्रेड मैनुअल से मेल खाती है:
SCHED_FIFO का उपयोग केवल 0 से अधिक स्थिर प्राथमिकताओं के साथ किया जा सकता है, जिसका अर्थ है कि जब SCHED_FIFO थ्रेड्स रननीय हो जाते हैं, तो यह हमेशा किसी भी समय चल रहे SCHED_OTHER, SCHED_BATCH, या SCHED_IDLE थ्रेड को तुरंत प्रीमिट कर देगा।
SCHED_RR SCHED_FIFO की एक साधारण वृद्धि है। SCHED_FIFO के लिए ऊपर वर्णित सब कुछ SCHED_RR पर भी लागू होता है,
वास्तविक समय प्रक्रियाओं की प्राथमिकता को स्थिर प्राथमिकता के रूप में संदर्भित किया जाता है जिसे कर्नेल द्वारा नहीं बदला जा सकता है। तो सकारात्मक पीआर मानों को गैर-realtime ( SCHED_OTHER , SCHED_BATCH ) प्रक्रियाओं के लिए गतिशील प्राथमिकता के रूप में और नकारात्मक PR मान को realtime प्रक्रियाओं ( SCHED_RR , SCHED_FIFO ) के लिए स्थिर प्राथमिकता के रूप में माना जा सकता है ।
मैंने भी nice -n 10 chrt -r 50 top
(और chrt -r 50 nice -n 10 top
) दौड़ने की कोशिश की । एनआई मूल्य 10 था, लेकिन पीआर अभी भी था -51 । तो ऐसा लगता है कि NI मूल्य SCHED_RR प्रक्रियाओं की प्राथमिकता को प्रभावित नहीं करता है। यह सेटपैरिटी मैनुअल से मेल खाती है :
SCHED_FIFO या SCHED_RR का उपयोग करके कोई भी प्रक्रिया या थ्रेड सेटपैरिटी () के लिए अप्रभावित रहेगा। इसे त्रुटि नहीं माना जाता है। एक प्रक्रिया जो बाद में SCHED_OTHER को लौटती है, उसे ऐसी प्राथमिकता () कॉल से प्रभावित होने की आवश्यकता नहीं है।
एक मजेदार नोट। यदि आप चलते हैं chrt -r 99 top
, तो आपको PR कॉलम में एक नंबर के बजाय RT मान दिखाई देगा ।
PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND
28489 रूट आरटी 0 2852 1200 896 आर 0 0.1 0: 00.01 टॉप
मुझे नहीं लगता कि इसका मतलब यह है कि यह प्रक्रिया अब विशेष है। मुझे लगता है कि इसका मतलब है कि शीर्ष सिर्फ -100 प्रिंट नहीं करता है क्योंकि इसे प्रिंट करने के लिए 4 वर्ण होंगे।
आप सभी उदाहरणों में शीर्ष के बजाय htop का उपयोग कर सकते हैं जो अधिक सुविधाजनक हो सकता है। का उपयोग भी किया जा सकता है, लेकिन यह आधार बिंदु जो रियलटाइम और गैर-रियलटाइम प्राथमिकताओं को अलग करता है, 0 नहीं है, लेकिन 60 है, इसलिए यह प्रिंट करेगाps -l
nice -n -20 ps -l
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 आर 0 28983 28804 0 60 -20 - 1176 - पीटीएस / 6 00:00:00 पीएस