QNX RTOS: फ्लो प्लानिंग

QNX रीयल-टाइम ऑपरेटिंग सिस्टम पर नोटों की श्रृंखला की निरंतरता। इस बार मैं QNX6 * में थ्रेड शेड्यूलिंग के बारे में बात करना चाहूंगा। जैसा कि पाठक (जो श्रृंखला में पिछले नोट को पढ़ते हैं) पहले से ही जानते हैं, क्यूएनएक्स 6 माइक्रोकर्नेल थ्रेड्स को नियंत्रित करता है, प्रक्रियाओं को नहीं। और यह माइक्रोकर्नेल है जो थ्रेड के संदर्भ को लोड करता है जिसे अगले पल में नियंत्रण प्राप्त करना चाहिए। एक थ्रेड का विकल्प जिसे प्रोसेसर द्वारा निष्पादित किया जाएगा (यानी सक्रिय रूप से प्रोसेसर समय का उपयोग करें) थ्रेड का शेड्यूलिंग है।

जब थ्रेड शेड्यूलिंग होती है


QNX न्यूट्रीनो माइक्रोकर्नेल लगातार काम नहीं करता है, लेकिन केवल सिस्टम कॉल, अपवाद और व्यवधान के मामले में नियंत्रण प्राप्त करता है। इसके अलावा, माइक्रोन्यूक्लियस अपने काम के दौरान प्रवाह नियोजन करता है। इससे हम सही निष्कर्ष निकाल सकते हैं कि शेड्यूलिंग फ्लो का संचालन खुद से नहीं, बल्कि किसी घटना से होता है। वास्तव में, ऐसी कुछ घटनाएं हैं:

योजना को प्रभावित करने वाले प्रवाह पैरामीटर


QNX न्यूट्रीनो माइक्रोकर्नेल के मुख्य कार्यों में से एक ( और संदेश के बाद शायद सबसे महत्वपूर्ण ) थ्रेड शेड्यूलिंग है। यह वह माइक्रोकर्नल है जो संदर्भों को स्विच करता है और चयन करता है कि कौन सा धागा अगले बिंदु पर समय पर निष्पादित होगा। माइक्रोकर्नल यह सब सिर्फ उस तरह से नहीं करता है और अपनी बाईं एड़ी के अनुरोध पर नहीं, बल्कि निम्न प्रवाह मापदंडों के आधार पर करता है:
थ्रेड की प्राथमिकता सुपरसुअर थ्रेड्स ( रूट के रूप में चल रही) और नियमित उपयोगकर्ता थ्रेड्स के लिए 0-63 की सीमा में एक नंबर है। बूट छवि तैयार करते समय औसत उपयोगकर्ता के लिए उपलब्ध प्राथमिकताओं की श्रेणी को बदला जा सकता है। ऐसा करने के लिए, -p विकल्प को निर्दिष्ट करें। यह भी ध्यान दिया जाना चाहिए कि शून्य (सबसे कम) प्राथमिकता पर, idle धागे को निष्पादित किया जाता है, जो हमेशा नियंत्रण प्राप्त करता है यदि सिस्टम की READY राज्य में उच्च प्राथमिकताओं के साथ अधिक धागे नहीं हैं।

QNX6 ऑपरेटिंग सिस्टम कई फ्लो प्लानिंग विषयों का समर्थन करता है: FIFO , हिंडोला (चक्रीय, राउंड-रॉबिन, RR) और छिटपुट ** । इस थ्रेड विशेषता पर केवल तभी विचार किया जाएगा जब माइक्रोकर्नेल को समान प्राथमिकता स्तर के साथ थ्रेड्स के बीच चुनना होगा। योजना विषयों को बाद में वर्णित किया जाएगा।

