कार्रवाई में स्पिन ताले और सेमाफोर के बीच बुनियादी अंतर क्या हैं?
कार्रवाई में स्पिन ताले और सेमाफोर के बीच बुनियादी अंतर क्या हैं?
जवाबों:
दोनों एक सीमित संसाधन का प्रबंधन करते हैं। मैं पहले बाइनरी सेमाफोर (म्यूटेक्स) और स्पिन लॉक के बीच अंतर का वर्णन करूँगा।
स्पिन लॉक एक व्यस्त प्रतीक्षा करते हैं - अर्थात यह लूप को चालू रखता है:
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)
स्पिनलॉक का उपयोग एक बाधा संदर्भ में किया जाता है, जहां सोने की अनुमति नहीं है। वे एक तंग लूप में मतदान करते हैं, संसाधन हासिल करने तक कुछ भी नहीं करते हैं। ज्यादातर ISRs में उपयोग किया जाता है, और अधिक सुरक्षित और कुशल है।
सेमीफ़ोर्स का उपयोग एक प्रक्रिया संदर्भ में किया जा सकता है, जहां नींद ठीक है।
यहाँ एक उत्तर में मेरा त्वरित शॉट है: एक स्पिन लॉक और एक बाइनरी सेमाफोर (जो एक संसाधन का उपयोग करता है जो केवल एक चीज द्वारा उपयोग किया जा सकता है) लगभग समान हैं। उनका भेद यह है कि स्पिन लॉक कोड चलाने के लिए कोड का प्रबंधन करते हैं जबकि बाइनरी सेमाफोर किसी प्रकार के एकवचन संसाधन (जैसे सीपीयू समय, प्रदर्शन आउटपुट) का प्रबंधन करते हैं
एक नियमित सेमाफोर, हालांकि एक संसाधन तक पहुंचने वाले कई थ्रेड्स को प्रबंधित करने में सक्षम होता है जो कई के बीच विभाजित हो सकता है, लेकिन सीमित है (उदाहरण के लिए मेमोरी, नेटवर्क बैंडविड्थ)
संक्षेप में, एक स्पिन-लॉक से अर्ध-विराम पूछते रहने की संभावना है अगर यह एक संसाधन का उपयोग कर सकता है। (एक बच्चे को बाथरूम का उपयोग करने और किसी और के खत्म होने की प्रतीक्षा करने की कल्पना करें।)
स्रोत: सिस्टम प्रोग्रामिंग, ऑपरेटिंग सिस्टम और विकिपीडिया का परिचय