2012-08-02 20 views
16

म्यूटेक्स के पीछे विचार केवल एक थ्रेड को स्मृति के किसी भी भाग तक पहुंचने की अनुमति देना है। यदि एक थ्रेड म्यूटेक्स को लॉक करता है, तो किसी भी अन्य लॉक प्रयास तब तक अवरुद्ध हो जाएंगे जब तक कि पहले अनलॉक न हो जाए। हालांकि, यह कैसे लागू किया जाता है? खुद को लॉक करने के लिए, म्यूटेक्स को थोड़ा सा सेट करना होगा जो कहता है कि यह बंद है। लेकिन क्या होगा यदि दूसरा म्यूटेक्स एक ही समय में पढ़ रहा है तो पहला लिख ​​रहा है। इससे भी बदतर, क्या होगा यदि वे दोनों एक ही समय में म्यूटेक्स को लॉक करते हैं? म्यूटेक्स उसी समस्या का सामना करेगा जो इसे रोकने के लिए है।म्यूटेक्स वास्तव में कैसे काम करते हैं?

म्यूटेक्स वास्तव में कैसे काम करते हैं?

उत्तर

10

निम्न स्तर परमाणु संचालन। ये अनिवार्य रूप से हार्डवेयर में लागू म्यूटेक्स हैं, सिवाय इसके कि आप केवल कुछ ही संचालन कर सकते हैं।

निम्नलिखित बराबर स्यूडोकोड पर विचार करें:

mutex global_mutex; 
void InterlockedAdd(int& dest, int value) { 
    scoped_lock lock(mutex); 
    dest += value; 
} 
int InterlockedRead(int& src) { 
    scoped_lock lock(mutex); 
    return src; 
} 
void InterlockedWrite(int& dest, int value) { 
    scoped_lock lock(mutex); 
    dest = value; 
} 

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

आप सटीक रूप से अनुमान लगा सकते हैं कि परमाणु संचालन म्यूटेक्स के संदर्भ में लागू किया जा सकता है, या इसके विपरीत। लेकिन आमतौर पर, परमाणु ओप हार्डवेयर द्वारा प्रदान किए जाते हैं, और उसके बाद म्यूटेक्स और अन्य सिंक्रनाइज़ेशन प्राइमेटिव ऑपरेटिंग सिस्टम द्वारा उनके ऊपर लागू होते हैं। ऐसा इसलिए है क्योंकि कुछ एल्गोरिदम हैं जिन्हें पूर्ण म्यूटेक्स की आवश्यकता नहीं होती है और जिसे "लॉकलेसली" के नाम से जाना जाता है, जिसका मतलब है कि कुछ अंतर-थ्रेड स्थिरता के लिए केवल परमाणु संचालन का उपयोग करना है।

9

अतीत में उपयोग किया गया एक सरल कार्यान्वयन एक सीपीयू स्तर परमाणु "ताला और विनिमय" निर्देश का उपयोग करना है। यह एक विशेष निर्देश है जो कुछ स्मृति स्थान में मूल्य के साथ परमाणु रूप से दिए गए मान को स्वैप करता है।

एक धागा स्मृति स्थान में 1 मान को स्वैप करने की कोशिश करके इस तरह के एक म्यूटेक्स प्राप्त कर सकता है। यदि मान 0 के रूप में वापस आता है, तो धागा मान लेगा कि इसमें म्यूटेक्स है और जारी रहेगा। अन्यथा, यदि लौटाया गया मान 1 है, तो थ्रेड को पता चलेगा कि कुछ अन्य धागे में वर्तमान में म्यूटेक्स है। उस स्थिति में यह फिर से प्रयास करने तक इंतजार करेगा।

उपरोक्त एक सरल प्रणाली में क्या हो सकता है इसकी एक अत्यधिक सरलीकृत रूपरेखा है। वास्तविक ऑपरेटिंग सिस्टम इन दिनों अधिक जटिल हैं।

+0

यह सवाल का जवाब नहीं देता है। क्या होगा यदि दो धागे एक ही समय में "पढ़ और स्वैप" करें। फिर दोनों वापस आते हैं 0. – user1146657

+1

@ user1146657: "लॉक एंड एक्सचेंज" ऑपरेशन का बिंदु यह है कि यह * परमाणु * है, और सीपीयू यह सुनिश्चित करता है कि किसी भी समय केवल एक धागा इसे कर सके। तो परिभाषा के अनुसार, दो धागे * एक ही समय में नहीं कर सकते हैं। सीपीयू विशेष रूप से इस उद्देश्य के लिए इस तरह से काम करने के लिए डिज़ाइन किया गया है। –

1

आपको बस इसे परमाणु रूप से करना है। यह हार्डवेयर द्वारा प्रदान किया जा सकता है, जैसे परमाणु तुलना-और-विनिमय निर्देश, या सिस्टम कॉल के माध्यम से ऑपरेटिंग सिस्टम द्वारा। एक बार यह ओएस डोमेन में हो जाने के बाद यह सुनिश्चित करना काफी आसान है कि केवल एक ही थ्रेड म्यूटेक्स को लॉक करने का प्रयास कर रहा है।

अभ्यास में दोनों दृष्टिकोण संयुक्त होते हैं। उदाहरण के लिए लिनक्स के futexes देखें।

2

यहाँ एक म्युटेक्स काम करने की जरूरत के एक त्वरित अवलोकन है, यह मेरा पूरा लेख How does a mutex work?

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