एक और कारक है जो स्विचिंग प्रवाह के क्रम को प्रभावित करता है। प्रोसेसर को चलाने और उपयोग करने के लिए तैयार सभी धागे (यानी READY राज्य में धागे) पंक्तिबद्ध हैं। सिस्टम में ऐसी २५६ कतारें हैं (प्राथमिकताओं की संख्या से)। सभी चीजें समान हो रही हैं, जब माइक्रोक्राइन को एक ही प्राथमिकता के स्तर के साथ दो थ्रेड्स के बीच चुनना होता है, तो कतार में पहली बार थ्रेड को निष्पादित करना शुरू हो जाएगा। एक बार फिर, जब एक स्ट्रीम से बाहर निकलते समय पूर्वता होती है, तो इसे पहले कतार में रखा जाता है, और असाइनमेंट ( sched_yield() कॉल sched_yield() ), स्ट्रीम कतार में अंतिम हो जाती है।

FIFO योजना अनुशासन


यदि प्रवाह को एफआईएफओ शेड्यूलिंग अनुशासन (फर्स्ट इन फर्स्ट आउट, फ़र्स्ट इन, फ़र्स्ट आउट) दिया जाता है, तो यह तब तक चल सकता है जब तक आप चाहें। नियंत्रण को केवल दूसरे थ्रेड में स्थानांतरित किया जाएगा यदि थ्रेड को उच्च-प्राथमिकता वाले थ्रेड द्वारा सुधारा जाता है, तो थ्रेड अवरुद्ध हो जाता है या स्वेच्छा से नियंत्रण देता है। इस नियोजन अनुशासन का उपयोग करते हुए, एक धागा जो लंबी गणितीय गणना करता है, पूरी तरह से प्रोसेसर पर कब्जा कर सकता है (यानी, यह थ्रेड को समान और निम्न प्राथमिकता के साथ अनुमति नहीं देगा)।

हिंडोला अनुशासन योजना


यह नियोजन अनुशासन पूरी तरह से एफआईएफओ के समान है, सिवाय इसके कि थ्रेड को "अंतहीन रूप से" निष्पादित नहीं किया जाता है, लेकिन केवल एक निश्चित समय स्लॉट (टाइमलेस) के लिए काम करता है। समय की मात्रा समाप्त होने के बाद, माइक्रोन्यूक्लियस प्रक्रिया को क्रियान्वयन के लिए तैयार धागों की कतार के अंत में डालता है, और नियंत्रण को अगले थ्रेड (उसी प्राथमिकता स्तर पर) में स्थानांतरित कर दिया जाता है। यदि इस प्राथमिकता स्तर पर READY राज्य में कोई अन्य थ्रेड नहीं हैं, तो एक अन्य थ्रेड को समय स्लाइस आवंटित किया जाता है।

ऑपरेशन के लिए शेड्यूलिंग के हिंडोला अनुशासन के साथ थ्रेड्स को आवंटित किए जाने वाले समय की मात्रा को sched_rr_get_interval() फ़ंक्शन का उपयोग करके निर्धारित किया जा सकता है। वास्तव में, टाइमस्लाइक टिकसाइज से ठीक चार गुना है। बदले में, घड़ी अंतराल 40MHz के प्रोसेसर के साथ सिस्टम में 1ms और उच्चतर और धीमी प्रोसेसर वाले सिस्टम में 10ms है। यह पता चला है कि सामान्य x86 कंप्यूटर और लैपटॉप में, समय क्वांटम 4ms है।

छिटपुट योजना अनुशासन


FIFO शेड्यूलिंग में, एक थ्रेड जिसके लिए छिटपुट शेड्यूलिंग लागू किया जाता है, तब तक निष्पादित किया जाता है जब तक कि इसे अवरुद्ध नहीं किया जाता है या थ्रेड को उच्च प्राथमिकता के साथ बदल दिया जाता है। इसके अलावा, जैसे अनुकूली योजना में, एक प्रवाह जिसके लिए छिटपुट योजना को लागू किया जाता है, उसे कम प्राथमिकता मिलती है। हालांकि, छिटपुट योजना काफी सटीक प्रवाह नियंत्रण देती है।

