6

मैं क्या इकट्ठा कर सकते हैं से:लिनक्स spin_lock बनाम NT KeAcquireSpinLock

  • NT का KeAcquireSpinLockspin_lock_bh के बराबर है: एक DISPATCH_LEVEL, अन्य मास्क नीचे आधा बीच में आता है करने के लिए IRQL को जन्म देती है - कार्यात्मक रूप में एक ही। जबकि एनटी वेरिएंट OldIrql को रखता है, लिनक्स संस्करण कहीं भी "wastertertsAlreadyMasked" स्टोर नहीं करता है। क्या इसका मतलब है spin_unlock_bh हमेशा उन्हें अनमास्क करता है?
  • एनटी का KeAcquireInterruptSpinLockspin_lock_irqsave जैसा है।

spin_lock की NT बराबर क्या है?

तो spin_unlock_bh हमेशा बीच में आता है unmasks (NT बात में, हमेशा < DISPATCH_LEVEL को IRQL चला जाता है), इसका मतलब यह है spin_lockKeAcquireSpinLockAtDpcLevel के लिए समान है?

+0

जैसा कि आपने बताया है - विंडो की लॉकिंग आईआरक्यूएल टिंकरिंग के माध्यम से प्राप्त की जाती है। तो यदि यह अवधारणा लिनक्स पर मौजूद नहीं है तो तर्क का पालन करके spin_lock वास्तव में प्रत्यक्ष समकक्ष नहीं है क्योंकि दोनों ओएस एक ही चीज़ को प्राप्त करने के लिए थोड़ा अलग तंत्र का उपयोग करते हैं – LordDoskias

+0

आईआरक्यूएल इंटरप्ट-मास्किंग के शीर्ष पर एक अमूर्त है, और लिनक्स स्पष्ट रूप से वह है मैं क्या सोच रहा हूं कि परिदृश्य spin_lock किस लिए उपयोगी है, और एनटी लोग इस परिदृश्य का समर्थन क्यों नहीं करते? – Ilya

+0

इसके अलावा, मैंने कुछ और चीजों के बाद अपने प्रश्न को संशोधित किया: spin_lock_bg। – Ilya

उत्तर

2

कच्चे spin_lock का उपयोग तब किया जा सकता है जब आप कोई इंटरप्ट नहीं जानते हैं या नीचे-हिस्सों को कभी भी लॉक के लिए संघर्ष नहीं किया जाएगा। हस्तक्षेप मास्किंग से बचकर, आप विलंबता को बाधित करते रहते हैं, जबकि अभी भी महत्वपूर्ण वर्गों के लिए एक म्यूटेक्स के ऊपरी हिस्से से परहेज करते हैं, जिससे स्पिन करने के लिए पर्याप्त छोटा होता है।

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

मुझे संदेह है कि विंडोज समतुल्य CRITICAL_SECTION होगा, या जो भी एनटी कर्नेल एपीआई बराबर होगा; हालांकि, एक एनटी महत्वपूर्ण खंड के विपरीत, लिनक्स स्पिनलॉक्स दंडित होने पर एक म्यूटेक्स पर वापस नहीं आते हैं; वे सिर्फ कताई रखते हैं।

और, हाँ, spin_unlock_bh बिना शर्त रूप से नीचे-हिस्सों को पुनर्स्थापित करता है। आप या तो मैन्युअल रूप से सक्षम/अक्षम करने का ट्रैक रख सकते हैं (क्योंकि आपको आम तौर पर अधिग्रहण के विपरीत क्रम में ताले जारी करना चाहिए, आमतौर पर यह कोई समस्या नहीं है), या बस spin_lock_irqsave का सहारा लें।

+0

spin_lock अभी भी preempt_disable कॉल करता है। आप कह रहे हैं कि preempt_disable सिर्फ ध्वज को चिह्नित करता है और इंटरप्ट्स को अक्षम नहीं करता है - विशेष रूप से नीचे आधे इंटरप्ट्स (एनटी-स्पीच में डीपीसी?) और डिवाइस इंटरप्ट्स? – Ilya

+0

एनटी पर, स्पिनलॉक "अधिग्रहण" करने वाले सभी कार्य आईआरक्यूएल को DISPATCH_LEVEL तक बढ़ाते हैं, जिसका अर्थ है ए) कोई छूट नहीं, और बी) डीपीसी (नीचे आधा दिनचर्या) निष्पादित नहीं किया जाएगा। क्या यह प्रति सेकंड इंटरप्ट अक्षम करता है, हालांकि? क्या घड़ी में बाधा नहीं टिकेगी लेकिन आईआरक्यूएल काफी ज्यादा होने के कारण कुछ भी नहीं करेगा? – Ilya

+0

लिनक्स पर भी, मैं देख सकता हूं कि local_bh_disable अंततः केवल add_preempt_count नामक कुछ कहता है, जो preempt_disable द्वारा समान फ़ंक्शन है। तो क्या स्थानीय_भा_डिसेबल और preempt_disable अंतर करता है? – Ilya

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