2013-02-26 48 views
11

जब एक म्यूटेक्स पहले ही टी 1 द्वारा लॉक हो जाता है, और टी 2 इसे लॉक करने का प्रयास करता है, तो टी 2 की प्रक्रिया क्या होती है?म्यूटेक्स कार्यान्वयन और सिग्नलिंग

मैं यह कुछ इस तरह चला जाता है लगता है:

-T2, लॉक करने के लिए कोशिश करता है विफल रहता है, हो सकता है थोड़ा spinlocks, तो उपज कॉल ...
-T2 निष्पादन समय के एक जोड़े के लिए निर्धारित है, पैदावार ...
-Eventually टी 1 बातें बताता है, टी 2 निष्पादन के लिए निर्धारित है और म्युटेक्स लॉक करने के लिए प्रबंधन करता है ...

करता T1 स्पष्ट अनुसूचक या अन्य धागे कि म्युटेक्स को यह संकेत दे अनलॉक करते लॉक करने के लिए कोशिश करता है विफल रहता है, अनलॉक है? या क्या यह अनलॉक करता है, और शेड्यूलर को अवरुद्ध धागे को शेड्यूल करने के लिए छोड़ देता है जब ऐसा करने के लिए उपयुक्त लगता है (उर्फ शेड्यूलर में अवरुद्ध धागे की कोई धारणा नहीं है और उन्हें विशेष रूप से नहीं माना जाता है)?

+1

'मुझे लगता है कि पारस्परिक बहिष्करण सिद्धांत गारंटी देता है कि कोई भी 2 या अधिक धागे एक ही समय में महत्वपूर्ण अनुभाग में प्रवेश नहीं करते हैं। अब, क्या आपके पास mutex को लॉक करने का प्रयास करने वाले धागे के लिए कतार है या आप एक म्यूटेक्स मुक्त होने तक बस व्यस्त रहें, यह इस बात पर निर्भर है कि आप इसे कैसे कार्यान्वित करते हैं और म्यूटेक्स के लिए आपकी क्या ज़रूरत है। उदाहरण के लिए, आरटीओएस में 'म्यूटेक्स' जैसे वीएक्सवर्क्स प्राथमिकता छत प्रोटोकॉल को लागू करते हैं, जिसे आपको सामान्य उद्देश्य ओएस (जीपीओएस) में आवश्यकता नहीं हो सकती है। – Raj

उत्तर

3

संक्षेप में: हाँ, शायद ...

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

लिनक्स में, कोड mutex_unlock() में प्रवेश करता है जो जांचता है कि क्या कोई प्रतीक्षा कार्य है (यह जांचकर कि लॉक-गिन शून्य से कम है या नहीं - यह अनलॉक के लिए 1 से शुरू होता है, एक लॉक-अनुरोध शून्य हो जाता है, लॉक करने का एक और प्रयास इसे नकारात्मक बना देगा)। यदि आगे की प्रतीक्षा प्रक्रिया है, तो यह "धीमा पथ अनलॉक" कहलाता है, जो कार्यान्वयन के विवरण की अनुमति देने के लिए दो पुनर्निर्देशन कार्यों के माध्यम से __mutex_unlock_common_slowpath में समाप्त होता है - कुछ पंक्तियां नीचे नीचे होती हैं, wake_up_process पर कॉल होता है जो अंततः समाप्त होता है try_to_wake_up में - जो अनिवार्य रूप से कार्य को "चलाने के लिए तैयार" के रूप में कतारबद्ध करता है, और फिर शेड्यूलर को कॉल करता है (कार्यों की कई परतों के माध्यम से!)

+0

ताकि आप यह कह रहे हों कि लिनक्स थ्रेड पर ब्लॉक को एक रनने योग्य नहीं चिह्नित किया गया है (इसलिए शेड्यूल इसे चलाने योग्य होने से पहले शेड्यूल नहीं करेगा) – NoSenseEtAl

+0

हां, यह सही है। यह मानता है कि आप कर्नेल म्यूटेक्स थो 'का उपयोग कर रहे हैं, जो कि हो सकता है, उदाहरण के लिए, pthread_mutex उपकरण। –

+0

बहुत अच्छा जवाब ... मुझे बिना परेशान किए btw ... क्या आप जल्दी से कह सकते हैं कि अगर कुछ महत्वपूर्ण तरीके से futex इससे अलग है। – NoSenseEtAl

6

यह आपके ऑपरेटिंग सिस्टम पर निर्भर करता है। मैंने सिर्फ कताई देखी है, yield के साथ कताई, कर्नेल में सामान्य प्रयोजन स्थिति चर, उपयोगकर्तालैंड नियंत्रित शेड्यूलिंग और कर्नेल समर्थन के साथ विशेष लॉकिंग प्राइमेटिव।

yield के साथ कताई और कताई भयानक प्रदर्शन है। सैद्धांतिक रूप से उपयोगकर्तालैंड नियंत्रित शेड्यूलिंग (Scheduler activations देखें) का सर्वोत्तम प्रदर्शन होना चाहिए, लेकिन जहां तक ​​मुझे पता है कि किसी ने कभी भी सभी मामलों में इसे ठीक से काम नहीं किया है। कर्नेल में सामान्य प्रयोजन की स्थिति चर और कर्नेल समर्थन के साथ विशेष लॉकिंग प्राइमेटिव्स को लिनक्स में futex के साथ बाद में सबसे अच्छा उदाहरण के रूप में कम या कम करना चाहिए।

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

+0

अच्छा ए, लेकिन "उपज के साथ कताई और कताई भयानक प्रदर्शन है" योग्य होना चाहिए ... मैं कम विवाद के परिदृश्य और लॉक के नीचे काम की कम मात्रा की कल्पना कर सकता हूं जहां स्पिनलॉक्स तेजी से होते हैं। – NoSenseEtAl

+1

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

+0

@ मैट्स मैं मल्टीकोर सिस्टम के बारे में सोच रहा था, लेकिन मैं आपके साथ एकल कोर के लिए सहमत हूं। – NoSenseEtAl

1

हम निम्नलिखित है कहो परिदृश्य:

1. T1 got M1. M1 locked. 
2. T2 tries to get M1 and gets blocked as M1 is locked. 
3. T3 tries to get M1 and gets blocked as M1 is locked. 
4. ...some time later... 
5. T1 unlocks M1.* 
6. T2 got M1. 
7. T3 is unblocked and tries to get M1 but is blocked again as T2 got M1 first. 

* प्रणाली अधिकार, अनलॉक, को सूचित करना चाहिए सभी अवरुद्ध कार्यों/प्रक्रियाओं/धागे जो म्युटेक्स के ताला कॉल पर ब्लॉक किए गए हैं । वे निष्पादित करने के लिए निर्धारित हैं। इसका मतलब यह नहीं है कि उन्हें निष्पादित किया गया है क्योंकि पहले से ही निष्पादन में कोई व्यक्ति हो सकता है। जैसा कि अन्य कहते हैं कि यह कार्यान्वयन पर निर्भर करता है कि यह कैसे किया जाता है। यदि आप वास्तव में यह अच्छी तरह से सीखना चाहते हैं तो मैं इस book