महत्वपूर्ण अनुभाग

From Vigyanwiki

समवर्ती प्रोग्रामिंग में, साझा संसाधन तक समवर्ती रूप से अप्रत्याशित या गलत व्यवहार का कारण बन सकती है, इसलिए प्रोग्राम के कुछ अनुभाग जहां साझा संसाधनों तक पहुंच बनाई जाती है, उन्हें समवर्ती पहुंच से बचने के तरीकों से संरक्षित करने की आवश्यकता होती है। ऐसा करने का एक तरीका महत्वपूर्ण भाग या महत्वपूर्ण क्षेत्र के रूप में जाना जाता है। इस संरक्षित भाग में एक समय में एक से अधिक प्रक्रिया या क्रम द्वारा प्रवेश नहीं किया जा सकता है; साथ ही दूसरे खण्डों को तब तक के लिए निलंबित कर दिया जाता है जब तक कि पहला महत्वपूर्ण भाग नहीं छोड़ देता। विशिष्ट रूप से, महत्वपूर्ण भाग एक साझा संसाधन तक पहुँचता है, जैसे डेटा संरचना, एक परिधीय उपकरण, या एक नेटवर्क कनेक्शन, जो कई समवर्ती पहुँचों के संदर्भ में सही ढंग से कार्य नहीं करेगा।[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 को अनुभाग तक पहुंच प्राप्त होती है। एक बार जब B मान लिखना समाप्त कर देता है, तो A को महत्वपूर्ण अनुभाग और चर तक पहुंच प्राप्त हो जाती है, तो इसे x द्वारा पढ़ा जा सकता है।

महत्वपूर्ण भाग के अंदर और बाहर कौन से चर संशोधित किए गए हैं, इसे ध्यान से नियंत्रित करके, साझा चर के समवर्ती उपयोग को रोका जाता है। एक महत्वपूर्ण भाग का उपयोग सामान्यतः तब किया जाता है जब एक मल्टी-थ्रेडेड प्रोग्राम को एक अलग क्रम के बिना उस डेटा में परस्पर विरोधी परिवर्तन किए बिना कई संबंधित चर को अपडेट करना चाहिए। संबंधित स्थिति में, एक महत्वपूर्ण भाग का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि एक साझा संसाधन, उदाहरण के लिए, एक प्रिंटर, एक समय में केवल एक प्रक्रिया द्वारा ही पहुँचा जा सकता है।

महत्वपूर्ण वर्गों का कार्यान्वयन

विभिन्न ऑपरेटिंग सिस्टमों के बीच महत्वपूर्ण वर्गों का कार्यान्वयन भिन्न होता है।

एक महत्वपूर्ण भाग सामान्यतः परिमित समय में समाप्त हो जाएगा,[2] और एक क्रम, कार्य या प्रक्रिया को इसमें प्रवेश करने के लिए एक निश्चित समय तक प्रतीक्षा करनी होगी (पीटरसन का एल्गोरिथ्म बाउंड वेटिंग)। महत्वपूर्ण वर्गों के अनन्य उपयोग को सुनिश्चित करने के लिए प्रोग्राम के प्रवेश और निकास पर कुछ तुल्यकालन तंत्र की आवश्यकता होती है। डेटा में परस्पर विरोधी परिवर्तन किए बिना कई संबंधित चर को अपडेट करना चाहिए।

क्रिटिकल सेक्शन एक प्रोग्राम का एक हिस्सा है जिसके लिए एक्सेस के पारस्परिक बहिष्कार की आवश्यकता होती है।

कई क्रम्स में लॉक और महत्वपूर्ण सेक्शन

जैसा चित्र में दिखाया गया है,[3] पारस्परिक बहिष्करण (म्युटेक्स ) के प्रकरण में, एक क्रमिक लॉकिंग तकनीकों का उपयोग करके एक महत्वपूर्ण भाग को अवरुद्ध करता है जब इसे साझा संसाधन तक पहुंचने की आवश्यकता होती है, और अन्य थ्रेड को अनुभाग में प्रवेश करने के लिए अपनी बारी प्राप्त करने के लिए इंतजार करना पड़ता है। यह विरोध को रोकता है, जब दो या दो से अधिक थ्रेड एक ही मेमोरी स्पेस साझा करते हैं और एक सामान्य संसाधन तक पहुंचना चाहते हैं। क्रिटिकल सेक्शन एक प्रोग्राम का एक हिस्सा है जिसके लिए एक्सेस के पारस्परिक बहिष्कार की आवश्यकता होती है।[2]

महत्वपूर्ण भाग को लागू करने के लिए स्यूडोकोड

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

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

महत्वपूर्ण वर्गों का उपयोग

कर्नेल-स्तर के महत्वपूर्ण भाग

सामान्यतः, महत्वपूर्ण भाग प्रोसेसर के बीच क्रम और प्रोसेस माइग्रेशन को रोकते हैं और बाधा डालना और अन्य प्रक्रियाओं और क्रम्स द्वारा प्रक्रियाओं और क्रम्स के प्रीमेशन (कंप्यूटिंग) को रोकते हैं।

गंभीर भाग अधिकांशतः नेस्टिंग की अनुमति देते हैं। नेस्टिंग कई महत्वपूर्ण वर्गों को कम लागत पर प्रवेश करने और बाहर निकलने की अनुमति देता है।

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

इसी तरह, यदि किसी महत्वपूर्ण भाग में कोई बाधा उत्पन्न होती है, तो भविष्य में प्रसंस्करण के लिए रुकावट की जानकारी दर्ज की जाती है, और निष्पादन को महत्वपूर्ण भाग में प्रक्रिया या क्रम पर लौटा दिया जाता है।[4] एक बार जब महत्वपूर्ण भाग बाहर निकल जाता है, और कुछ प्रकरणों में निर्धारित मात्रा पूरी हो जाती है, तो लंबित रुकावट को निष्पादित किया जाएगा। शेड्यूलिंग क्वांटम की अवधारणा राउंड-रॉबिन शेड्यूलिंग राउंड-रॉबिन और इसी तरह के शेड्यूलिंग (कंप्यूटिंग) पर लागू होती है।

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

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

क्रिटिकल सेक्शन को लंबे समय तक चलने वाले लॉकिंग आदिम के रूप में उपयोग नहीं किया जाना चाहिए। क्रिटिकल सेक्शन को काफी छोटा रखा जाना चाहिए जिससे कि इसे पर्सनल कंप्यूटर हार्डवेयर और शेड्यूलर से आने वाली किसी भी रुकावट के बिना प्रवेश, निष्पादित और बाहर किया जा सके।

कर्नेल-स्तर के महत्वपूर्ण भाग सॉफ्टवेयर अभिबंधनबंदी समस्या का आधार हैं।

वृक्ष (डेटा संरचना) में महत्वपूर्ण भाग

समानांतर प्रोग्रामिंग में, कोड को क्रम्स में विभाजित किया जाता है। पठन-लेखन विरोध पठन-लेखन परस्पर विरोधी चर क्रम्स के बीच विभाजित होते हैं और प्रत्येक क्रम में उनकी एक प्रति होती है। डेटा स्ट्रक्चर जैसे लिंक्ड सूची, ट्री (डेटा स्ट्रक्चर), हैश तालिका आदि में डेटा वैरिएबल होते हैं जो लिंक होते हैं और क्रम्स के बीच विभाजित नहीं किए जा सकते हैं और इसलिए समानता को लागू करना बहुत मुश्किल है।[6] डेटा संरचनाओं को लागू करने की दक्षता में सुधार करने के लिए सम्मिलन, विलोपन, खोज जैसे कई कार्यों को समानांतर में निष्पादित करने की आवश्यकता है। इन कार्यों को करते समय, ऐसे परिदृश्य हो सकते हैं जहां एक ही तत्व को एक क्रम द्वारा खोजा जा रहा है और दूसरे द्वारा हटाया जा रहा है। ऐसे प्रकरणों में, आउटपुट त्रुटिपूर्ण प्रोग्राम हो सकता है। यह अधिकांश प्रकरणों में महत्वपूर्ण अनुभागों को दर्ज किए गए महत्वपूर्ण अनुभागों की प्रति प्रोसेसर गणना से अधिक कुछ नहीं होने देता है। तत्व की खोज करने वाले क्रम में हिट हो सकती है, जबकि अन्य क्रम उस समय के बाद इसे हटा सकते हैं। ये परिदृश्य गलत डेटा प्रदान करके चल रहे प्रोग्राम में समस्याएँ उत्पन्न करेंगे। इसे रोकने के लिए, एक विधि यह है कि संपूर्ण डेटा-संरचना को महत्वपूर्ण भाग के अंतर्गत रखा जा सकता है जिससे कि एक समय में केवल एक ऑपरेशन को नियंत्रित किया जा सके। एक अन्य विधि महत्वपूर्ण भाग के अनुसार उपयोग में आने वाले नोड को लॉक कर रही है, जिससे कि अन्य ऑपरेशन उसी नोड का उपयोग न करें। महत्वपूर्ण भाग का उपयोग करना, इस प्रकार, यह सुनिश्चित करता है कि कोड अपेक्षित आउटपुट प्रदान करता है।[6]


बाह्य उपकरणों के संबंध में महत्वपूर्ण भाग

महत्वपूर्ण भाग कोड में भी होते हैं जो बाहरी बाह्य उपकरणों, जैसे कि I/O उपकरणों में हेरफेर करता है। एक परिधीय के रजिस्टरों को एक निश्चित क्रम में निश्चित मूल्यों के साथ क्रमादेशित किया जाना चाहिए; यदि दो या दो से अधिक प्रक्रियाएं एक उपकरण को एक साथ नियंत्रित करती हैं, तो गलत व्यवहार सुनिश्चित होगा: किसी भी प्रक्रिया में उपकरण उस स्थिति में नहीं होगा जिसकी उसे आवश्यकता है।

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

इनपुट दिशा में, कई अलग-अलग इनपुट ऑपरेशंस के माध्यम से एक जटिल डेटा को पढ़ते समय विशेष पहुंच की आवश्यकता होती है, जिससे कि किसी अन्य प्रक्रिया को कुछ टुकड़ों का उपभोग करने से रोका जा सके, जिससे भ्रष्टाचार हो सकता है।

भंडारण उपकरण स्मृति का एक रूप प्रदान करते हैं; महत्वपूर्ण वर्गों की अवधारणा समान रूप से प्रासंगिक है क्योंकि यह मुख्य मेमोरी में साझा डेटा संरचनाओं के लिए है। एक प्रक्रिया जो एक फाइल पर कई एक्सेस या अपडेट ऑपरेशंस करती है, एक महत्वपूर्ण सेक्शन को निष्पादित कर रही है जिसे उचित फाइल लॉकिंग तंत्र से संरक्षित किया जाना चाहिए।

यह भी देखें







संदर्भ

  1. Raynal, Michel (2012). Concurrent Programming: Algorithms, Principles, and Foundations. Springer Science & Business Media. p. 9. ISBN 978-3642320279.
  2. 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.
  3. 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)
  4. "क्रिटिकल सेक्शन प्रॉब्लम के सॉफ्टवेयर सॉल्यूशन पर रिसर्च पेपर". International Journal of Advance Technology & Engineering Research (IJATER). 1. November 2011.
  5. 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. 6.0 6.1 Solihin, Yan (17 November 2015). पैरेलल मल्टीकोर आर्किटेक्चर के फंडामेंटल. ISBN 9781482211184.


बाहरी संबंध