मान लीजिए कि दस लोगों को कलम साझा करना पड़ा (शायद वे वास्तव में नकदी से भरे हुए कंपनी पर काम करते हैं)। चूंकि उन्हें कलम के साथ लंबे दस्तावेज लिखना है, लेकिन दस्तावेज़ लिखने में अधिकांश काम सिर्फ यह कहना है कि वे क्या कहें, वे सहमत हैं कि प्रत्येक व्यक्ति को दस्तावेज़ की एक वाक्य लिखने के लिए कलम का उपयोग करना पड़ता है, और उसके बाद उसे इसे समूह के बाकी हिस्सों में उपलब्ध कराएं।
अब हमें एक समस्या है: क्या होगा यदि दो लोगों को अगली वाक्य के बारे में सोचने के लिए क्या किया जाता है, और दोनों कलम का उपयोग करना चाहते हैं? हम केवल इतना कह सकते हैं कि दोनों लोग कलम पकड़ सकते हैं, लेकिन यह एक नाजुक पुरानी कलम है, इसलिए यदि दो लोग इसे पकड़ लेते हैं तो यह टूट जाता है। इसके बजाय, हम पेन के चारों ओर एक चाक लाइन खींचते हैं। सबसे पहले आप अपना हाथ चाक लाइन, पर रखें आप कलम पकड़ लेते हैं। यदि एक व्यक्ति का हाथ चाक लाइन के अंदर है, तो किसी और को चाक लाइन के अंदर अपना हाथ लगाने की अनुमति नहीं है। यदि दो लोग एक ही समय में चाक लाइन में अपना हाथ डालने का प्रयास करते हैं, तो इन नियमों के तहत उनमें से केवल एक ही चाक लाइन के अंदर आ जाएगा, इसलिए दूसरे को अपना हाथ वापस खींचना होगा और इसे चाक लाइन के बाहर रखना होगा कलम फिर से उपलब्ध है।
चलिए इसे वापस म्यूटेक्स से जोड़ते हैं। एक म्यूटेक्स महत्वपूर्ण अनुभाग (दस्तावेज़ की एक वाक्य लिखने का समय) नामक छोटी अवधि के लिए साझा संसाधन (पेन) की रक्षा करने का एक तरीका है। जब भी आप संसाधन का उपयोग करना चाहते हैं, तो आप पहले mutex_lock
पर कॉल करने के लिए सहमत हैं (अपना हाथ चाक लाइन के अंदर रखें)। जब भी आप संसाधन के साथ काम करते हैं, तो आप mutex_unlock
पर कॉल करने के लिए सहमत हैं (चाक लाइन क्षेत्र से अपना हाथ निकालें)।
अब म्यूटेक्स कैसे कार्यान्वित किए जाते हैं। एक म्यूटेक्स आमतौर पर साझा स्मृति के साथ लागू किया जाता है। म्यूटेक्स नामक कुछ साझा अपारदर्शी डेटा ऑब्जेक्ट है, और mutex_lock
और mutex_unlock
फ़ंक्शंस दोनों इनमें से किसी एक को पॉइंटर लेते हैं। mutex_lock
कार्य परमाणु परीक्षण-और-सेट या लोड-लिंक्ड/स्टोर-सशर्त निर्देश अनुक्रम (x86, xhcg
पर अक्सर उपयोग किया जाता है) का उपयोग करके म्यूटेक्स के अंदर डेटा को संशोधित करता है और संशोधित करता है, और या तो "म्यूटेक्स प्राप्त करता है" - की सामग्री सेट करता है mutex ऑब्जेक्ट को अन्य थ्रेड को इंगित करने के लिए जो महत्वपूर्ण खंड लॉक है - या प्रतीक्षा करनी है। आखिरकार, थ्रेड म्यूटेक्स हो जाता है, महत्वपूर्ण अनुभाग के अंदर काम करता है, और mutex_unlock
पर कॉल करता है। यह फ़ंक्शन म्यूटेक्स के अंदर डेटा को उपलब्ध कराने के लिए सेट करता है, और संभावित रूप से म्यूटक्स प्राप्त करने की कोशिश कर रहे सोने वाले धागे को जागता है (यह म्यूटेक्स कार्यान्वयन पर निर्भर करता है - mutex_lock
के कुछ कार्यान्वयन xchg
पर तंग देखो में बस स्पिन करें म्यूटेक्स उपलब्ध है, इसलिए किसी को सूचित करने के लिए mutex_unlock
की आवश्यकता नहीं है)।
मेमेट को लॉक करने से स्मृति में जाने से तेज क्यों होगा? संक्षेप में, कैशिंग। सीपीयू में एक कैश होता है जिसे बहुत तेज़ी से एक्सेस किया जा सकता है, इसलिए xchg
ऑपरेशन को स्मृति तक बाहर जाने की आवश्यकता नहीं है जब तक कि प्रोसेसर यह सुनिश्चित कर सके कि उस डेटा तक पहुंचने वाला कोई अन्य प्रोसेसर नहीं है।लेकिन x86 में एक कैश लाइन "स्वामित्व" की धारणा है - यदि प्रोसेसर 0 कैश लाइन का मालिक है, तो उस कैश लाइन में डेटा का उपयोग करना चाहते हैं, कोई अन्य प्रोसेसर प्रोसेसर 0 के माध्यम से जाना है। इस तरह, xhcg
की कोई आवश्यकता नहीं है कैश से परे किसी भी डेटा को देखने के लिए ऑपरेशन, और कैश एक्सेस बहुत तेजी से होता है, इसलिए एक अनचाहे म्यूटेक्स प्राप्त करना स्मृति पहुंच से तेज़ है।
उस अंतिम पैराग्राफ में एक चेतावनी है, हालांकि: गति लाभ केवल अनचाहे म्यूटेक्स लॉक के लिए है। यदि दो धागे एक ही समय में एक ही म्यूटेक्स को लॉक करने का प्रयास करते हैं, तो उन थ्रेडों को चलाने वाले प्रोसेसर को संबंधित कैश लाइन के स्वामित्व के साथ संवाद करना और सौदा करना है, जो म्यूटेक्स अधिग्रहण को बहुत धीमा कर देता है। इसके अलावा, दो धागे में से एक को अन्य थ्रेड के लिए महत्वपूर्ण खंड में कोड निष्पादित करने के लिए इंतजार करना होगा और फिर म्यूटेक्स को छोड़ना होगा, जिससे थ्रेडों में से एक के लिए म्यूटेक्स अधिग्रहण धीमा हो जाएगा।
मुझे आपके आश्चर्य को समझ में नहीं आता है। म्यूटेक्स लॉक डेटा "परिवर्तन" (लिखना) पर पूर्ववर्ती है जबकि fetch का मतलब है "पढ़ें"। जब कोई भी म्यूटेक्स प्राप्त नहीं करता है तो यह कुछ भी नहीं करता है (तब होता है जब "पढ़ने" के संचालन किए जाते हैं)। क्या मुझे कुछ याद आती है? – alfasin