2013-02-17 67 views
8

मैं मॉनिटर को कर्नेल-मोड/कर्नेल सिंक ऑब्जेक्ट का उपयोग करने के लिए सभी संभावित स्थितियों की एक सूची संकलित करना चाहता हूं।जब बिल्कुल .NET मॉनिटर कर्नेल-मोड पर जाता है?

सिंक ब्लॉक में कर्नेल ऑब्जेक्ट को संदर्भित करने के लिए एक फ़ील्ड है इसलिए मैंने कटौती की है कि lock कभी-कभी कर्नेल-मोड पर जाएगा। Lock (Monitor) internal implementation in .NET

लेकिन यह जवाब देना ज्यादा सवाल है और केवल उपयोगी जानकारी है कि ओपी बस करते हुए कहा कि lock कुछ समय कर्नेल-मोड के लिए जाना जाएगा द्वारा अपने ही सवाल का जवाब है:

मैं इस पाया। इसके उत्तर देने के लिए कुछ भी करने के लिए कोई लिंक नहीं है।

मेरा प्रश्न अलग है - मैं जानना चाहता हूं कि वास्तव में lock कर्नेल-मोड पर जायेगा (यदि नहीं और क्यों नहीं - कब)।

मैं अगर वहाँ पुराने संस्करणों के साथ किसी भी अंतर नहीं है के बारे में नेट 4 और 4.5 सुनने के लिए अधिक दिलचस्पी

संपादित करें: रिक्टर पुस्तक से: "एक सिंक ब्लॉक कर्नेल वस्तु के लिए फ़ील्ड हैं, थ्रेड की आईडी, एक रिकर्सन गिनती, और एक प्रतीक्षा थ्रेड गिनती का मालिक है। "

उत्तर

19

SSCLI20 distribution के माध्यम से उपलब्ध सीएलआर स्रोत कोड को देखकर इनमें से अधिकतर प्रश्नों का उत्तर दिया जा सकता है। अब तक यह बहुत दिनांकित हो रहा है, यह .NET 2.0 विंटेज है, लेकिन कोर सीएलआर सुविधाओं में से बहुत कुछ नहीं बदला है।

स्रोत कोड फ़ाइल जिसे आप देखना चाहते हैं वह है clr/src/vm/syncblk.cpp। तीन वर्ग यहां एक भूमिका निभाते हैं, AwareLock निम्न-स्तरीय लॉक कार्यान्वयन है जो लॉक प्राप्त करने का ख्याल रखता है, सिंकब्लॉक वह वर्ग है जो लॉक में प्रवेश करने के लिए प्रतीक्षा कर रहे धागे की कतार लागू करता है, CLREvent ऑपरेटिंग सिस्टम सिंक्रनाइज़ेशन के लिए रैपर है ऑब्जेक्ट, जिसे आप पूछ रहे हैं।

यह सी ++ कोड है और अमूर्तता का स्तर काफी अधिक है, यह कोड कचरा कलेक्टर के साथ अत्यधिक संपर्क करता है और इसमें बहुत सारे परीक्षण कोड शामिल हैं। तो मैं प्रक्रिया का संक्षिप्त विवरण दूंगा।

सिंकब्लॉक में m_Monitor सदस्य है जो AwareLock इंस्टेंस को संग्रहीत करता है। SyncBlock :: Enter() सीधे AwareLock :: Enter() को कॉल करता है। यह पहले लॉक को यथासंभव सस्ता रूप से हासिल करने का प्रयास करता है। सबसे पहले जांच करें कि थ्रेड पहले से ही लॉक का मालिक है और यदि मामला है तो लॉक गिनती में वृद्धि हो रही है। अगला FastInterlockCompareExchange() का उपयोग करके, एक आंतरिक फ़ंक्शन जो Interlocked.CompareExchange() के समान है। यदि लॉक का विरोध नहीं किया जाता है तो यह बहुत तेज़ी से सफल होता है और मॉनीटर करता है। एंटर() रिटर्न। यदि नहीं तो एक और थ्रेड पहले से ही लॉक का मालिक है, AwareLock :: EnterEpilog का उपयोग किया जाता है। ऑपरेटिंग सिस्टम के थ्रेड शेड्यूलर को शामिल करने की आवश्यकता है ताकि CLREvent का उपयोग किया जा सके।यदि आवश्यक हो तो यह गतिशील रूप से बनाया गया है और इसकी प्रतीक्षाऑन() विधि कहा जाता है। जिसमें एक कर्नेल संक्रमण शामिल होगा।