छिटपुट योजना में, थ्रेड की प्राथमिकता गतिशील रूप से अग्रभूमि प्राथमिकता (अग्रभूमि, सामान्य प्राथमिकता) और पृष्ठभूमि (कम) प्राथमिकता के बीच बदल सकती है। इस छिटपुट संक्रमण को नियंत्रित करने के लिए निम्नलिखित मापदंडों का उपयोग किया जाता है:
जैसा कि अंजीर से देखा जा सकता है। 1, छिटपुट नियोजन एल्गोरिथ्म थ्रेड सी के लिए प्रारंभिक निष्पादन बजट निर्धारित करता है, जिसे थ्रेड द्वारा इसके निष्पादन की प्रक्रिया में खाया जाता है और पैरामीटर टी द्वारा निर्धारित आवृत्ति के साथ फिर से भरना होता है। जब थ्रेड अवरुद्ध हो जाता है, थ्रेड बजट आर के खर्च किए गए हिस्से को कुछ सेट समय (उदाहरण के लिए, 4ms बाद) ), उस क्षण से गिना जाता है जब धागा तैयार अवस्था में चला जाता है।


अंजीर। 1. प्रवाह निष्पादन अवधि की पुनरावृत्ति समय-समय पर होती है

सामान्य प्राथमिकता एन के साथ, धागा अपने प्रारंभिक निष्पादन बजट सी द्वारा निर्धारित समय की अवधि के लिए चलता है। इस अवधि की समाप्ति के बाद, धागा की प्राथमिकता कम स्तर एल तक कम हो जाती है जब तक कि पुनःपूर्ति ऑपरेशन नहीं होता है।

उदाहरण के लिए, कल्पना करें कि एक प्रणाली जिसमें प्रवाह कभी अवरुद्ध या बाधित नहीं होता है - अंजीर। 2।


अंजीर। 2. थ्रेड की प्राथमिकता तब तक कम हो जाती है जब तक कि इसका निष्पादन बजट फिर से न भर जाए।

इस मामले में, धागा कम प्राथमिकता (पृष्ठभूमि मोड) के साथ एक स्तर पर जाएगा, जिस पर इसका निष्पादन सिस्टम में अन्य थ्रेड्स की प्राथमिकता पर निर्भर करेगा।

जैसे ही पुनःपूर्ति होती है, प्रवाह की प्राथमिकता प्रारंभिक स्तर तक बढ़ जाती है। इस प्रकार, एक ठीक से कॉन्फ़िगर की गई प्रणाली में, सी के अधिकतम समय के लिए एक थ्रेड हर समयावधि T को निष्पादित करता है। यह सुनिश्चित करता है कि प्राथमिकता एन के साथ निष्पादित प्रत्येक थ्रेड सिस्टम संसाधनों का केवल C / T प्रतिशत का उपयोग करेगा।

जब एक धागा कई बार अवरुद्ध हो जाता है, तो कई पुनरावृत्ति संचालन समय में विभिन्न बिंदुओं पर हो सकते हैं। इसका मतलब यह हो सकता है कि समय अवधि टी के भीतर प्रवाह निष्पादन बजट सी के मूल्य तक पहुंच जाएगा; हालाँकि, इस अवधि के दौरान, बजट निरंतर नहीं हो सकता है।


अंजीर। 3. प्रवाह की प्राथमिकता उच्च और निम्न के बीच भिन्न होती है

