2015-10-30 6 views
12

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

यह अच्छा होगा अगर कोई यह बता सके कि कर्नेल और हार्डवेयर/असेंबली स्तर पर यह conditional_wait() प्रक्रिया कैसे कार्यान्वित की गई है?

लॉक कैसे जारी किया जाता है और परमाणु रूप से पुनः प्राप्त किया जाता है? कर्नेल यह कैसे सुनिश्चित करता है?

यहां वास्तव में क्या मतलब है? क्या इसका मतलब किसी अन्य प्रक्रिया/धागे पर संदर्भ स्विच है?

थ्रेड नींद के दौरान, यह थ्रेड कैसे कर्नेल स्तर पर लागू सिग्नल करके जागृत होता है और यदि इन तंत्रों के लिए कोई हार्डवेयर विशिष्ट समर्थन प्रदान किया जाता है?

संपादित करें:

ऐसा लगता है "futex" पुरुष इस प्रतीक्षा/संकेत सामान प्रबंध है। मेरे प्रश्न को कम करने के लिए: हालत चर के इंतजार और अधिसूचना के लिए futex सिस्टम कॉल कैसे कम स्तर पर कार्यान्वित/काम करता है?

+0

पड़ता है एक Linux सिस्टम स्रोत पर, मानक पुस्तकालय स्तर से, सभी खुले और स्वतंत्र रूप से उपलब्ध है। इसमें कुछ समय लगेगा लेकिन यह असंभव नहीं है। –

+1

लिनक्स सिस्टम पर, उपयोगकर्ता स्थान और कर्नेल के बीच संपर्क आमतौर पर फ़्यूटेक्स नामक टूल के साथ किया जाता है। यह कर्नेल संगठित प्रतीक्षा के साथ परमाणु अद्यतन को जोड़ती है। आप futexes के बारे में बहुत सारे दस्तावेज खोजने में सक्षम होना चाहिए। –

+0

यह कहां कहता है कि * पुनः प्राप्त * प्रतीक्षा के बाद ताला परमाणु है? मैनपेज निश्चित रूप से नहीं करता है। – EOF

उत्तर

11

एक उच्च स्तर पर (और चूंकि आप इस quesiton से पूछ रहे हैं, उच्च स्तर की जरूरत है) यह जटिल नहीं है। सबसे पहले, आपको ज़िम्मेदारी की परतों को जानना होगा। वहाँ मूलतः 3 परतें हैं:

  • हार्डवेयर स्तर - आम तौर पर कुछ है जो एक सिंगल एएसएम अनुदेश में कोडित किया जा सकता है
  • कर्नेल स्तर - जो कुछ ओएस गिरी
  • आवेदन स्तर है - जो कुछ आवेदन
करता है

आम तौर पर, उन जिम्मेदारियों को ओवरलैप नहीं किया जा रहा है - कर्नेल केवल हार्डवेयर ही नहीं कर सकता है, हार्डवेयर केवल कर्नेल ही नहीं कर सकता है। इसे ध्यान में रखते हुए, यह याद रखना उपयोगी है कि जब लॉकिंग की बात आती है, तो इसके बारे में बहुत कम हार्डवेयर जानता है। यह बहुत ज्यादा

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

यह बहुत सी सीपीयू कर सकता है। जैसा कि आप देखते हैं, यहां कोई फूटेक्स, म्यूटेक्स या सशर्त चर नहीं है। यह सामान कर्नेल द्वारा सीपीयू-समर्थित संचालन के निपटारे में किया जाता है।

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

जब म्यूटेक्स प्रारंभ में बनाया जाता है, तो कर्नेल इसके साथ एक मेमोरी क्षेत्र को जोड़ता है। इस क्षेत्र में म्यूटेक्स लॉक या अनलॉक होने का मूल्य होगा। बाद में, कर्नेल को म्यूटेक्स को लॉक करने के लिए कहा जाता है, यह पहले सीपीयू को मेमोरी बाधा जारी करने के लिए निर्देश देता है। एक म्यूटेक्स को बाधा के रूप में कार्य करना चाहिए, ताकि म्यूटेक्स के बाद सब कुछ पढ़ा/wrttten एक्वार्ड (या जारी) शेष CPUs के लिए दृश्यमान हो। यह सीपीयू-समर्थित तुलना-और-सेट निर्देश का उपयोग करता है ताकि स्मृति क्षेत्र मान को 1 पर सेट किया जा सके। (वहां अधिक जटिल पुनर्वित्त म्यूटेक्स हैं, लेकिन चलिए उनके साथ तस्वीर को जटिल नहीं करते हैं)। यह सीपीयू द्वारा गारंटीकृत है कि अगर एक धागा एक ही समय में ऐसा करने का प्रयास करता है, तो केवल एक ही सफल होगा। यदि ऑपरेशन सफल होता है, तो अब हम 'म्यूटेक्स धारण करते हैं'। एक बार कर्नेल को म्यूटेक्स को रिहा करने के लिए कहा जाता है, मेमोरी क्षेत्र 0 पर सेट होता है (इस स्थिति को करने की कोई आवश्यकता नहीं है, क्योंकि हम जानते हैं कि हम म्यूटेक्स धारण करते हैं!) और एक और मेमोरी बाधा जारी की जाती है। कर्नेल इसके टेबल में म्यूटेक्स स्थिति भी अपडेट करता है - नीचे देखें।

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

आशा है कि यह कर्नेल के लिए नीचे कम से कम आधा-भावना :)

+0

आपके विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद !! लॉकिंग के बारे में चीजों को बहुत स्पष्ट बनाता है। मेरे पास कुछ और स्पष्टीकरण हैं। वास्तव में अनलॉक करने के बाद ** ** ** क्या सोता है? क्या इसका मतलब कर्नेल द्वारा दूसरी प्रक्रिया/थ्रेड पर स्विच है?यह धागा ** सिग्नलिंग ** द्वारा जागृत कैसे है? सोने के थ्रेड का संकेत क्या है? इसे कैसे कार्यान्वित किया जाता है। – Shyam

+1

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

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