2012-03-26 42 views
6

आप इस लिंक पर एक दिलचस्प टेबल देख सकते हैं। http://norvig.com/21-days.html#answers'म्यूटेक्स लॉक' वास्तव में क्या करता है?

तालिका में वर्णित है,
Mutex लॉक/अनलॉक25 nanosec
मुख्य स्मृति100 nanosec

Nanosec से ला नहीं?
मुझे आश्चर्य हुआ क्योंकि mutex lockfetch data from memory से तेज़ है। यदि हां, तो mutex lock वास्तव में क्या करें? और Mutex lock तालिका में क्या मतलब है?

+0

मुझे आपके आश्चर्य को समझ में नहीं आता है। म्यूटेक्स लॉक डेटा "परिवर्तन" (लिखना) पर पूर्ववर्ती है जबकि fetch का मतलब है "पढ़ें"। जब कोई भी म्यूटेक्स प्राप्त नहीं करता है तो यह कुछ भी नहीं करता है (तब होता है जब "पढ़ने" के संचालन किए जाते हैं)। क्या मुझे कुछ याद आती है? – alfasin

उत्तर

1

आपके द्वारा लिंक किए गए आलेख में आर्किटेक्चर का उल्लेख नहीं किया गया है, लेकिन एल 1 और एल 2 कैश के उल्लेख से यह इंटेल है। यदि ऐसा है, तो मुझे लगता है कि म्यूटेक्स द्वारा उनका मतलब LOCK निर्देश था। इस संबंध में यह पोस्ट प्रासंगिक प्रतीत होता है: Intel 64 and IA-32 | Atomic operations including acquire/release semantic

Intel software developer's manual यदि आप जानते हैं कि आप क्या देख रहे हैं, तो मदद कर सकते हैं। मैं लॉक निर्देश के बारे में कुछ भी प्रासंगिक पढ़ सकता हूं।

+0

हम्म, इसका मतलब सिर्फ LOCK निर्देश है? फिर, यह एक समझ (25 नैनोसेक) बनाता है। हालांकि, मुझे आश्चर्य हुआ कि उसने 'म्यूटेक्स लॉक' शब्द का उपयोग क्यों किया। 'म्यूटेक्स लॉकिंग' को 'LOCK' निर्देश द्वारा कार्यान्वित किया गया है? – Benjamin

+0

मुझे लगता है कि म्यूटेक्स 'म्यूचुअल एक्सक्लूस' का एक संक्षिप्त शब्द है। तो, LOCK निर्देश को म्यूटेक्स के रूप में माना जा सकता है। –

12

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

अब हमें एक समस्या है: क्या होगा यदि दो लोगों को अगली वाक्य के बारे में सोचने के लिए क्या किया जाता है, और दोनों कलम का उपयोग करना चाहते हैं? हम केवल इतना कह सकते हैं कि दोनों लोग कलम पकड़ सकते हैं, लेकिन यह एक नाजुक पुरानी कलम है, इसलिए यदि दो लोग इसे पकड़ लेते हैं तो यह टूट जाता है। इसके बजाय, हम पेन के चारों ओर एक चाक लाइन खींचते हैं। सबसे पहले आप अपना हाथ चाक लाइन, पर रखें आप कलम पकड़ लेते हैं। यदि एक व्यक्ति का हाथ चाक लाइन के अंदर है, तो किसी और को चाक लाइन के अंदर अपना हाथ लगाने की अनुमति नहीं है। यदि दो लोग एक ही समय में चाक लाइन में अपना हाथ डालने का प्रयास करते हैं, तो इन नियमों के तहत उनमें से केवल एक ही चाक लाइन के अंदर आ जाएगा, इसलिए दूसरे को अपना हाथ वापस खींचना होगा और इसे चाक लाइन के बाहर रखना होगा कलम फिर से उपलब्ध है।

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

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

+1

वास्तव में अच्छा उदाहरण दिया गया। (वाई) – Tirth

संबंधित मुद्दे