अंजीर में। चित्रा 3 से पता चलता है कि प्रत्येक 40 एमएस की पुनःपूर्ति अवधि टी के लिए, धारा सी के निष्पादन के लिए बजट 10 एमएस है।
  1. प्रवाह 3 एमएस के बाद अवरुद्ध है, इसलिए, 3 एमएस पुनःपूर्ति ऑपरेशन 40 एमएस में निष्पादन के लिए निर्धारित किया जाएगा, अर्थात। उस समय, पहली पुनःपूर्ति अवधि का पूरा होना।
  2. प्रवाह निष्पादन 6 वीं मिलीसेकंड पर शुरू होता है, और यह क्षण अगले पुनःपूर्ति अवधि टी की शुरुआत को चिह्नित करता है। प्रवाह निष्पादन बजट में अभी भी 7 एमएस मार्जिन है।
  3. प्रवाह को 7 एमएस के लिए अवरुद्ध किए बिना निष्पादित किया जाता है, जिसके परिणामस्वरूप प्रवाह निष्पादन बजट समाप्त हो जाता है, और प्रवाह की प्राथमिकता स्तर एल तक कम हो जाती है, जिस पर वह नियंत्रण प्राप्त कर सकता है या नहीं कर सकता है। 46 वीं मिलीसेकंड (40 + 6) के लिए एक 7 एमएस प्रतिकृति की योजना बनाई गई है, अर्थात्। अवधि के बाद टी।
  4. 40 वीं मिलीसेकंड पर, प्रवाह बजट 3 एमएस (आरेख में चरण 1 देखें) द्वारा फिर से भर दिया जाता है, जिसके परिणामस्वरूप प्रवाह की प्राथमिकता सामान्य हो जाती है।
  5. धागा अपने बजट के 3 एमएस खर्च करता है और फिर कम प्राथमिकता पर वापस स्विच करता है।
  6. 46 वीं मिलीसेकंड पर, थ्रेड बजट को 7 एमएस (चरण 3 देखें) द्वारा फिर से भर दिया जाता है, और थ्रेड फिर से सामान्य प्राथमिकता प्राप्त करता है।
और इसी तरह। इस प्रकार, दो प्राथमिकता स्तरों के बीच चलते हुए, धारा प्रणाली में एपेरियोडिक घटनाओं को अनुमानित और नियंत्रित रूप से कार्य करती है।

कार्यक्रम से योजना की प्राथमिकता और अनुशासन कैसे निर्धारित करें


स्टार्टअप पर प्रत्येक धागा अपनी प्राथमिकता और नियोजन अनुशासन को मूल धागे से विरासत में मिला है। ऑपरेशन के दौरान, थ्रेड इन विशेषताओं को बदल सकता है। इस प्रयोजन के लिए, QNX6 में निम्नलिखित कार्य मौजूद हैं:
POSIX कॉलविवरण
sched_getparam()प्राथमिकता प्राप्त करें।
sched_setparam()प्राथमिकता तय करें।
sched_getscheduler()नियोजन का अनुशासन प्राप्त करें।
sched_setscheduler()नियोजन का एक अनुशासन स्थापित करें।
एक पूरी प्रक्रिया नहीं, बल्कि एक अलग थ्रेड की योजना बनाने की प्राथमिकता और अनुशासन पाने या निर्धारित करने के लिए, आप SchedGet() और SchedSet() उपयोग कर सकते हैं।

थोड़ा प्रशासन


पिछली पोस्ट में, मैंने पहले से ही pidin कमांड को संदर्भित किया था। इस बार हम दो और टीमों से मिलेंगे जो QNX के लिए विशिष्ट हैं। हर QNX6 व्यवस्थापक को इन आदेशों का उपयोग करने में सक्षम होना चाहिए। और शायद सबसे महत्वपूर्ण कमांड का use

use उपयोगिता किसी तरह से man कमांड का एक एनालॉग है। उपयोगिता आपको निष्पादन योग्य मॉड्यूल (बाइनरी निष्पादन योग्य फ़ाइल, स्क्रिप्ट या साझा लाइब्रेरी) पर सहायता प्राप्त करने की अनुमति देती है। use सिद्धांत man से कुछ अलग है, क्योंकि सभी मदद की जानकारी निष्पादन योग्य मॉड्यूल में ही संग्रहीत है, और अलग से नहीं। कमांड को कहा जाता है, उदाहरण के लिए, बस:

 # use sleep sleep - suspend execution for an interval (POSIX) sleep time Where: time is the number of seconds to sleep and can be a non-negative floating point number (0 <= time <= 4294967295). 

उपयोगिता उपयोगिता कमांड के साथ काम करने में थोड़ी मदद प्रदर्शित करती है; सहायता प्रणाली में एक पूर्ण विवरण उपलब्ध है।

