एक उच्च स्तर पर (और चूंकि आप इस quesiton से पूछ रहे हैं, उच्च स्तर की जरूरत है) यह जटिल नहीं है। सबसे पहले, आपको ज़िम्मेदारी की परतों को जानना होगा। वहाँ मूलतः 3 परतें हैं:
- हार्डवेयर स्तर - आम तौर पर कुछ है जो एक सिंगल एएसएम अनुदेश में कोडित किया जा सकता है
- कर्नेल स्तर - जो कुछ ओएस गिरी
- आवेदन स्तर है - जो कुछ आवेदन
करता है
आम तौर पर, उन जिम्मेदारियों को ओवरलैप नहीं किया जा रहा है - कर्नेल केवल हार्डवेयर ही नहीं कर सकता है, हार्डवेयर केवल कर्नेल ही नहीं कर सकता है। इसे ध्यान में रखते हुए, यह याद रखना उपयोगी है कि जब लॉकिंग की बात आती है, तो इसके बारे में बहुत कम हार्डवेयर जानता है। यह बहुत ज्यादा
- परमाणु arithmetics करने पर निर्भर करता - हार्डवेयर एक विशेष स्मृति क्षेत्र ताला (कोई अन्य सूत्र इसे उपयोग सुनिश्चित कर लें), उस पर अंकगणित कार्रवाई करने और इस क्षेत्र अनलॉक कर सकते हैं। यह केवल चिप द्वारा समर्थित रूप से समर्थित अंकगणित पर काम कर सकता है (कोई वर्ग जड़ों!) और हार्डवेयर
- मेमोरी बाधाओं या बाड़ों द्वारा समर्थित आकारों पर आधारित है - यानी, निर्देशों के प्रवाह में बाधा उत्पन्न करें, ताकि जब सीपीयू रीडायर्स निर्देश या मेमोरी कैश का उपयोग करते हैं, वे उन बाड़ों को पार नहीं करेंगे और कैश ताजा होगा
- सशर्त सेटिंग (तुलना-और-सेट) - मेमोरी क्षेत्र को मूल्य ए पर सेट करें यदि यह बी है और इस ऑपरेशन की स्थिति की रिपोर्ट करें (यह सेट किया गया था या नहीं)
यह बहुत सी सीपीयू कर सकता है। जैसा कि आप देखते हैं, यहां कोई फूटेक्स, म्यूटेक्स या सशर्त चर नहीं है। यह सामान कर्नेल द्वारा सीपीयू-समर्थित संचालन के निपटारे में किया जाता है।
चलो एक बहुत ही उच्च स्तर पर देखें कि कैसे कर्नेल futex कॉल को कार्यान्वित कर सकता है।असल में, फ्यूटेक्स थोड़ा जटिल है, क्योंकि यह आवश्यकतानुसार उपयोगकर्ता स्तरीय कॉल और कर्नेल-स्तरीय कॉल का मिश्रण है। आइए 'शुद्ध' म्यूटेक्स को देखें, पूरी तरह से कर्नेल स्पेस में लागू किया गया है। एक उच्च स्तर पर, यह पर्याप्त प्रदर्शन होगा।
जब म्यूटेक्स प्रारंभ में बनाया जाता है, तो कर्नेल इसके साथ एक मेमोरी क्षेत्र को जोड़ता है। इस क्षेत्र में म्यूटेक्स लॉक या अनलॉक होने का मूल्य होगा। बाद में, कर्नेल को म्यूटेक्स को लॉक करने के लिए कहा जाता है, यह पहले सीपीयू को मेमोरी बाधा जारी करने के लिए निर्देश देता है। एक म्यूटेक्स को बाधा के रूप में कार्य करना चाहिए, ताकि म्यूटेक्स के बाद सब कुछ पढ़ा/wrttten एक्वार्ड (या जारी) शेष CPUs के लिए दृश्यमान हो। यह सीपीयू-समर्थित तुलना-और-सेट निर्देश का उपयोग करता है ताकि स्मृति क्षेत्र मान को 1 पर सेट किया जा सके। (वहां अधिक जटिल पुनर्वित्त म्यूटेक्स हैं, लेकिन चलिए उनके साथ तस्वीर को जटिल नहीं करते हैं)। यह सीपीयू द्वारा गारंटीकृत है कि अगर एक धागा एक ही समय में ऐसा करने का प्रयास करता है, तो केवल एक ही सफल होगा। यदि ऑपरेशन सफल होता है, तो अब हम 'म्यूटेक्स धारण करते हैं'। एक बार कर्नेल को म्यूटेक्स को रिहा करने के लिए कहा जाता है, मेमोरी क्षेत्र 0 पर सेट होता है (इस स्थिति को करने की कोई आवश्यकता नहीं है, क्योंकि हम जानते हैं कि हम म्यूटेक्स धारण करते हैं!) और एक और मेमोरी बाधा जारी की जाती है। कर्नेल इसके टेबल में म्यूटेक्स स्थिति भी अपडेट करता है - नीचे देखें।
यदि म्यूटेक्स लॉकिंग विफल हो जाती है, तो कर्नेल थ्रेड को इसके सारणी में जोड़ता है जो विशेष म्यूटेक्स को रिलीज़ होने के लिए थ्रेड सूचीबद्ध करता है। जब म्यूटेक्स जारी किया जाता है, कर्नेल जांचता है कि इस म्यूटेक्स पर कौन सा धागा इंतजार कर रहा है, और 'शेड्यूल' (यानी निष्पादन के लिए तैयार करता है) उनमें से एक (यदि एक से अधिक है, जिसे निर्धारित किया जाएगा या जागृत किया जाएगा कारकों की भीड़, सबसे सरल मामले में यह बस यादृच्छिक है)। निर्धारित धागा निष्पादन शुरू होता है, फिर म्यूटेक्स को ताला लगा देता है (इस बिंदु पर यह फिर से असफल हो सकता है!) और जीवन चक्र जारी है।
आशा है कि यह कर्नेल के लिए नीचे कम से कम आधा-भावना :)
पड़ता है एक Linux सिस्टम स्रोत पर, मानक पुस्तकालय स्तर से, सभी खुले और स्वतंत्र रूप से उपलब्ध है। इसमें कुछ समय लगेगा लेकिन यह असंभव नहीं है। –
लिनक्स सिस्टम पर, उपयोगकर्ता स्थान और कर्नेल के बीच संपर्क आमतौर पर फ़्यूटेक्स नामक टूल के साथ किया जाता है। यह कर्नेल संगठित प्रतीक्षा के साथ परमाणु अद्यतन को जोड़ती है। आप futexes के बारे में बहुत सारे दस्तावेज खोजने में सक्षम होना चाहिए। –
यह कहां कहता है कि * पुनः प्राप्त * प्रतीक्षा के बाद ताला परमाणु है? मैनपेज निश्चित रूप से नहीं करता है। – EOF