आपके प्रश्न का उत्तर देने के लिए पर्याप्त है: मॉनिटर क्लास कर्नेल मोड में प्रवेश करता है जब लॉक का विरोध होता है और थ्रेड को प्रतीक्षा करनी होती है।

+0

आपको बहुत बहुत धन्यवाद। खासकर एसएससीएलआई के लिए - मुझे नहीं पता था कि यह सार्वजनिक रूप से उपलब्ध था। –

+3

टिप्पणी के लिए धन्यवाद जो मुझे सीएलआर स्रोत में प्रासंगिक भाग के लिए इंगित करता है। मैं विशेष रूप से कताई भाग में रूचि रखता हूं: यह आमतौर पर कर्नेल जाने से पहले पहले स्पिन पर मॉनीटर का दावा किया जाता है। और मुझे दिलचस्पी है कि यह वास्तव में कैसे स्पिन करता है (पुनरावृत्तियों की संख्या, ...)। मैं आपके द्वारा वर्णित कोड पथ में कताई नहीं देख पा रहा हूं, हालांकि, मैं AwareLock :: कथन द्वारा AwareLock :: TryEnter द्वारा कताई तर्क में कताई तर्क देखता हूं। अब ऐसा लगता है कि यह टाइमआउट का उपयोग होने पर TryEnter के लिए ही लागू होता है, इसलिए मुझे लगता है कि सी # लॉक कीवर्ड का उपयोग करते समय कताई का उपयोग नहीं किया जाता है। क्या मैं सही हू? –

1

इसके स्पिनवाइट चरण के बाद।

अतिरिक्त बुद्धि मौजूद हो सकती है, जैसे सिंगल कोर मशीनों पर स्पिनवाइट छोड़ना क्योंकि प्रतियोगिता लॉक केवल थ्रेड जारी करने के बाद ही जारी किया जा सकता है।

+0

एंड्रयू मुझे इस सवाल का जवाब देने के लिए विमान दृश्य में सभी कदमों की आवश्यकता है। आपका जवाब इस तरह है - जब लोग मर जाते हैं तो लोग मर जाते हैं - जब वे मर जाते हैं। –

+0

@ बॉपटीबॉप: अपने आप को एक विमान और हवाई पट्टी ले जाओ, फिर हम इस बिंदु पर चर्चा करें –

+0

हां। यदि आप कुछ और सटीक चाहते हैं, तो "5: 04: 02.008" के बारे में कैसे? गंभीरता से, एक पूर्ण जवाब बेकार है, और एक सापेक्ष उत्तर बदलता है। एकमात्र चीज़ एक तार्किक जवाब है। पिछले चरण पूरा होने के बाद, आपके प्रश्न के उस बिंदु की कमी है जिसके बाद आप हैं। तुम क्यो फिकर करते हो? यदि आपने इसे प्रदान किया है, तो हम एक और उपयोगी उत्तर प्रदान करने में सक्षम हो सकते हैं। –

2

जब लॉक का भारी विरोध होता है।

यदि लॉक हल्के से दबदबा है, तो लॉक को फिर से मुक्त करने के लिए प्रतीक्षा करने के लिए एक त्वरित सीपीयू स्पिनलॉक है, लेकिन यदि यह लॉक मुक्त होने के लिए काफी देर तक इंतजार नहीं करता है, तो थ्रेड पर प्रतीक्षा अवरुद्ध कर देगा mutex, जिसमें थ्रेड और अन्य ऐसे प्रबंधन को निलंबित करने के लिए कर्नेल मोड कॉल शामिल है।