लिनक्स कर्नेल में मूल कोड है:लिनक्स कर्नेल: स्पिनलॉक एसएमपी: spin_lock_irq एसएमपी संस्करण में preempt_disable() क्यों है?
static inline void __raw_spin_lock_irq(raw_spinlock_t *lock)
{
local_irq_disable();
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}
मुझे लगता है कि वहाँ कोई निष्पादन पथ वर्तमान पूर्वनिर्धारित पथ पर कर सकते हैं के बाद स्थानीय आईआरक्यू अक्षम किया गया है है।
क्योंकि सभी सामान्य हार्ड आईआरक्यू अक्षम हैं, इसलिए कोई सॉफ्टरक नहीं होना चाहिए और शेड्यूल व्हील को किक करने के लिए कोई टिक नहीं होना चाहिए। मुझे लगता है कि वर्तमान पथ सुरक्षित है। तो एक preempt_disable() क्यों है?
धन्यवाद।
@ cnicutar.क्या आप निश्चित हैं? मुझे ऐसा नहीं लगता। प्रत्येक सीपीयू कोर चलाने के लिए नौकरी लेने के लिए शेड्यूल() का उपयोग करता है। मल्टीकोर के साथ एक एसएमपी सिस्टम में, प्रत्येक कोर में यूपी सिस्टम की तरह एक समर्पित निष्पादन पथ होता है। इस मामले में, स्थानीय आईआरक्यू अक्षम है, इसलिए इस कोर पर शेड्यूल व्हील अवरुद्ध है। शायद किसी अन्य सीपीयू पर प्रीपेप्शन होता है, लेकिन इससे इस पर निष्पादन पथ प्रभावित नहीं होगा, मुझे लगता है कि वे निष्पादन स्तर पर समर्पित हैं। –