2011-08-15 16 views
6

मुझे पता है कि लिनक्स में mutexesfutexes नीचे नीचे और futex का उपयोग करता तुलना और स्वैप तंत्र के रूप में लागू किया जाता है। और आमतौर पर ताले प्राप्त करने के लिए, उपयोगकर्ता-स्थान थ्रेड को सिस्टम कॉल करने की आवश्यकता नहीं होती है क्योंकि उपयोगकर्ता-स्थान में लॉक हल हो जाता है।Mutex का उपयोग और सिस्टम कॉल

अब मेरा प्रश्न यह है कि जब उच्च विवाद होता है और कई धागे एक ही समय में एक म्यूटक्स को लॉक करने का प्रयास कर रहे होते हैं तो क्या होता है। क्या कर्नेल के लिए यह तय करने के लिए सिस्टम कॉल होता है कि कौन सा धागा म्यूटक्स प्रदान करेगा? विशेष रूप से जब धागा प्राथमिकताएं अलग होती हैं? मैं खुद ऐसा सोचता हूं।

उत्तर

7

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

3

फ्यूटेक्स केवल एक सिस्कोल पर गिरने से पहले छोटी संख्या में लूप करते हैं, इसलिए उच्च लॉक contension के मामले में धागे एक syscall के लिए गिर जाएगी।

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