एक अन्य उपयोगी कमांड जो कि प्रत्येक स्वाभिमानी QNX6 व्यवस्थापक के शस्त्रागार में होनी चाहिए, pidin । यह उपयोगिता सिस्टम के बारे में विभिन्न प्रकार की जानकारी प्रदान करती है, जिसमें निष्पादन थ्रेड और प्रक्रियाएं शामिल हैं (इस मामले में, उपयोगिता ps उपयोगिता के समान है)। उदाहरण के लिए, सिस्टम के बारे में सामान्य जानकारी देखने के लिए, आपको निम्न कमांड चलाना चाहिए:

 # pidin in CPU:X86 Release:6.5.0 FreeMem:166Mb/255Mb BootTime:Jul 05 15:53:27 MSKS 2011 Processes: 43, Threads: 107 Processor1: 131758 Pentium II Stepping 5 2593MHz FPU 

मापदंडों के बिना उपयोगिता को कॉल करना सभी प्रक्रियाओं और थ्रेड्स पर जानकारी प्रदर्शित करता है। ब्याज की प्रक्रिया के बारे में जानकारी प्राप्त करने के लिए, उदाहरण के लिए, केवल-स्विच निर्दिष्ट करें:

 # pidin -P io-audio pid tid name prio STATE Blocked 90127 1 sbin/io-audio 10o SIGWAITINFO 90127 2 sbin/io-audio 10o RECEIVE 1 90127 3 sbin/io-audio 10o RECEIVE 1 90127 4 sbin/io-audio 10o RECEIVE 1 90127 5 sbin/io-audio 50r INTR 90127 6 sbin/io-audio 50r RECEIVE 7 

आप देख सकते हैं कि प्रक्रिया मेमोरी का उपयोग कैसे करती है, ऐसा करने के लिए, निम्नलिखित कमांड चलाएँ:

 # pidin -P io-audio mem pid tid name prio STATE code data stack 90127 1 sbin/io-audio 10o SIGWAITINFO 128K 112K 8192(516K)* 90127 2 sbin/io-audio 10o RECEIVE 128K 112K 4096(132K) 90127 3 sbin/io-audio 10o RECEIVE 128K 112K 8192(132K) 90127 4 sbin/io-audio 10o RECEIVE 128K 112K 4096(132K) 90127 5 sbin/io-audio 50r INTR 128K 112K 4096(132K) 90127 6 sbin/io-audio 50r RECEIVE 128K 112K 4096(132K) libc.so.3 @b0300000 472K 12K a-ctrl-audiopci.so @b8200000 12K 4096 deva-mixer-ac97.so @b8204000 24K 8192 

उपयोग की गई साझा लाइब्रेरी के बारे में भी जानकारी प्रदर्शित होती है। यह बहुत सुविधाजनक है, मेरी राय में। pidin उपयोगिता बहुत सारे आदेशों और विकल्पों का समर्थन करती है, एक सूची और विवरण जो QNX सहायता प्रणाली में पाया जा सकता है।

