अधिकांश म्यूटेक्स कार्यान्वयन अनुचित क्यों हैं?


11

मेरी समझ यह है कि एक म्यूटेक्स का सबसे लोकप्रिय कार्यान्वयन (उदाहरण के लिए सी ++ में म्यूटेक्स) निष्पक्षता की गारंटी नहीं देता है - अर्थात, वे इस बात की गारंटी नहीं देते हैं कि विवाद के मामलों में, लॉक को उसी क्रम में थ्रेड द्वारा अधिग्रहित किया जाएगा कि वे लॉक () कहा जाता है। वास्तव में, यह संभव है (हालांकि उम्मीद के मुताबिक असामान्य) कि उच्च विवाद के मामलों में, म्यूटेक्स के अधिग्रहण के लिए इंतजार कर रहे कुछ धागे कभी भी इसे हासिल नहीं कर सकते हैं।

यह मेरे लिए एक अनैतिक व्यवहार की तरह लगता है - यह मुझे लगता है कि एक निष्पक्ष म्यूटेक्स एक प्रोग्रामर को क्या उम्मीद / उम्मीद के साथ व्यवहार में अधिक उपज देगा।

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

क्या म्यूटेक्स-कार्यान्वयन अंतर्दृष्टि मैं यहां याद कर रहा हूं, जो यह बताएगा कि बेहतर प्रदर्शन के लिए निष्पक्षता का त्याग करना क्यों सार्थक माना गया?


1
हर म्यूटेक्स के लिए लिंक की गई सूची को साझा डेटा संरचना होना चाहिए, है ना? तो, आप प्रदर्शन को कम किए बिना उस पर डेटा दौड़ को कैसे रोकने जा रहे हैं?
user3543290

लॉकलेस लिंक-लिस्ट तंत्र का उपयोग करना, मुझे लगता है। जागने के लिए अगला धागा खोजने के लिए एक अनुचित म्यूटेक्स क्या डेटा संरचना का उपयोग करता है?
जेरेमी फ्रेज़र

1
आपको वह देखना होगा, लेकिन क्या लॉकलेस लिंक की गई सूची निष्पक्षता की गारंटी देती है? मुझे लगता है कि आपको पता चलेगा कि समवर्ती प्रोग्रामिंग में निष्पक्षता की गारंटी देना मुश्किल है।
2335 पर user3543290

जवाबों:


7

जिम सॉयर का जवाब एक उत्तर की ओर इशारा करता है: जब आपके पास अलग-अलग प्राथमिकताओं के साथ धागे होते हैं, तो "उचित" व्यवहार गलत होगा। जब आपके पास कई थ्रेड होते हैं जो चल सकते हैं, तो सर्वोच्च प्राथमिकता वाला धागा आम तौर पर एक होना चाहिए जो चलना चाहिए।

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

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

कई ऑपरेटिंग सिस्टम सेवाएं जैसे कि एसिंक्रोनस I / O को अक्सर इस सुविधा के शीर्ष पर लागू किया जाता है।

एक अन्य उदाहरण है यदि यह प्रक्रिया डिबगर के नियंत्रण में है। उस स्थिति में, डिबगिंग सिस्टम विभिन्न कारणों से उपयोगकर्ता कार्य के रूप में कोड निष्पादित कर सकता है।


4

'प्राथमिकता उलटा' एक कारण है कि निष्पक्षता अवांछनीय हो सकती है। एक कम प्राथमिकता वाली प्रक्रिया लॉक म्यूटेक्स को हिट करती है और सो जाती है। फिर एक उच्च प्राथमिकता प्रक्रिया इसे हिट करती है, और सोती भी है। जब म्यूटेक्स अनलॉक होता है, तो किस प्रक्रिया को अगले लॉक मिलना चाहिए?


साइट पर आपका स्वागत है और एक प्रश्न का उत्तर देने के लिए धन्यवाद जो कुछ समय के लिए बिना किसी उत्तर के आसपास बैठा है! आपका उत्तर निश्चित रूप से सही है, लेकिन मुझे लगता है कि यह थोड़ा और अधिक हो सकता है।
डेविड रिचेर्बी

3

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.