2012-11-20 8 views
7

मैं पढ़ रहा हूँ < < लिनक्स कर्नेल विकास >> और म्युटेक्स के बीच मतभेद से उलझन में है और हो सेमाफोरक्यों एक म्यूटेक्स नीचे आधे में हासिल नहीं किया जा सकता है?

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

तो, क्यों एक म्यूटेक्स नीचे आधे में हासिल नहीं किया जा सकता है? सादगी और दक्षता यहां चिंतित है या कुछ और?

+1

प्रे बताई - नीचे आधा क्या है? –

उत्तर

2

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

सिद्धांत में आप संपूर्ण इंटरप्ट हैंडलिंग को लागू करने का निर्णय ले सकते हैं जिसमें उचित में म्यूटेक्स का उपयोग किया जाता है। "थ्रेडेड" इंटरप्ट हैंडलर की तरह। http://lwn.net/Articles/380931/

+0

इसलिए नियम लागू नहीं किए गए हैं लेकिन केवल सुझाव हैं? अर्थ में –

+0

सुझाव है कि अगर यह प्रयोग किया जाता है यह गतिरोध और दुर्घटनाओं को जन्म दे सकता। डिवाइस ड्राइवर बीएच में इसका इस्तेमाल करने से कोई भी आपको रोक नहीं सकता है। – Harman

3

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

दृश्य workqueues के इस बिंदु से नहीं माना बिहार रहे हैं, वे गिरी धागे जो सोने के लिए स्वतंत्र हैं के संदर्भ में चलाते हैं। तो कार्यस्थलों के लिए एक म्यूटेक्स ठीक है लेकिन टास्कलेट के लिए नहीं।

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

+0

वास्तव में मेरा मतलब नीचे नीचे हिस्सों है, बीएच नहीं –

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