और आज के लिए आखिरी, लेकिन मूल्य से नहीं, slay उपयोगिता। जैसा कि आप अनुमान लगा सकते हैं, इस कमांड का उपयोग प्रक्रियाओं को सिग्नल भेजने के लिए किया जाता है। डिफ़ॉल्ट रूप से, एक SIGTERM संकेत भेजा जाता है, जो आमतौर पर प्रक्रिया को समाप्त करता है। आप एक और संकेत निर्दिष्ट कर सकते हैं जिसे प्रक्रिया में भेजा जाना चाहिए। इस उपयोग के साथ, slay मार कमांड के समान है, लेकिन सबसे दिलचस्प बात यह है कि स्ले कमांड न केवल प्रक्रिया पहचानकर्ता (पीआईडी), बल्कि प्रक्रिया का नाम भी स्वीकार करता है। यह प्रशासन के लिए भी बहुत सुविधाजनक है। संकेतों को भेजने के अलावा, उपयोगिता का उपयोग प्रक्रिया नियोजन की प्राथमिकता या अनुशासन को बदलने के लिए किया जा सकता है। यदि आप एकल स्ट्रीम की विशेषताओं को बदलना चाहते हैं, तो आप -T स्विच को निर्दिष्ट कर सकते हैं। निम्नलिखित कुछ आदेश io-audio प्रक्रिया के 3 थ्रेड्स को शेड्यूल करने की प्राथमिकता और अनुशासन को बदलते हैं:

 [22:47:33 root]# pidin -P io-audio pid tid name prio STATE Blocked 90127 1 sbin/io-audio 10o SIGWAITINFO 90127 2 sbin/io-audio 10o RECEIVE 1 90127 3 sbin/io-audio 10o RECEIVE 1 90127 4 sbin/io-audio 10o RECEIVE 1 90127 5 sbin/io-audio 50r INTR 90127 6 sbin/io-audio 50r RECEIVE 7 [22:47:36 root]# slay -T 3 -P 11r io-audio [22:47:38 root]# pidin -P io-audio pid tid name prio STATE Blocked 90127 1 sbin/io-audio 10o SIGWAITINFO 90127 2 sbin/io-audio 10o RECEIVE 1 90127 3 sbin/io-audio 11r RECEIVE 1 90127 4 sbin/io-audio 10o RECEIVE 1 90127 5 sbin/io-audio 50r INTR 90127 6 sbin/io-audio 50r RECEIVE 7 

slay उपयोगिता का एक पूर्ण विवरण QNX सहायता प्रणाली में उपलब्ध है।

बस के मामले में, मैं यह नोट करना चाहता था कि QNX6 में परिचित UNIX ps और kill यूटिलिटीज भी हैं। हालांकि, QNX6 का उपयोग pidin और pidin तुलना में बहुत अधिक सुविधाजनक है, क्योंकि वे सिस्टम की बारीकियों को ध्यान में रखते हैं।

निष्कर्ष


इस लेख को पढ़ने के बाद, आपको QNX6 में थ्रेड शेड्यूलिंग का विचार मिला, प्रक्रियाओं और थ्रेड्स को प्रबंधित करने के लिए प्राथमिकताओं और विषयों, योजना कार्यों और उपयोगिताओं की पर्याप्त जानकारी। QNX में एक दिलचस्प तकनीक, एडेप्टिव पार्टिशनिंग (अनुकूली अपघटन) भी है, जो आपको प्रक्रियाओं के समूह बनाने और उन्हें CPU समय का प्रतिशत असाइन करने की अनुमति देता है। सब कुछ एक साथ नहीं लाने के लिए, मैं निम्नलिखित नोटों में से एक में इस तकनीक का वर्णन करने की कोशिश करूंगा।

संदर्भ

  1. वास्तविक समय ऑपरेटिंग सिस्टम QNX न्यूट्रिनो 6.3। सिस्टम आर्किटेक्चर। आईएसबीएन 5-94157-827-एक्स
  2. वास्तविक समय ऑपरेटिंग सिस्टम QNX न्यूट्रिनो 6.3। उपयोगकर्ता मैनुअल। आईएसबीएन 978-5-9775-0370-9
  3. रोब क्रेटेन, "क्यूएनएक्स न्यूट्रिनो का परिचय 2. रियल-टाइम एप्लिकेशन डेवलपर्स के लिए एक गाइड," दूसरा संस्करण। आईएसबीएन 978-5-9775-0681-6

* इस लेख में QNX6 QNX 6.5.0 को संदर्भित करता है। चूंकि QNX न्यूट्रिनो कर्नेल को निम्न संस्करणों में से एक में संशोधित किया जा सकता है, इसलिए यहां उल्लिखित प्रवाह नियोजन तंत्र बदल सकता है।

** QNX6 में एक और नियोजन अनुशासन (OTHER, o) भी है, जो गोल-रॉबिन (गोल-रॉबिन, आरआर, आर) के समान है।

*** टिक अंतराल (टिकसाइज़) को बदला जा सकता है, उदाहरण के लिए, ClockPeriod() फ़ंक्शन का उपयोग करके।

Source: https://habr.com/ru/post/In125835/


All Articles