महत्वपूर्ण अनुभाग
समवर्ती प्रोग्रामिंग में, साझा संसाधन तक समवर्ती पहुंच अप्रत्याशित या गलत व्यवहार का कारण बन सकती है, इसलिए कार्यक्रम के कुछ हिस्से जहां साझा संसाधनों तक पहुंच बनाई जाती है, उन्हें समवर्ती पहुंच से बचने के तरीकों से संरक्षित करने की आवश्यकता होती है। ऐसा करने का एक तरीका एक महत्वपूर्ण खंड या महत्वपूर्ण क्षेत्र के रूप में जाना जाता है। इस संरक्षित खंड में एक समय में एक से अधिक प्रक्रिया या थ्रेड द्वारा प्रवेश नहीं किया जा सकता है; दूसरों को तब तक के लिए निलंबित कर दिया जाता है जब तक कि पहला महत्वपूर्ण खंड नहीं छोड़ देता। विशिष्ट रूप से, महत्वपूर्ण खंड एक साझा संसाधन तक पहुँचता है, जैसे डेटा संरचना, एक परिधीय उपकरण, या एक नेटवर्क कनेक्शन, जो कई समवर्ती पहुँचों के संदर्भ में सही ढंग से काम नहीं करेगा।[1]
महत्वपूर्ण वर्गों की आवश्यकता
अलग-अलग कोड या प्रक्रियाओं में एक ही चर या अन्य संसाधन शामिल हो सकते हैं जिन्हें पढ़ने या लिखने की आवश्यकता होती है लेकिन जिनके परिणाम उस क्रम पर निर्भर करते हैं जिसमें क्रियाएं होती हैं। उदाहरण के लिए, यदि एक चर x प्रक्रिया ए द्वारा पढ़ा जाना है, और प्रक्रिया बी को उसी चर पर लिखना है x उसी समय, प्रक्रिया A को या तो पुराना या नया मान मिल सकता है x.
प्रक्रिया ए:
// Process A
.
.
b = x + 5; // instruction executes at time = Tx
.
प्रक्रिया बी:
// 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.