रीएंट्रेंट म्यूटेक्स

From Vigyanwiki
Revision as of 11:42, 26 May 2023 by alpha>Indicwiki (Created page with "{{Multiple issues| {{technical|date=December 2011}} {{howto|date=August 2021}} {{originalresearch|date=August 2021}} }} {{Use dmy dates|date=February 2021}} कंप्य...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

कंप्यूटर विज्ञान में, रीएन्ट्रेंट म्यूटेक्स (रिकर्सिव म्यूटेक्स, रिकर्सिव लॉक) एक विशेष प्रकार का पारस्परिक बहिष्करण (म्यूटेक्स) डिवाइस है जिसे एक ही थ्रेड (कंप्यूटिंग) | प्रक्रिया/थ्रेड द्वारा कई बार लॉक किया जा सकता है, बिना गतिरोध के।

जबकि एक सामान्य म्यूटेक्स (लॉक) पर लॉक ऑपरेशन करने का कोई भी प्रयास या तो विफल हो जाएगा या जब म्यूटेक्स पहले से ही लॉक हो जाएगा, तो एक पुनरावर्ती म्यूटेक्स पर यह ऑपरेशन तभी सफल होगा जब लॉकिंग थ्रेड वह है जो पहले से ही लॉक रखता है। . आमतौर पर, एक पुनरावर्ती म्यूटेक्स इसे लॉक किए जाने की संख्या को ट्रैक करता है, और अन्य थ्रेड्स को लॉक करने से पहले समान रूप से कई अनलॉक ऑपरेशन करने की आवश्यकता होती है।

प्रेरणा

पुनरावर्ती म्युटेक्स रीएंट्रेंसी (कंप्यूटिंग) की समस्या को हल करते हैं | नियमित म्यूटेक्स के साथ गैर-पुनः प्रवेश: यदि कोई फ़ंक्शन जो लॉक लेता है और कॉलबैक निष्पादित करता है, कॉलबैक द्वारा ही कॉल किया जाता है, डेडलॉक लागू होता है।[1] स्यूडोकोड में, वह निम्न स्थिति है:

var m : Mutex // एक गैर-पुनरावर्ती म्यूटेक्स, प्रारंभ में अनलॉक किया गया।

फ़ंक्शन लॉक_एंड_कॉल (i: पूर्णांक)
    एम.लॉक ()
    कॉलबैक (मैं)
    एम.अनलॉक ()

फ़ंक्शन कॉलबैक (i: पूर्णांक)
    अगर मैं > 0
        लॉक_एंड_कॉल (मैं - 1)

Lock_and_call (1) // फ़ंक्शन को आमंत्रित करना

इन परिभाषाओं को देखते हुए, फ़ंक्शन कॉल lock_and_call(1) घटनाओं के निम्नलिखित अनुक्रम का कारण होगा:

  • m.lock() — म्युटेक्स लॉक
  • callback(1)
  • lock_and_call(0) - क्योंकि i > 0
  • m.lock() — गतिरोध, क्योंकि m पहले से ही लॉक है, इसलिए निष्पादन थ्रेड अवरुद्ध हो जाएगा, स्वयं के लिए प्रतीक्षा कर रहा है।

म्यूटेक्स को एक पुनरावर्ती के साथ बदलने से समस्या हल हो जाती है, क्योंकि final m.lock() बिना ब्लॉक किए सफल हो जाएगा।

व्यावहारिक उपयोग

डब्ल्यू. रिचर्ड स्टीवंस नोट करते हैं कि पुनरावर्ती ताले सही ढंग से उपयोग करने के लिए मुश्किल हैं, और अप्लिकेशन प्रोग्रामिंग अंतरफलक को बदले बिना एकल-थ्रेडेड कोड को अपनाने के लिए उनके उपयोग की अनुशंसा करते हैं, लेकिन केवल तभी जब कोई अन्य समाधान संभव न हो।[2] जावा (प्रोग्रामिंग भाषा) लैंग्वेज का नेटिव सिंक्रोनाइज़ेशन मैकेनिज्म, मॉनिटर (सिंक्रनाइज़ेशन), रिकर्सिव लॉक्स का उपयोग करता है। सिंटैक्टिक रूप से, लॉक 'सिंक्रोनाइज़्ड' कीवर्ड के साथ कोड का एक ब्लॉक होता है और कोष्ठक में कोई ऑब्जेक्ट (कंप्यूटर विज्ञान) संदर्भ होता है जिसे म्यूटेक्स के रूप में उपयोग किया जाएगा। सिंक्रोनाइज़्ड ब्लॉक के अंदर, दिए गए ऑब्जेक्ट को उस पर प्रतीक्षा (), नोटिफ़िकेशन (), या नोटिफिकेशन () करके एक कंडीशन वैरिएबल के रूप में इस्तेमाल किया जा सकता है। इस प्रकार सभी वस्तुएँ पुनरावर्ती म्यूटेक्स और स्थिति चर दोनों हैं।[3]


उदाहरण

  1. थ्रेड A फ़ंक्शन F को कॉल करता है जो आगे बढ़ने से पहले अपने लिए एक रीएन्ट्रेंट लॉक प्राप्त करता है
  2. थ्रेड बी फ़ंक्शन एफ को कॉल करता है जो खुद के लिए एक रेंट्रेंट लॉक प्राप्त करने का प्रयास करता है लेकिन पहले से बकाया होने के कारण नहीं हो सकता है, जिसके परिणामस्वरूप ब्लॉक (यह प्रतीक्षा करता है), या अनुरोध किए जाने पर टाइमआउट होता है
  3. थ्रेड A का F स्वयं को पुनरावर्ती रूप से कॉल करता है। यह पहले से ही लॉक का मालिक है, इसलिए यह खुद को ब्लॉक नहीं करेगा (कोई डेडलॉक नहीं)। यह रीएन्ट्रेंट म्यूटेक्स का केंद्रीय विचार है, और यही इसे नियमित लॉक से अलग बनाता है।
  4. थ्रेड बी का एफ अभी भी इंतजार कर रहा है, या टाइमआउट पकड़ा है और इसके आसपास काम किया है
  5. थ्रेड A का F खत्म हो जाता है और इसके लॉक को रिलीज़ कर देता है
  6. थ्रेड बी का एफ अब एक रीएन्ट्रेंट लॉक प्राप्त कर सकता है और आगे बढ़ सकता है यदि यह अभी भी प्रतीक्षा कर रहा था

सॉफ्टवेयर अनुकरण

सॉफ्टवेयर अनुकरण पूरा किया जा सकता है[clarification needed]निम्नलिखित संरचना का उपयोग:[citation needed]

  • एक नियमित लॉक का उपयोग कर एक नियंत्रण स्थिति चर
  • स्वामी पहचानकर्ता, प्रत्येक थ्रेड के लिए अद्वितीय (खाली / सेट नहीं करने के लिए डिफ़ॉल्ट)
  • अधिग्रहण संख्या (डिफ़ॉल्ट रूप से शून्य)

अधिग्रहण

  1. नियंत्रण स्थिति प्राप्त करें।
  2. यदि मालिक सेट है और वर्तमान थ्रेड नहीं है, तो नियंत्रण स्थिति के अधिसूचित होने की प्रतीक्षा करें (यह स्थिति भी जारी करता है)।
  3. स्वामी को वर्तमान थ्रेड पर सेट करें। जब तक अधिग्रहणकर्ता पहले से ही स्वामी नहीं है, तब तक स्वामी पहचानकर्ता को इस बिंदु पर पहले ही साफ़ कर दिया जाना चाहिए था।
  4. अधिग्रहण संख्या बढ़ाएँ (नए मालिकों के लिए हमेशा 1 में परिणाम होना चाहिए)।
  5. नियंत्रण की स्थिति जारी करें।

रिलीज

  1. नियंत्रण की स्थिति प्राप्त करें, यह दावा करते हुए कि मालिक रिलीजर है।
  2. अधिग्रहण संख्या घटाएं, यह दावा करते हुए कि संख्या शून्य से अधिक या उसके बराबर है।
  3. यदि अधिग्रहण की संख्या शून्य है, तो स्वामी की जानकारी को साफ़ करें और नियंत्रण स्थिति को सूचित करें।
  4. नियंत्रण की स्थिति जारी करें।

संदर्भ

  1. Buschmann, Frank; Henney, Kevlin; Schmidt, Douglas C. (2007). पैटर्न-उन्मुख सॉफ़्टवेयर आर्किटेक्चर, वितरित कंप्यूटिंग के लिए एक पैटर्न भाषा. John Wiley & Sons. p. 374. ISBN 9780470065303.
  2. Stevens, W. Richard; Rago, Stephen A. (2013). UNIX पर्यावरण में उन्नत प्रोग्रामिंग. Addison-Wesley. p. 434.
  3. David Hovemeyer. "Lecture 17: Java Threads, Synchronization". CS 365 - Parallel and Distributed Computing. Retrieved 4 June 2015. {{cite book}}: |work= ignored (help)