महत्वपूर्ण अनुभाग: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
{{Short description|Protected section of code that cannot be executed by more than one process at a time}} | {{Short description|Protected section of code that cannot be executed by more than one process at a time}} | ||
[[समवर्ती प्रोग्रामिंग]] में, [[साझा संसाधन]] तक समवर्ती | [[समवर्ती प्रोग्रामिंग]] में, [[साझा संसाधन]] तक समवर्ती रूप से अप्रत्याशित या गलत व्यवहार का कारण बन सकती है, इसलिए [[प्रोग्राम करने योग्य ROM|प्रोग्राम]] के कुछ अनुभाग जहां साझा संसाधनों तक पहुंच बनाई जाती है, उन्हें [[समवर्ती पहुंच]] से बचने के तरीकों से संरक्षित करने की आवश्यकता होती है। ऐसा करने का एक तरीका महत्वपूर्ण खंड या महत्वपूर्ण क्षेत्र के रूप में जाना जाता है। इस संरक्षित खंड में एक समय में एक से अधिक प्रक्रिया या क्रम द्वारा प्रवेश नहीं किया जा सकता है; साथ ही दूसरे खण्डों को तब तक के लिए निलंबित कर दिया जाता है जब तक कि पहला महत्वपूर्ण खंड नहीं छोड़ देता। विशिष्ट रूप से, महत्वपूर्ण खंड एक साझा संसाधन तक पहुँचता है, जैसे [[डेटा संरचना]], एक परिधीय उपकरण, या एक नेटवर्क कनेक्शन, जो कई समवर्ती पहुँचों के संदर्भ में सही ढंग से कार्य नहीं करेगा।<ref>{{Cite book |title=Concurrent Programming: Algorithms, Principles, and Foundations |last=Raynal |first=Michel |publisher=Springer Science & Business Media |year=2012 |isbn=978-3642320279 |pages=9}}</ref> | ||
== महत्वपूर्ण वर्गों की आवश्यकता == | == महत्वपूर्ण वर्गों की आवश्यकता == | ||
अलग-अलग कोड या प्रक्रियाओं में एक ही चर या अन्य संसाधन | अलग-अलग कोड या प्रक्रियाओं में एक ही चर या अन्य संसाधन सम्मिलित हो सकते हैं जिन्हें पढ़ने या लिखने की आवश्यकता होती है लेकिन जिनके परिणाम उस क्रम पर निर्भर करते हैं जिसमें क्रियाएं होती हैं। उदाहरण के लिए, यदि एक चर {{var|x}} प्रक्रिया A द्वारा पढ़ा जाना है, और प्रक्रिया B को उसी चर {{var|x}} पर लिखना है तो उसी समय, प्रक्रिया A को या तो पुराना या नया मान {{var|x}} मिल सकता है . | ||
[[File:Critical section fg.jpg|thumb|क्रिटिकल सेक्शन की आवश्यकता को दर्शाने वाला फ्लो ग्राफ]]प्रक्रिया | [[File:Critical section fg.jpg|thumb|क्रिटिकल सेक्शन की आवश्यकता को दर्शाने वाला फ्लो ग्राफ]]प्रक्रिया A: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
// Process A | // Process A | ||
Line 14: | Line 14: | ||
. | . | ||
</syntaxhighlight> | </syntaxhighlight> | ||
प्रक्रिया | प्रक्रिया B: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
// Process B | // Process B | ||
Line 22: | Line 22: | ||
. | . | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ऐसे | ऐसे प्रकरणों में जहां बेहतर कणिकामयता के साथ [[ ताला (कंप्यूटर विज्ञान) |अभिबंधन (कंप्यूटर विज्ञान)]] तंत्र की जरूरत नहीं है, एक महत्वपूर्ण खंड महत्वपूर्ण है। उपरोक्त प्रकरण में, यदि A को अद्यतन मूल्य को पढ़ने की आवश्यकता है {{var|x}}, एक ही समय में प्रक्रिया A और प्रक्रिया B को क्रियान्वित करने से आवश्यक परिणाम नहीं मिल सकते हैं। इसे रोकने के लिए, चर {{var|x}} एक महत्वपूर्ण खंड द्वारा संरक्षित है। सबसे पहले, बी को अनुभाग तक पहुंच प्राप्त होती है। एक बार जब B मान लिखना समाप्त कर देता है, तो A को महत्वपूर्ण अनुभाग और चर तक पहुंच प्राप्त हो जाती है {{var|x}} पढ़ा जा सकता है। | ||
महत्वपूर्ण खंड के अंदर और बाहर कौन से चर संशोधित किए गए हैं, इसे ध्यान से नियंत्रित करके, साझा चर के समवर्ती उपयोग को रोका जाता है। एक महत्वपूर्ण खंड का उपयोग | महत्वपूर्ण खंड के अंदर और बाहर कौन से चर संशोधित किए गए हैं, इसे ध्यान से नियंत्रित करके, साझा चर के समवर्ती उपयोग को रोका जाता है। एक महत्वपूर्ण खंड का उपयोग सामान्यतः तब किया जाता है जब एक बहु-क्रमेड प्रोग्राम को एक अलग क्रम के बिना उस डेटा में परस्पर विरोधी परिवर्तन किए बिना कई संबंधित चर को अपडेट करना चाहिए। संबंधित स्थिति में, एक महत्वपूर्ण खंड का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि एक साझा संसाधन, उदाहरण के लिए, एक प्रिंटर, एक समय में केवल एक प्रक्रिया द्वारा ही पहुँचा जा सकता है। | ||
== महत्वपूर्ण वर्गों का कार्यान्वयन == | == महत्वपूर्ण वर्गों का कार्यान्वयन == | ||
विभिन्न ऑपरेटिंग सिस्टमों के बीच महत्वपूर्ण वर्गों का कार्यान्वयन भिन्न होता है। | विभिन्न ऑपरेटिंग सिस्टमों के बीच महत्वपूर्ण वर्गों का कार्यान्वयन भिन्न होता है। | ||
एक महत्वपूर्ण खंड | एक महत्वपूर्ण खंड सामान्यतः परिमित समय में समाप्त हो जाएगा,<ref name=":0">{{Cite book |title=GNU/Linux Application Programming (2nd ed.). [Hingham, Mass.] |last=Jones |first=M. Tim |publisher=Charles River Media |year=2008 |isbn=978-1-58450-568-6 |pages=264}}</ref> और एक क्रम, कार्य या प्रक्रिया को इसमें प्रवेश करने के लिए एक निश्चित समय तक प्रतीक्षा करनी होगी (पीटरसन का एल्गोरिथ्म # बाउंड वेटिंग)। महत्वपूर्ण वर्गों के अनन्य उपयोग को सुनिश्चित करने के लिए प्रोग्राम के प्रवेश और निकास पर कुछ तुल्यकालन तंत्र की आवश्यकता होती है। | ||
क्रिटिकल सेक्शन एक प्रोग्राम का एक हिस्सा है जिसके लिए एक्सेस के पारस्परिक बहिष्कार की आवश्यकता होती है। | क्रिटिकल सेक्शन एक प्रोग्राम का एक हिस्सा है जिसके लिए एक्सेस के पारस्परिक बहिष्कार की आवश्यकता होती है। | ||
[[File:Locks and critical sections.jpg|thumb|381x381px|कई | [[File:Locks and critical sections.jpg|thumb|381x381px|कई क्रम्स में लॉक और महत्वपूर्ण सेक्शन]]जैसा चित्र में दिखाया गया है,<ref>{{Cite journal |last=Chen, Stenstrom |first=Guancheng, Per |date=Nov 10–16, 2012 |title=Critical Lock Analysis: Diagnosing Critical Section Bottlenecks in Multithreaded Applications |journal=High Performance Computing, Networking, Storage and Analysis (SC), 2012 International Conference |pages=1–11 |doi=10.1109/sc.2012.40 |isbn=978-1-4673-0805-2|s2cid=12519578 }}</ref> पारस्परिक बहिष्करण ([[ म्युटेक्स ]]) के प्रकरण में, एक क्रम लॉकिंग तकनीकों का उपयोग करके एक महत्वपूर्ण खंड को अवरुद्ध करता है जब इसे साझा संसाधन तक पहुंचने की आवश्यकता होती है, और अन्य धागे को अनुभाग में प्रवेश करने के लिए अपनी बारी प्राप्त करने के लिए इंतजार करना पड़ता है। यह विरोध को रोकता है जब दो या दो से अधिक धागे एक ही मेमोरी स्पेस साझा करते हैं और एक सामान्य संसाधन तक पहुंचना चाहते हैं।<ref name=":0" /> | ||
[[File:Critical section pseudo code.png|thumb|289x289px|महत्वपूर्ण खंड को लागू करने के लिए स्यूडोकोड]]महत्वपूर्ण खंड के अंदर प्रोसेसर नियंत्रण के किसी भी परिवर्तन को रोकने के लिए सबसे सरल तरीका एक सेमाफोर लागू करना है। यूनिप्रोसेसर सिस्टम में, यह महत्वपूर्ण खंड में प्रवेश पर व्यवधान को अक्षम करके, सिस्टम कॉल से बचने के द्वारा किया जा सकता है जो अनुभाग के अंदर एक [[संदर्भ स्विच]] का कारण बन सकता है, और बाहर निकलने पर उनकी पिछली स्थिति में व्यवधान को बहाल कर सकता है। सिस्टम में कहीं भी किसी भी महत्वपूर्ण खंड में प्रवेश करने वाला निष्पादन का कोई भी | [[File:Critical section pseudo code.png|thumb|289x289px|महत्वपूर्ण खंड को लागू करने के लिए स्यूडोकोड]]महत्वपूर्ण खंड के अंदर प्रोसेसर नियंत्रण के किसी भी परिवर्तन को रोकने के लिए सबसे सरल तरीका एक सेमाफोर लागू करना है। यूनिप्रोसेसर सिस्टम में, यह महत्वपूर्ण खंड में प्रवेश पर व्यवधान को अक्षम करके, सिस्टम कॉल से बचने के द्वारा किया जा सकता है जो अनुभाग के अंदर एक [[संदर्भ स्विच]] का कारण बन सकता है, और बाहर निकलने पर उनकी पिछली स्थिति में व्यवधान को बहाल कर सकता है। सिस्टम में कहीं भी किसी भी महत्वपूर्ण खंड में प्रवेश करने वाला निष्पादन का कोई भी क्रम, इस कार्यान्वयन के साथ, किसी भी अन्य क्रम को, एक रुकावट सहित, सीपीयू पर प्रसंस्करण समय दिए जाने से रोकेगा - और इसलिए किसी अन्य महत्वपूर्ण खंड या, वास्तव में, किसी भी कोड में प्रवेश करने से जो भी हो—जब तक कि मूल धागा अपने महत्वपूर्ण खंड को छोड़ न दे। | ||
[[सेमाफोर (प्रोग्रामिंग)]] का उपयोग करके इस क्रूर-बल दृष्टिकोण में सुधार किया जा सकता है। एक महत्वपूर्ण खंड में प्रवेश करने के लिए, एक | [[सेमाफोर (प्रोग्रामिंग)]] का उपयोग करके इस क्रूर-बल दृष्टिकोण में सुधार किया जा सकता है। एक महत्वपूर्ण खंड में प्रवेश करने के लिए, एक क्रम को एक सेमाफोर प्राप्त करना होगा, जिसे वह अनुभाग छोड़ने पर जारी करता है। अन्य क्रम्स को मूल क्रम के साथ ही क्रिटिकल सेक्शन में प्रवेश करने से रोका जाता है, लेकिन सीपीयू पर नियंत्रण हासिल करने और अन्य कोड को निष्पादित करने के लिए स्वतंत्र हैं, जिसमें अन्य महत्वपूर्ण सेक्शन सम्मिलित हैं जो विभिन्न सेमाफोर द्वारा संरक्षित हैं। सेमाफोर लॉकिंग में गतिरोध की स्थिति को रोकने के लिए एक समय सीमा भी होती है जिसमें एक ही प्रक्रिया द्वारा अनंत समय के लिए एक लॉक का अधिग्रहण किया जाता है, अन्य प्रक्रियाओं को रोकते हुए जिन्हें महत्वपूर्ण खंड द्वारा संरक्षित साझा संसाधन का उपयोग करने की आवश्यकता होती है। | ||
== महत्वपूर्ण वर्गों का उपयोग == | == महत्वपूर्ण वर्गों का उपयोग == | ||
=== कर्नेल-स्तर के महत्वपूर्ण खंड === | === कर्नेल-स्तर के महत्वपूर्ण खंड === | ||
सामान्यतः, महत्वपूर्ण खंड प्रोसेसर के बीच क्रम और [[ प्रक्रिया प्रवास |प्रक्रिया प्रवास]] को रोकते हैं और [[ बाधा डालना |बाधा डालना]] ्स और अन्य प्रक्रियाओं और क्रम्स द्वारा प्रक्रियाओं और क्रम्स के प्रीमेशन (कंप्यूटिंग) को रोकते हैं। | |||
गंभीर खंड | गंभीर खंड अधिकांशतः नेस्टिंग की अनुमति देते हैं। नेस्टिंग कई महत्वपूर्ण वर्गों को कम लागत पर प्रवेश करने और बाहर निकलने की अनुमति देता है। | ||
यदि [[ निर्धारण (कंप्यूटिंग) |निर्धारण (कंप्यूटिंग)]] एक महत्वपूर्ण खंड में वर्तमान प्रक्रिया या | यदि [[ निर्धारण (कंप्यूटिंग) |निर्धारण (कंप्यूटिंग)]] एक महत्वपूर्ण खंड में वर्तमान प्रक्रिया या क्रम को बाधित करता है, तो शेड्यूलर या तो वर्तमान में निष्पादित प्रक्रिया या क्रम को महत्वपूर्ण अनुभाग को पूरा करने के लिए चलने की अनुमति देगा, या यह किसी अन्य पूर्ण क्वांटम के लिए प्रक्रिया या क्रम को शेड्यूल करेगा। शेड्यूलर प्रक्रिया या क्रम को किसी अन्य प्रोसेसर में माइग्रेट नहीं करेगा, और यह किसी अन्य प्रक्रिया या क्रम को चलाने के लिए शेड्यूल नहीं करेगा, जबकि वर्तमान प्रक्रिया या क्रम एक महत्वपूर्ण खंड में है। | ||
इसी तरह, यदि किसी महत्वपूर्ण खंड में कोई बाधा उत्पन्न होती है, तो भविष्य में प्रसंस्करण के लिए रुकावट की जानकारी दर्ज की जाती है, और निष्पादन को महत्वपूर्ण खंड में प्रक्रिया या | इसी तरह, यदि किसी महत्वपूर्ण खंड में कोई बाधा उत्पन्न होती है, तो भविष्य में प्रसंस्करण के लिए रुकावट की जानकारी दर्ज की जाती है, और निष्पादन को महत्वपूर्ण खंड में प्रक्रिया या क्रम पर लौटा दिया जाता है।<ref>{{Cite journal|date=November 2011|title=क्रिटिकल सेक्शन प्रॉब्लम के सॉफ्टवेयर सॉल्यूशन पर रिसर्च पेपर|url=https://www.researchgate.net/publication/268031056|journal=International Journal of Advance Technology & Engineering Research (IJATER)|volume=1}}</ref> एक बार जब महत्वपूर्ण खंड बाहर निकल जाता है, और कुछ प्रकरणों में निर्धारित मात्रा पूरी हो जाती है, तो लंबित रुकावट को निष्पादित किया जाएगा। शेड्यूलिंग क्वांटम की अवधारणा [[राउंड-रॉबिन शेड्यूलिंग]] | राउंड-रॉबिन और इसी तरह के शेड्यूलिंग (कंप्यूटिंग) पर लागू होती है। | ||
चूंकि महत्वपूर्ण खंड केवल उस प्रोसेसर पर [[निष्पादन (कंप्यूटर)]] कर सकते हैं जिस पर वे दर्ज किए गए हैं, निष्पादन प्रोसेसर के भीतर ही सिंक्रनाइज़ेशन की आवश्यकता होती है। यह महत्वपूर्ण वर्गों को लगभग शून्य लागत पर प्रवेश करने और बाहर निकलने की अनुमति देता है। कोई इंटर-प्रोसेसर तुल्यकालन की आवश्यकता नहीं है। केवल निर्देश धारा तुल्यकालन<ref>{{Cite journal|last=Dubois, Scheurich|first=Michel, Christoph|title=मल्टीप्रोसेसरों में तुल्यकालन, जुटना और घटना क्रम|url=https://api.semanticscholar.org/CorpusID:1749330|journal=Survey and Tutorial Series|year=1988|volume=21|issue=2|pages=9–21|doi=10.1109/2.15|s2cid=1749330}}</ref> ज़रूरी है। अधिकांश प्रोसेसर वर्तमान निष्पादन स्थिति को बाधित करने के सरल कार्य द्वारा आवश्यक मात्रा में सिंक्रनाइज़ेशन प्रदान करते हैं। यह अधिकांश | चूंकि महत्वपूर्ण खंड केवल उस प्रोसेसर पर [[निष्पादन (कंप्यूटर)]] कर सकते हैं जिस पर वे दर्ज किए गए हैं, निष्पादन प्रोसेसर के भीतर ही सिंक्रनाइज़ेशन की आवश्यकता होती है। यह महत्वपूर्ण वर्गों को लगभग शून्य लागत पर प्रवेश करने और बाहर निकलने की अनुमति देता है। कोई इंटर-प्रोसेसर तुल्यकालन की आवश्यकता नहीं है। केवल निर्देश धारा तुल्यकालन<ref>{{Cite journal|last=Dubois, Scheurich|first=Michel, Christoph|title=मल्टीप्रोसेसरों में तुल्यकालन, जुटना और घटना क्रम|url=https://api.semanticscholar.org/CorpusID:1749330|journal=Survey and Tutorial Series|year=1988|volume=21|issue=2|pages=9–21|doi=10.1109/2.15|s2cid=1749330}}</ref> ज़रूरी है। अधिकांश प्रोसेसर वर्तमान निष्पादन स्थिति को बाधित करने के सरल कार्य द्वारा आवश्यक मात्रा में सिंक्रनाइज़ेशन प्रदान करते हैं। यह अधिकांश प्रकरणों में महत्वपूर्ण अनुभागों को दर्ज किए गए महत्वपूर्ण अनुभागों की प्रति प्रोसेसर गणना से अधिक कुछ नहीं होने देता है। | ||
प्रदर्शन संवर्द्धन में सभी महत्वपूर्ण वर्गों के बाहर निकलने पर लंबित व्यवधानों को निष्पादित करना और अनुसूचक को सभी महत्वपूर्ण वर्गों के बाहर निकलने की अनुमति देना | प्रदर्शन संवर्द्धन में सभी महत्वपूर्ण वर्गों के बाहर निकलने पर लंबित व्यवधानों को निष्पादित करना और अनुसूचक को सभी महत्वपूर्ण वर्गों के बाहर निकलने की अनुमति देना सम्मिलित है। इसके अतिरिक्त, निष्पादन के लिए लंबित रुकावटों को अन्य प्रोसेसरों में स्थानांतरित किया जा सकता है। | ||
क्रिटिकल सेक्शन को लंबे समय तक चलने वाले लॉकिंग आदिम के रूप में | क्रिटिकल सेक्शन को लंबे समय तक चलने वाले लॉकिंग आदिम के रूप में उपयोग नहीं किया जाना चाहिए। क्रिटिकल सेक्शन को काफी छोटा रखा जाना चाहिए जिससे कि इसे [[पर्सनल कंप्यूटर हार्डवेयर]] और शेड्यूलर से आने वाली किसी भी रुकावट के बिना प्रवेश, निष्पादित और बाहर किया जा सके। | ||
कर्नेल-स्तर के महत्वपूर्ण खंड [[सॉफ्टवेयर तालाबंदी]] समस्या का आधार हैं। | कर्नेल-स्तर के महत्वपूर्ण खंड [[सॉफ्टवेयर तालाबंदी|सॉफ्टवेयर अभिबंधनबंदी]] समस्या का आधार हैं। | ||
[[वृक्ष (डेटा संरचना)]] में महत्वपूर्ण खंड == | [[वृक्ष (डेटा संरचना)]] में महत्वपूर्ण खंड == | ||
समानांतर प्रोग्रामिंग में, कोड को | समानांतर प्रोग्रामिंग में, कोड को क्रम्स में विभाजित किया जाता है। पठन-लेखन विरोध | पठन-लेखन परस्पर विरोधी चर क्रम्स के बीच विभाजित होते हैं और प्रत्येक क्रम में उनकी एक प्रति होती है। डेटा स्ट्रक्चर जैसे [[ लिंक्ड सूची |लिंक्ड सूची]], ट्री (डेटा स्ट्रक्चर), [[ हैश तालिका |हैश तालिका]] आदि में डेटा वैरिएबल होते हैं जो लिंक होते हैं और क्रम्स के बीच विभाजित नहीं किए जा सकते हैं और इसलिए समानता को लागू करना बहुत मुश्किल है।<ref name=":1">{{Cite book|title=पैरेलल मल्टीकोर आर्किटेक्चर के फंडामेंटल|last=Solihin|first=Yan|date=17 November 2015|isbn=9781482211184}}</ref> डेटा संरचनाओं को लागू करने की दक्षता में सुधार करने के लिए सम्मिलन, विलोपन, खोज जैसे कई कार्यों को समानांतर में निष्पादित करने की आवश्यकता है। इन कार्यों को करते समय, ऐसे परिदृश्य हो सकते हैं जहां एक ही तत्व को एक क्रम द्वारा खोजा जा रहा है और दूसरे द्वारा हटाया जा रहा है। ऐसे प्रकरणों में, आउटपुट त्रुटिपूर्ण प्रोग्राम हो सकता है। तत्व की खोज करने वाले क्रम में हिट हो सकती है, जबकि अन्य क्रम उस समय के बाद इसे हटा सकते हैं। ये परिदृश्य गलत डेटा प्रदान करके चल रहे प्रोग्राम में समस्याएँ उत्पन्न करेंगे। इसे रोकने के लिए, एक विधि यह है कि संपूर्ण डेटा-संरचना को महत्वपूर्ण खंड के अंतर्गत रखा जा सकता है जिससे कि एक समय में केवल एक ऑपरेशन को नियंत्रित किया जा सके। एक अन्य विधि महत्वपूर्ण खंड के अनुसार उपयोग में आने वाले नोड को लॉक कर रही है, जिससे कि अन्य ऑपरेशन उसी नोड का उपयोग न करें। महत्वपूर्ण खंड का उपयोग करना, इस प्रकार, यह सुनिश्चित करता है कि कोड अपेक्षित आउटपुट प्रदान करता है।<ref name=":1" /> | ||
Line 66: | Line 66: | ||
महत्वपूर्ण खंड कोड में भी होते हैं जो बाहरी बाह्य उपकरणों, जैसे कि I/O उपकरणों में हेरफेर करता है। एक परिधीय के रजिस्टरों को एक निश्चित क्रम में निश्चित मूल्यों के साथ क्रमादेशित किया जाना चाहिए; यदि दो या दो से अधिक प्रक्रियाएं एक उपकरण को एक साथ नियंत्रित करती हैं, तो गलत व्यवहार सुनिश्चित होगा: किसी भी प्रक्रिया में उपकरण उस स्थिति में नहीं होगा जिसकी उसे आवश्यकता है। | महत्वपूर्ण खंड कोड में भी होते हैं जो बाहरी बाह्य उपकरणों, जैसे कि I/O उपकरणों में हेरफेर करता है। एक परिधीय के रजिस्टरों को एक निश्चित क्रम में निश्चित मूल्यों के साथ क्रमादेशित किया जाना चाहिए; यदि दो या दो से अधिक प्रक्रियाएं एक उपकरण को एक साथ नियंत्रित करती हैं, तो गलत व्यवहार सुनिश्चित होगा: किसी भी प्रक्रिया में उपकरण उस स्थिति में नहीं होगा जिसकी उसे आवश्यकता है। | ||
जब एक आउटपुट डिवाइस पर कई आउटपुट ऑपरेशन जारी करके सूचना की एक जटिल इकाई का उत्पादन किया जाना चाहिए, तो विशेष पहुंच की आवश्यकता होती है | जब एक आउटपुट डिवाइस पर कई आउटपुट ऑपरेशन जारी करके सूचना की एक जटिल इकाई का उत्पादन किया जाना चाहिए, तो विशेष पहुंच की आवश्यकता होती है जिससे कि कोई अन्य प्रक्रिया आउटपुट के अपने बिट्स को इंटरलीविंग करके डेटम को दूषित न करे। | ||
इनपुट दिशा में, कई अलग-अलग इनपुट ऑपरेशंस के माध्यम से एक जटिल डेटा को पढ़ते समय विशेष पहुंच की आवश्यकता होती है, | इनपुट दिशा में, कई अलग-अलग इनपुट ऑपरेशंस के माध्यम से एक जटिल डेटा को पढ़ते समय विशेष पहुंच की आवश्यकता होती है, जिससे कि किसी अन्य प्रक्रिया को कुछ टुकड़ों का उपभोग करने से रोका जा सके, जिससे भ्रष्टाचार हो सकता है। | ||
भंडारण उपकरण स्मृति का एक रूप प्रदान करते हैं; महत्वपूर्ण वर्गों की अवधारणा समान रूप से प्रासंगिक है क्योंकि यह मुख्य मेमोरी में साझा डेटा संरचनाओं के लिए है। एक प्रक्रिया जो एक फाइल पर कई एक्सेस या अपडेट ऑपरेशंस करती है, एक महत्वपूर्ण सेक्शन को निष्पादित कर रही है जिसे उचित फाइल लॉकिंग तंत्र से संरक्षित किया जाना चाहिए। | भंडारण उपकरण स्मृति का एक रूप प्रदान करते हैं; महत्वपूर्ण वर्गों की अवधारणा समान रूप से प्रासंगिक है क्योंकि यह मुख्य मेमोरी में साझा डेटा संरचनाओं के लिए है। एक प्रक्रिया जो एक फाइल पर कई एक्सेस या अपडेट ऑपरेशंस करती है, एक महत्वपूर्ण सेक्शन को निष्पादित कर रही है जिसे उचित फाइल लॉकिंग तंत्र से संरक्षित किया जाना चाहिए। | ||
Line 77: | Line 77: | ||
* [[ईसेनबर्ग और मैकगायर एल्गोरिथम]] | * [[ईसेनबर्ग और मैकगायर एल्गोरिथम]] | ||
* [[लामपोर्ट का बेकरी एल्गोरिथम]] | * [[लामपोर्ट का बेकरी एल्गोरिथम]] | ||
* [[ताला (कंप्यूटर विज्ञान)]] | * [[ताला (कंप्यूटर विज्ञान)|अभिबंधन (कंप्यूटर विज्ञान)]] | ||
* [[आपसी बहिष्कार]] | * [[आपसी बहिष्कार]] | ||
* [[पीटरसन का एल्गोरिदम]] | * [[पीटरसन का एल्गोरिदम]] |
Revision as of 16:58, 31 May 2023
समवर्ती प्रोग्रामिंग में, साझा संसाधन तक समवर्ती रूप से अप्रत्याशित या गलत व्यवहार का कारण बन सकती है, इसलिए प्रोग्राम के कुछ अनुभाग जहां साझा संसाधनों तक पहुंच बनाई जाती है, उन्हें समवर्ती पहुंच से बचने के तरीकों से संरक्षित करने की आवश्यकता होती है। ऐसा करने का एक तरीका महत्वपूर्ण खंड या महत्वपूर्ण क्षेत्र के रूप में जाना जाता है। इस संरक्षित खंड में एक समय में एक से अधिक प्रक्रिया या क्रम द्वारा प्रवेश नहीं किया जा सकता है; साथ ही दूसरे खण्डों को तब तक के लिए निलंबित कर दिया जाता है जब तक कि पहला महत्वपूर्ण खंड नहीं छोड़ देता। विशिष्ट रूप से, महत्वपूर्ण खंड एक साझा संसाधन तक पहुँचता है, जैसे डेटा संरचना, एक परिधीय उपकरण, या एक नेटवर्क कनेक्शन, जो कई समवर्ती पहुँचों के संदर्भ में सही ढंग से कार्य नहीं करेगा।[1]
महत्वपूर्ण वर्गों की आवश्यकता
अलग-अलग कोड या प्रक्रियाओं में एक ही चर या अन्य संसाधन सम्मिलित हो सकते हैं जिन्हें पढ़ने या लिखने की आवश्यकता होती है लेकिन जिनके परिणाम उस क्रम पर निर्भर करते हैं जिसमें क्रियाएं होती हैं। उदाहरण के लिए, यदि एक चर x प्रक्रिया A द्वारा पढ़ा जाना है, और प्रक्रिया B को उसी चर x पर लिखना है तो उसी समय, प्रक्रिया A को या तो पुराना या नया मान x मिल सकता है .
प्रक्रिया A:
// Process A
.
.
b = x + 5; // instruction executes at time = Tx
.
प्रक्रिया B:
// Process B
.
.
x = 3 + z; // instruction executes at time = Tx
.
ऐसे प्रकरणों में जहां बेहतर कणिकामयता के साथ अभिबंधन (कंप्यूटर विज्ञान) तंत्र की जरूरत नहीं है, एक महत्वपूर्ण खंड महत्वपूर्ण है। उपरोक्त प्रकरण में, यदि A को अद्यतन मूल्य को पढ़ने की आवश्यकता है x, एक ही समय में प्रक्रिया A और प्रक्रिया B को क्रियान्वित करने से आवश्यक परिणाम नहीं मिल सकते हैं। इसे रोकने के लिए, चर x एक महत्वपूर्ण खंड द्वारा संरक्षित है। सबसे पहले, बी को अनुभाग तक पहुंच प्राप्त होती है। एक बार जब B मान लिखना समाप्त कर देता है, तो A को महत्वपूर्ण अनुभाग और चर तक पहुंच प्राप्त हो जाती है x पढ़ा जा सकता है।
महत्वपूर्ण खंड के अंदर और बाहर कौन से चर संशोधित किए गए हैं, इसे ध्यान से नियंत्रित करके, साझा चर के समवर्ती उपयोग को रोका जाता है। एक महत्वपूर्ण खंड का उपयोग सामान्यतः तब किया जाता है जब एक बहु-क्रमेड प्रोग्राम को एक अलग क्रम के बिना उस डेटा में परस्पर विरोधी परिवर्तन किए बिना कई संबंधित चर को अपडेट करना चाहिए। संबंधित स्थिति में, एक महत्वपूर्ण खंड का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि एक साझा संसाधन, उदाहरण के लिए, एक प्रिंटर, एक समय में केवल एक प्रक्रिया द्वारा ही पहुँचा जा सकता है।
महत्वपूर्ण वर्गों का कार्यान्वयन
विभिन्न ऑपरेटिंग सिस्टमों के बीच महत्वपूर्ण वर्गों का कार्यान्वयन भिन्न होता है।
एक महत्वपूर्ण खंड सामान्यतः परिमित समय में समाप्त हो जाएगा,[2] और एक क्रम, कार्य या प्रक्रिया को इसमें प्रवेश करने के लिए एक निश्चित समय तक प्रतीक्षा करनी होगी (पीटरसन का एल्गोरिथ्म # बाउंड वेटिंग)। महत्वपूर्ण वर्गों के अनन्य उपयोग को सुनिश्चित करने के लिए प्रोग्राम के प्रवेश और निकास पर कुछ तुल्यकालन तंत्र की आवश्यकता होती है।
क्रिटिकल सेक्शन एक प्रोग्राम का एक हिस्सा है जिसके लिए एक्सेस के पारस्परिक बहिष्कार की आवश्यकता होती है।
जैसा चित्र में दिखाया गया है,[3] पारस्परिक बहिष्करण (म्युटेक्स ) के प्रकरण में, एक क्रम लॉकिंग तकनीकों का उपयोग करके एक महत्वपूर्ण खंड को अवरुद्ध करता है जब इसे साझा संसाधन तक पहुंचने की आवश्यकता होती है, और अन्य धागे को अनुभाग में प्रवेश करने के लिए अपनी बारी प्राप्त करने के लिए इंतजार करना पड़ता है। यह विरोध को रोकता है जब दो या दो से अधिक धागे एक ही मेमोरी स्पेस साझा करते हैं और एक सामान्य संसाधन तक पहुंचना चाहते हैं।[2]
महत्वपूर्ण खंड के अंदर प्रोसेसर नियंत्रण के किसी भी परिवर्तन को रोकने के लिए सबसे सरल तरीका एक सेमाफोर लागू करना है। यूनिप्रोसेसर सिस्टम में, यह महत्वपूर्ण खंड में प्रवेश पर व्यवधान को अक्षम करके, सिस्टम कॉल से बचने के द्वारा किया जा सकता है जो अनुभाग के अंदर एक संदर्भ स्विच का कारण बन सकता है, और बाहर निकलने पर उनकी पिछली स्थिति में व्यवधान को बहाल कर सकता है। सिस्टम में कहीं भी किसी भी महत्वपूर्ण खंड में प्रवेश करने वाला निष्पादन का कोई भी क्रम, इस कार्यान्वयन के साथ, किसी भी अन्य क्रम को, एक रुकावट सहित, सीपीयू पर प्रसंस्करण समय दिए जाने से रोकेगा - और इसलिए किसी अन्य महत्वपूर्ण खंड या, वास्तव में, किसी भी कोड में प्रवेश करने से जो भी हो—जब तक कि मूल धागा अपने महत्वपूर्ण खंड को छोड़ न दे।
सेमाफोर (प्रोग्रामिंग) का उपयोग करके इस क्रूर-बल दृष्टिकोण में सुधार किया जा सकता है। एक महत्वपूर्ण खंड में प्रवेश करने के लिए, एक क्रम को एक सेमाफोर प्राप्त करना होगा, जिसे वह अनुभाग छोड़ने पर जारी करता है। अन्य क्रम्स को मूल क्रम के साथ ही क्रिटिकल सेक्शन में प्रवेश करने से रोका जाता है, लेकिन सीपीयू पर नियंत्रण हासिल करने और अन्य कोड को निष्पादित करने के लिए स्वतंत्र हैं, जिसमें अन्य महत्वपूर्ण सेक्शन सम्मिलित हैं जो विभिन्न सेमाफोर द्वारा संरक्षित हैं। सेमाफोर लॉकिंग में गतिरोध की स्थिति को रोकने के लिए एक समय सीमा भी होती है जिसमें एक ही प्रक्रिया द्वारा अनंत समय के लिए एक लॉक का अधिग्रहण किया जाता है, अन्य प्रक्रियाओं को रोकते हुए जिन्हें महत्वपूर्ण खंड द्वारा संरक्षित साझा संसाधन का उपयोग करने की आवश्यकता होती है।
महत्वपूर्ण वर्गों का उपयोग
कर्नेल-स्तर के महत्वपूर्ण खंड
सामान्यतः, महत्वपूर्ण खंड प्रोसेसर के बीच क्रम और प्रक्रिया प्रवास को रोकते हैं और बाधा डालना ्स और अन्य प्रक्रियाओं और क्रम्स द्वारा प्रक्रियाओं और क्रम्स के प्रीमेशन (कंप्यूटिंग) को रोकते हैं।
गंभीर खंड अधिकांशतः नेस्टिंग की अनुमति देते हैं। नेस्टिंग कई महत्वपूर्ण वर्गों को कम लागत पर प्रवेश करने और बाहर निकलने की अनुमति देता है।
यदि निर्धारण (कंप्यूटिंग) एक महत्वपूर्ण खंड में वर्तमान प्रक्रिया या क्रम को बाधित करता है, तो शेड्यूलर या तो वर्तमान में निष्पादित प्रक्रिया या क्रम को महत्वपूर्ण अनुभाग को पूरा करने के लिए चलने की अनुमति देगा, या यह किसी अन्य पूर्ण क्वांटम के लिए प्रक्रिया या क्रम को शेड्यूल करेगा। शेड्यूलर प्रक्रिया या क्रम को किसी अन्य प्रोसेसर में माइग्रेट नहीं करेगा, और यह किसी अन्य प्रक्रिया या क्रम को चलाने के लिए शेड्यूल नहीं करेगा, जबकि वर्तमान प्रक्रिया या क्रम एक महत्वपूर्ण खंड में है।
इसी तरह, यदि किसी महत्वपूर्ण खंड में कोई बाधा उत्पन्न होती है, तो भविष्य में प्रसंस्करण के लिए रुकावट की जानकारी दर्ज की जाती है, और निष्पादन को महत्वपूर्ण खंड में प्रक्रिया या क्रम पर लौटा दिया जाता है।[4] एक बार जब महत्वपूर्ण खंड बाहर निकल जाता है, और कुछ प्रकरणों में निर्धारित मात्रा पूरी हो जाती है, तो लंबित रुकावट को निष्पादित किया जाएगा। शेड्यूलिंग क्वांटम की अवधारणा राउंड-रॉबिन शेड्यूलिंग | राउंड-रॉबिन और इसी तरह के शेड्यूलिंग (कंप्यूटिंग) पर लागू होती है।
चूंकि महत्वपूर्ण खंड केवल उस प्रोसेसर पर निष्पादन (कंप्यूटर) कर सकते हैं जिस पर वे दर्ज किए गए हैं, निष्पादन प्रोसेसर के भीतर ही सिंक्रनाइज़ेशन की आवश्यकता होती है। यह महत्वपूर्ण वर्गों को लगभग शून्य लागत पर प्रवेश करने और बाहर निकलने की अनुमति देता है। कोई इंटर-प्रोसेसर तुल्यकालन की आवश्यकता नहीं है। केवल निर्देश धारा तुल्यकालन[5] ज़रूरी है। अधिकांश प्रोसेसर वर्तमान निष्पादन स्थिति को बाधित करने के सरल कार्य द्वारा आवश्यक मात्रा में सिंक्रनाइज़ेशन प्रदान करते हैं। यह अधिकांश प्रकरणों में महत्वपूर्ण अनुभागों को दर्ज किए गए महत्वपूर्ण अनुभागों की प्रति प्रोसेसर गणना से अधिक कुछ नहीं होने देता है।
प्रदर्शन संवर्द्धन में सभी महत्वपूर्ण वर्गों के बाहर निकलने पर लंबित व्यवधानों को निष्पादित करना और अनुसूचक को सभी महत्वपूर्ण वर्गों के बाहर निकलने की अनुमति देना सम्मिलित है। इसके अतिरिक्त, निष्पादन के लिए लंबित रुकावटों को अन्य प्रोसेसरों में स्थानांतरित किया जा सकता है।
क्रिटिकल सेक्शन को लंबे समय तक चलने वाले लॉकिंग आदिम के रूप में उपयोग नहीं किया जाना चाहिए। क्रिटिकल सेक्शन को काफी छोटा रखा जाना चाहिए जिससे कि इसे पर्सनल कंप्यूटर हार्डवेयर और शेड्यूलर से आने वाली किसी भी रुकावट के बिना प्रवेश, निष्पादित और बाहर किया जा सके।
कर्नेल-स्तर के महत्वपूर्ण खंड सॉफ्टवेयर अभिबंधनबंदी समस्या का आधार हैं।
वृक्ष (डेटा संरचना) में महत्वपूर्ण खंड == समानांतर प्रोग्रामिंग में, कोड को क्रम्स में विभाजित किया जाता है। पठन-लेखन विरोध | पठन-लेखन परस्पर विरोधी चर क्रम्स के बीच विभाजित होते हैं और प्रत्येक क्रम में उनकी एक प्रति होती है। डेटा स्ट्रक्चर जैसे लिंक्ड सूची, ट्री (डेटा स्ट्रक्चर), हैश तालिका आदि में डेटा वैरिएबल होते हैं जो लिंक होते हैं और क्रम्स के बीच विभाजित नहीं किए जा सकते हैं और इसलिए समानता को लागू करना बहुत मुश्किल है।[6] डेटा संरचनाओं को लागू करने की दक्षता में सुधार करने के लिए सम्मिलन, विलोपन, खोज जैसे कई कार्यों को समानांतर में निष्पादित करने की आवश्यकता है। इन कार्यों को करते समय, ऐसे परिदृश्य हो सकते हैं जहां एक ही तत्व को एक क्रम द्वारा खोजा जा रहा है और दूसरे द्वारा हटाया जा रहा है। ऐसे प्रकरणों में, आउटपुट त्रुटिपूर्ण प्रोग्राम हो सकता है। तत्व की खोज करने वाले क्रम में हिट हो सकती है, जबकि अन्य क्रम उस समय के बाद इसे हटा सकते हैं। ये परिदृश्य गलत डेटा प्रदान करके चल रहे प्रोग्राम में समस्याएँ उत्पन्न करेंगे। इसे रोकने के लिए, एक विधि यह है कि संपूर्ण डेटा-संरचना को महत्वपूर्ण खंड के अंतर्गत रखा जा सकता है जिससे कि एक समय में केवल एक ऑपरेशन को नियंत्रित किया जा सके। एक अन्य विधि महत्वपूर्ण खंड के अनुसार उपयोग में आने वाले नोड को लॉक कर रही है, जिससे कि अन्य ऑपरेशन उसी नोड का उपयोग न करें। महत्वपूर्ण खंड का उपयोग करना, इस प्रकार, यह सुनिश्चित करता है कि कोड अपेक्षित आउटपुट प्रदान करता है।[6]
बाह्य उपकरणों के संबंध में महत्वपूर्ण खंड
महत्वपूर्ण खंड कोड में भी होते हैं जो बाहरी बाह्य उपकरणों, जैसे कि I/O उपकरणों में हेरफेर करता है। एक परिधीय के रजिस्टरों को एक निश्चित क्रम में निश्चित मूल्यों के साथ क्रमादेशित किया जाना चाहिए; यदि दो या दो से अधिक प्रक्रियाएं एक उपकरण को एक साथ नियंत्रित करती हैं, तो गलत व्यवहार सुनिश्चित होगा: किसी भी प्रक्रिया में उपकरण उस स्थिति में नहीं होगा जिसकी उसे आवश्यकता है।
जब एक आउटपुट डिवाइस पर कई आउटपुट ऑपरेशन जारी करके सूचना की एक जटिल इकाई का उत्पादन किया जाना चाहिए, तो विशेष पहुंच की आवश्यकता होती है जिससे कि कोई अन्य प्रक्रिया आउटपुट के अपने बिट्स को इंटरलीविंग करके डेटम को दूषित न करे।
इनपुट दिशा में, कई अलग-अलग इनपुट ऑपरेशंस के माध्यम से एक जटिल डेटा को पढ़ते समय विशेष पहुंच की आवश्यकता होती है, जिससे कि किसी अन्य प्रक्रिया को कुछ टुकड़ों का उपभोग करने से रोका जा सके, जिससे भ्रष्टाचार हो सकता है।
भंडारण उपकरण स्मृति का एक रूप प्रदान करते हैं; महत्वपूर्ण वर्गों की अवधारणा समान रूप से प्रासंगिक है क्योंकि यह मुख्य मेमोरी में साझा डेटा संरचनाओं के लिए है। एक प्रक्रिया जो एक फाइल पर कई एक्सेस या अपडेट ऑपरेशंस करती है, एक महत्वपूर्ण सेक्शन को निष्पादित कर रही है जिसे उचित फाइल लॉकिंग तंत्र से संरक्षित किया जाना चाहिए।
यह भी देखें
- डेटाबेस लेनदेन
- डेकर का एल्गोरिदम
- ईसेनबर्ग और मैकगायर एल्गोरिथम
- लामपोर्ट का बेकरी एल्गोरिथम
- अभिबंधन (कंप्यूटर विज्ञान)
- आपसी बहिष्कार
- पीटरसन का एल्गोरिदम
- सिमांस्की का एल्गोरिथम
संदर्भ
- ↑ Raynal, Michel (2012). Concurrent Programming: Algorithms, Principles, and Foundations. Springer Science & Business Media. p. 9. ISBN 978-3642320279.
- ↑ 2.0 2.1 Jones, M. Tim (2008). GNU/Linux Application Programming (2nd ed.). [Hingham, Mass.] Charles River Media. p. 264. ISBN 978-1-58450-568-6.
- ↑ Chen, Stenstrom, Guancheng, Per (Nov 10–16, 2012). "Critical Lock Analysis: Diagnosing Critical Section Bottlenecks in Multithreaded Applications". High Performance Computing, Networking, Storage and Analysis (SC), 2012 International Conference: 1–11. doi:10.1109/sc.2012.40. ISBN 978-1-4673-0805-2. S2CID 12519578.
{{cite journal}}
: CS1 maint: multiple names: authors list (link) - ↑ "क्रिटिकल सेक्शन प्रॉब्लम के सॉफ्टवेयर सॉल्यूशन पर रिसर्च पेपर". International Journal of Advance Technology & Engineering Research (IJATER). 1. November 2011.
- ↑ Dubois, Scheurich, Michel, Christoph (1988). "मल्टीप्रोसेसरों में तुल्यकालन, जुटना और घटना क्रम". Survey and Tutorial Series. 21 (2): 9–21. doi:10.1109/2.15. S2CID 1749330.
{{cite journal}}
: CS1 maint: multiple names: authors list (link) - ↑ 6.0 6.1 Solihin, Yan (17 November 2015). पैरेलल मल्टीकोर आर्किटेक्चर के फंडामेंटल. ISBN 9781482211184.