शीर्ष आउटपुट में अच्छा मूल्य और प्राथमिकता के बीच अंतर


11

शीर्ष पर , डिफ़ॉल्ट रूप से, दोनों स्तंभों को सूचीबद्ध करता है। मैं उत्सुक हूं कि क्या अंतर है। मैंने मैन पेजों की जाँच की और यह पता नहीं लगा सका:

प्राथमिकता:

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

अच्छा मूल्य:

   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.

मैं समझता हूं कि अच्छा मूल्य कर्नेल के सीपीयू अनुसूचक कतार से संबंधित है; तब प्राथमिकता क्या इंगित करती है? शायद I / O के बारे में कुछ?

जवाबों:


8

अच्छा मूल्य एक "वैश्विक" तंत्र है, जबकि प्राथमिकता अभी कार्य स्विचर के लिए प्रासंगिक है ।


कार्य स्विचर से आपका क्या अभिप्राय है?
बेलमिन फर्नांडीज

1
कार्य स्विचर (ठीक से "अनुसूचक" कहा जाता है) कर्नेल के भीतर थोड़ा सा कोड है जो यह तय करता है कि आगे क्या कार्य चलेगा।
इग्नासियो वाज़केज़-अब्राम्स

25

अंतर यह है कि पीआर कर्नेल के अंदर एक प्रक्रिया की वास्तविक प्राथमिकता है और एनआई कर्नेल के लिए सिर्फ एक संकेत है कि प्रक्रिया की प्राथमिकता क्या होनी चाहिए।

ज्यादातर मामलों में पीआर मूल्य की गणना निम्न सूत्र द्वारा की जा सकती है: पीआर = 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 -lnice -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 पीएस

अजीब तरह से पर्याप्त है, अगर मैं 2 कोर हाइपरथ्रेडेड i3 पर 5 अनंत लूप (इंट मेन {जबकि (1);}) चलाता हूं, तो उनकी प्राथमिकताएं स्थिर रहती हैं। यह डेबियन सिड परीक्षण में।
वोरैक

1
@BelminFernandez मुझे लगता है कि इस उत्तर को "स्वीकार" करना उचित होगा।
z0lupka

1

संक्षिप्त जवाब

पीआर प्राथमिकता स्तर है। पीआर जितना कम होगा, प्रक्रिया की प्राथमिकता उतनी अधिक होगी।

पीआर की गणना निम्नानुसार की जाती है:

  • सामान्य प्रक्रियाओं के लिए: PR = 20 - NI (NI अच्छा है और -20 से 19 तक है)
  • वास्तविक समय प्रक्रियाओं के लिए: PR = - 1 - real_time_priority (real_time_priority 1 से 99 तक होती है)

लंबा जवाब

2 प्रकार की प्रक्रियाएं हैं, सामान्य वाले और वास्तविक समय सामान्य लोगों के लिए (और केवल उन लोगों के लिए), निम्नानुसार अच्छा लागू किया जाता है:

अच्छा

"निकनेस" स्केल -20 से 19 तक जाता है, जबकि -20 यह सर्वोच्च प्राथमिकता और 19 सबसे कम प्राथमिकता है। प्राथमिकता स्तर की गणना निम्न प्रकार से की जाती है:

पीआर = 20 + एनआई

जहां NI अच्छा स्तर है और PR प्राथमिकता स्तर है। इसलिए जैसा कि हम देख सकते हैं, -20 वास्तव में 0 में मैप करते हैं, जबकि 19 मैप्स 39 तक।

डिफ़ॉल्ट रूप से, एक प्रोग्राम अच्छा मूल्य 0 बिट है जो रूट उपयोगकर्ता के लिए निम्नलिखित कमांड का उपयोग करके निर्दिष्ट अच्छे मूल्य के साथ लंच प्रोग्राम के लिए संभव है:

nice -n <nice_value> ./myProgram 

रियल टाइम

हम और भी आगे बढ़ सकते थे। अच्छी प्राथमिकता वास्तव में उपयोगकर्ता कार्यक्रमों के लिए उपयोग की जाती है। जबकि UNIX / LINUX की समग्र प्राथमिकता में 140 मान हैं, अच्छा मूल्य प्रक्रिया को सीमा के अंतिम भाग (100 से 139 तक) में मैप करने में सक्षम बनाता है। यह समीकरण 0 से 99 तक पहुंच से बाहर हो जाता है जो एक नकारात्मक पीआर स्तर (-100 से -1) के अनुरूप होगा। उन मूल्यों तक पहुंचने में सक्षम होने के लिए, प्रक्रिया को "वास्तविक समय" के रूप में बताया जाना चाहिए।

LINUX वातावरण में 5 शेड्यूलिंग नीतियाँ हैं जिन्हें निम्न आदेश के साथ प्रदर्शित किया जा सकता है:

chrt -m 

जो निम्न सूची दिखाएगा:

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

शेड्यूलिंग प्रक्रियाओं को 2 समूहों में विभाजित किया जा सकता है, सामान्य शेड्यूलिंग नीतियां (1 से 3) और वास्तविक समय निर्धारण नीतियां (4 और 5)। वास्तविक समय प्रक्रियाओं में हमेशा सामान्य प्रक्रियाओं पर प्राथमिकता होगी। निम्न आदेश का उपयोग करके एक वास्तविक समय प्रक्रिया को बुलाया जा सकता है (उदाहरण यह है कि SCHED_RR नीति कैसे घोषित की जाए):

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

वास्तविक समय प्रक्रिया के लिए PR मान प्राप्त करने के लिए निम्नलिखित समीकरण लागू किया जाता है:

पीआर = -1 - आरटी_पीयर

जहाँ rt_prior 1 और 99 के बीच प्राथमिकता से मेल खाता है। उस कारण से जिस प्रक्रिया में अन्य प्रक्रियाओं की तुलना में उच्च प्राथमिकता होगी वह नंबर 99 के साथ बुलाया जाएगा।

यह ध्यान रखना महत्वपूर्ण है कि वास्तविक समय प्रक्रियाओं के लिए, अच्छे मूल्य का उपयोग नहीं किया जाता है।

एक प्रक्रिया के वर्तमान "अच्छा" और पीआर मूल्य को देखने के लिए निम्नलिखित कमांड निष्पादित किया जा सकता है:

top

यह नोट करना अच्छा है कि पीआर मूल्य -51 के साथ प्रक्रियाएं उदाहरण के लिए वास्तविक समय मूल्य से मेल खाती हैं। कुछ प्रक्रियाएँ ऐसी भी हैं जिनका PR मान "rt" कहा जाता है। यह मान वास्तव में -100 के PR मान से मेल खाता है।

(पुनश्च: मैंने शीर्ष परिणाम दिखाते हुए एक तस्वीर पोस्ट की होगी, लेकिन मेरे पास ऐसा करने के लिए प्रतिष्ठा नहीं है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.