स्पिन लॉक और सेमाफोर के बीच अंतर क्या है?


15

कार्रवाई में स्पिन ताले और सेमाफोर के बीच बुनियादी अंतर क्या हैं?



@ गिल्स मैंने उस पर भी गौर किया, लेकिन पेज पर केवल सेमाफोरस का उल्लेख है, वॉरेन टिप्पणी कर रहे हैं कि "यदि कोई स्पिन लॉक के बीच अंतर जानना चाहता है और, एक सेमीफोर कहता है, तो यह एक अलग सवाल है।"
माइकल Mrozek

@ मिचेल: ठीक है, मुझे लगता है कि वहाँ के जवाब मुख्य बिंदु को संबोधित करते हैं, लेकिन आप सही हैं कि किसी ने भी स्पष्ट रूप से नहीं कहा है कि सेमीफोर अन्य प्रकार के तालों में से एक था।
गिल्स एसओ- बुराई को रोकना '

लिनुस टोरवाल्ड्स द्वारा स्पष्टीकरण: yarchive.net/comp/linux/semaphores.html
myaut

की डुप्लीकेट stackoverflow.com/questions/195853/spinlock-versus-semaphore कई अच्छा स्पष्टीकरण धागा में मौजूद है कि मैंने पूछा है।
.नकिट्स

जवाबों:


13

दोनों एक सीमित संसाधन का प्रबंधन करते हैं। मैं पहले बाइनरी सेमाफोर (म्यूटेक्स) और स्पिन लॉक के बीच अंतर का वर्णन करूँगा।

स्पिन लॉक एक व्यस्त प्रतीक्षा करते हैं - अर्थात यह लूप को चालू रखता है:

while (try_acquire_resource ());
...
release();

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

दूसरी ओर म्यूटेक्स अधिक व्यवहार करते हैं:

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

इसलिए यदि थ्रेड अवरुद्ध संसाधन प्राप्त करने का प्रयास करेगा तो उसे तब तक के लिए निलंबित कर दिया जाएगा जब तक कि वह इसके लिए avaible नहीं होगा। लॉकिंग / अनलॉकिंग बहुत अधिक भारी है लेकिन प्रतीक्षा 'स्वतंत्र' और 'निष्पक्ष' है।

सेमाफोर एक ताला है जिसे कई बार इस्तेमाल किया जा सकता है (आरंभिक से ज्ञात) कई बार - उदाहरण के लिए 3 धागे को एक साथ संसाधन रखने की अनुमति दी जाती है, लेकिन अब और नहीं। इसका उपयोग निर्माता / उपभोक्ता समस्या या सामान्य रूप से कतारों में उदाहरण के लिए किया जाता है:

P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)

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

लिनक्स कर्नेल संदर्भ में, स्पिन कार्यान्वयन के साथ एकमात्र लॉक में म्यूटेक्स इंटरफ़ेस है। मुझे समझ में नहीं आया कि यह पंक्ति क्या है। क्या आप इस पर विस्तार कर सकते हैं?
सेन

@ सीन: उनका मतलब था कि लिनक्स में स्पिन लॉक बाइनरी व्यवहार करता है (यह लॉक है या नहीं)। सूफी के रूप में कताई ताला व्यवहार करना संभव है।
मैकीज पाइचोटका

"लेकिन अगर लॉकिंग थ्रेड को अन्य द्वारा प्रीमेप्ट किया जाएगा जो दूसरे को समान रूप से एक्सेस करने की कोशिश करेगा, तो बस संसाधन को प्राप्त करने की कोशिश करेगा जब तक कि यह सीपीयू क्वांटा से बाहर न चला जाए।": लेकिन एक समस्या अभी भी एमएक्सएक्स के साथ बनी हुई है। क्या होगा यदि अधिक प्राथमिकता वाले किसी कार्य को संसाधन तक पहुंचने की आवश्यकता है ... क्या यह सिर्फ कतारबद्ध है? विभिन्न प्राथमिकताओं वाले कार्यों के बीच संसाधनों को साझा करना शून्य करना बेहतर हो सकता है।
हिबू ५।

@ Hibou57: हाँ यह अवरुद्ध है क्योंकि राज्य सुसंगत नहीं है और संसाधन के उपयोग से 'मज़ेदार' प्रभाव होंगे (जैसे कि कम प्राथमिकता वाला धागा लिंक सूची से / से कुछ जोड़ने या हटाने के बीच में था)। इस कथन का मुद्दा यह था कि यदि थ्रेड अवरुद्ध है तो यह अनुसूचित नहीं है, इसलिए यह संसाधनों का उपभोग नहीं करता है जबकि थ्रेडलॉक पर थ्रेड प्रतीक्षा करता है। रियल-टाइम सिस्टम (विशेष रूप से कठिन) के लिए लॉक करना अलग विषय है और मुझे इसका जवाब देने के लिए पर्याप्त ज्ञान नहीं है - हालांकि वे सिस्टम कभी-कभी प्राथमिकता दान या अन्य तकनीकों को लागू करते हैं।
मैकीज पीचोटका

2

स्पिनलॉक का उपयोग एक बाधा संदर्भ में किया जाता है, जहां सोने की अनुमति नहीं है। वे एक तंग लूप में मतदान करते हैं, संसाधन हासिल करने तक कुछ भी नहीं करते हैं। ज्यादातर ISRs में उपयोग किया जाता है, और अधिक सुरक्षित और कुशल है।

सेमीफ़ोर्स का उपयोग एक प्रक्रिया संदर्भ में किया जा सकता है, जहां नींद ठीक है।


1

यहाँ एक उत्तर में मेरा त्वरित शॉट है: एक स्पिन लॉक और एक बाइनरी सेमाफोर (जो एक संसाधन का उपयोग करता है जो केवल एक चीज द्वारा उपयोग किया जा सकता है) लगभग समान हैं। उनका भेद यह है कि स्पिन लॉक कोड चलाने के लिए कोड का प्रबंधन करते हैं जबकि बाइनरी सेमाफोर किसी प्रकार के एकवचन संसाधन (जैसे सीपीयू समय, प्रदर्शन आउटपुट) का प्रबंधन करते हैं

एक नियमित सेमाफोर, हालांकि एक संसाधन तक पहुंचने वाले कई थ्रेड्स को प्रबंधित करने में सक्षम होता है जो कई के बीच विभाजित हो सकता है, लेकिन सीमित है (उदाहरण के लिए मेमोरी, नेटवर्क बैंडविड्थ)

संक्षेप में, एक स्पिन-लॉक से अर्ध-विराम पूछते रहने की संभावना है अगर यह एक संसाधन का उपयोग कर सकता है। (एक बच्चे को बाथरूम का उपयोग करने और किसी और के खत्म होने की प्रतीक्षा करने की कल्पना करें।)

स्रोत: सिस्टम प्रोग्रामिंग, ऑपरेटिंग सिस्टम और विकिपीडिया का परिचय

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.