स्पिनलॉक बनाम सेमाफोर


119

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

हम स्पिन-लॉक के ऊपर सेमाफोर का उपयोग कब करेंगे?

जवाबों:


134

स्पिनलॉक और सेमाफोर मुख्यतः चार चीजों में भिन्न होते हैं:

1. वे क्या हैं
एक स्पिनलॉक ताला का एक संभावित कार्यान्वयन है, अर्थात् एक जो कि व्यस्त प्रतीक्षा ("कताई") द्वारा कार्यान्वित किया जाता है। एक सेमीफोर एक लॉक का एक सामान्यीकरण है (या, दूसरे तरीके से, लॉक एक सेमीफोर का एक विशेष मामला है)। आमतौर पर, लेकिन जरूरी नहीं कि , स्पिनकॉक केवल एक प्रक्रिया के भीतर ही मान्य हो , जबकि सेमीफोर का उपयोग विभिन्न प्रक्रियाओं के बीच सिंक्रनाइज़ करने के लिए भी किया जा सकता है।

आपसी बहिष्करण के लिए एक ताला काम करता है, जो एक समय में एक धागा होता है, ताला प्राप्त कर सकता है और कोड के "महत्वपूर्ण खंड" के साथ आगे बढ़ सकता है। आमतौर पर, इसका मतलब कोड है जो कई थ्रेड द्वारा साझा किए गए कुछ डेटा को संशोधित करता है।
एक सेमाफोर में एक काउंटर होता है और एक या कई थ्रेड्स द्वारा खुद को अधिग्रहित किया जा सकता है , जो आपके द्वारा पोस्ट किए गए मूल्य पर निर्भर करता है, और (कुछ कार्यान्वयनों में) इसके अधिकतम स्वीकार्य मूल्य के आधार पर।

इंसोफ़र, एक लॉक को एक अर्धवृत्त का एक विशेष मामला मान सकता है जिसमें अधिकतम 1 का मान होता है।

2.
जैसा कि वे ऊपर बताए गए हैं, कताई एक ताला है, और इसलिए एक पारस्परिक बहिष्करण (सख्ती से 1 से 1) तंत्र है। यह मेमोरी स्थान को बार-बार क्वेरी और / या संशोधित करके काम करता है, आमतौर पर एक परमाणु तरीके से। इसका मतलब यह है कि एक स्पिनलॉक प्राप्त करना एक "व्यस्त" ऑपरेशन है जो संभवतः सीपीयू चक्र को लंबे समय तक जलाता है (शायद हमेशा के लिए!) जबकि यह प्रभावी रूप से "कुछ भी नहीं" प्राप्त करता है।
इस तरह के दृष्टिकोण के लिए मुख्य प्रोत्साहन तथ्य यह है कि एक संदर्भ स्विच में कुछ सौ (या शायद हजार) बार कताई के बराबर एक ओवरहेड है, इसलिए यदि कुछ चक्रों को कताई करके एक ताला प्राप्त किया जा सकता है, तो यह कुल मिलाकर बहुत अच्छी तरह से हो सकता है। अधिक कुशल। इसके अलावा, रीयलटाइम अनुप्रयोगों के लिए यह संभव नहीं हो सकता है कि भविष्य में कुछ दूर समय पर अनुसूचक को उनके पास आने के लिए ब्लॉक और प्रतीक्षा करें।

एक सेमाफोर, इसके विपरीत, या तो बिल्कुल भी स्पिन नहीं करता है, या केवल बहुत कम समय के लिए घूमता है (सिस्केल ओवरहेड से बचने के लिए एक अनुकूलन के रूप में)। यदि कोई सेमाफ़ोर अधिग्रहित नहीं किया जा सकता है, तो यह सीपीयू को एक अलग थ्रेड के लिए समय देता है, जो चलाने के लिए तैयार है। इसका मतलब यह हो सकता है कि आपका धागा फिर से निर्धारित होने से पहले कुछ मिलीसेकंड गुजरता है, लेकिन अगर यह कोई समस्या नहीं है (आमतौर पर यह नहीं है) तो यह एक बहुत ही कुशल, सीपीयू-रूढ़िवादी दृष्टिकोण हो सकता है।

3. वे भीड़ की उपस्थिति में कैसे व्यवहार करते हैं
यह एक आम गलत धारणा है कि स्पिनलॉक या लॉक-फ्री एल्गोरिदम "आम तौर पर तेज़" होते हैं, या यह कि वे केवल "बहुत कम कार्यों" के लिए उपयोगी होते हैं (आदर्श रूप से, अब तक कोई सिंक्रनाइज़ेशन ऑब्जेक्ट नहीं होना चाहिए। पूरी तरह से आवश्यक है, कभी भी)।
एक महत्वपूर्ण अंतर यह है कि विभिन्न दृष्टिकोण भीड़ की उपस्थिति में कैसे व्यवहार करते हैं ।

एक अच्छी तरह से डिज़ाइन की गई प्रणाली में आम तौर पर कम या कोई भीड़ नहीं होती है (इसका मतलब यह नहीं है कि सभी धागे सटीक एक ही समय में लॉक प्राप्त करने की कोशिश करते हैं)। उदाहरण के लिए, एक कोड को सामान्य रूप से नहीं लिखा जाता है जो एक लॉक का अधिग्रहण करता है, फिर नेटवर्क से ज़िप-संपीड़ित डेटा का आधा मेगाबाइट लोड करता है, डेटा को डीकोड और पार्स करता है, और अंत में एक साझा संदर्भ (कंटेनर में डेटा को जोड़ता है) को संशोधित करता है। ताला जारी करने से पहले। इसके बजाय, कोई साझा संसाधन तक पहुंचने के उद्देश्य से केवल लॉक का अधिग्रहण करेगा ।
चूँकि इसका मतलब है कि इसके अंदर महत्वपूर्ण खंड के बाहर काफी अधिक काम है, स्वाभाविक रूप से एक धागा महत्वपूर्ण खंड के अंदर होने की संभावना अपेक्षाकृत कम है, और इस प्रकार कुछ धागे एक ही समय में लॉक के लिए प्रतिस्पर्धा कर रहे हैं। बेशक हर अब और फिर दो धागे एक ही समय में ताला प्राप्त करने की कोशिश करेंगे (यदि ऐसा नहीं हो सकता है तो आपको लॉक की आवश्यकता नहीं होगी!), लेकिन यह नियम के बजाय "स्वस्थ" प्रणाली में अपवाद है। ।

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

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

इसके अलावा, एकल-कोर प्रणाली पर, एक कताई ताला भीड़ की उपस्थिति में काफी अकुशल होगी, क्योंकि कताई धागा अपना पूरा समय एक राज्य परिवर्तन के इंतजार में बर्बाद कर देगा जो संभवतः नहीं हो सकता (रिहा करने का धागा निर्धारित होने तक नहीं, जो कि है ' जबकि प्रतीक्षा धागा चल रहा है!)। इसलिए, किसी भी राशि के विवाद को देखते हुए, लॉक को प्राप्त करना सबसे अच्छा मामले में लगभग 1 1/2 समय के स्लाइस लेता है (यह मानते हुए कि रिलीज होने वाला धागा अगले शेड्यूल किया जा रहा है), जो बहुत अच्छा व्यवहार नहीं है।

4. वे कैसे कार्यान्वित किए जाते हैं
एक अर्धकुंभ आजकल आम तौर पर sys_futexलिनक्स के तहत लपेटता है (वैकल्पिक रूप से एक स्पिनलॉक के साथ जो कुछ प्रयासों के बाद बाहर निकलता है)।
एक स्पिनलॉक आमतौर पर परमाणु संचालन का उपयोग करके, और ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए कुछ का उपयोग किए बिना किया जाता है। अतीत में, इसका मतलब संकलक आंतरिक या गैर-पोर्टेबल असेंबलर निर्देशों का उपयोग करना था। इस बीच, C ++ 11 और C11 दोनों में भाषा के भाग के रूप में परमाणु संचालन होता है, इसलिए लेखन की सामान्य कठिनाई के अलावा लॉक-फ़्री कोड को सही रूप से सही करना, अब पूरी तरह से पोर्टेबल और (लगभग) में लॉक-फ्री कोड को लागू करना संभव है। दर्द रहित तरीका।


"इसके अलावा, एकल-कोर प्रणाली पर, एक कताई ताला की भीड़ की उपस्थिति में काफी अक्षम होगा, क्योंकि कताई धागा अपना पूरा समय एक राज्य परिवर्तन के इंतजार में बर्बाद कर देगा जो संभवतः नहीं हो सकता है": वहाँ भी है (कम से कम लिनक्स पर ) spin_trylock, जो एक त्रुटि कोड के साथ तुरंत लौटता है, अगर ताला हासिल नहीं किया जा सकता है। एक स्पिन ‑ लॉक हमेशा कठोर नहीं होता है। लेकिन spin_trylockएक आवेदन के लिए, इस तरह से (शायद लंबित संचालन की एक कतार, और यहां, अगले एक का चयन करते हुए, कतार पर वास्तविक को छोड़कर) डिज़ाइन किया जाना चाहिए, का उपयोग करना आवश्यक है।
हिबू ५

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

76

बहुत सरलता से, एक सेमाफोर एक "उपज" सिंक्रनाइज़ेशन ऑब्जेक्ट है, एक स्पिनलॉक एक 'व्यस्त' है। (इसमें थोड़ा अधिक सेमाफोर है कि वे एक म्यूटेक्स या गार्ड या मॉनिटर या क्रिटिकल सेक्शन के विपरीत कई थ्रेड्स को सिंक्रोनाइज़ करते हैं, जो एक कोड थ्रेड को एक सिंगल थ्रेड से बचाता है)

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

आम तौर पर यदि आप थ्रेड क्वांटम से अधिक समय तक स्पिन करते हैं, तो आपको एक सेमाफोर का उपयोग करना चाहिए।


27

Yoav Aviram और gbjbaanb ने जो कहा, उसके ऊपर, दूसरा मुख्य बिंदु यह था कि आप एक सिंगल-सीपीयू मशीन पर स्पिन-लॉक का उपयोग कभी नहीं करेंगे, जबकि एक सेमाफोर ऐसी मशीन पर समझ बनाएगा। आजकल, आप अक्सर कई कोर, या हाइपरथ्रेडिंग या समकक्ष के बिना एक मशीन को खोजने के लिए कठोर होते हैं, लेकिन जिन परिस्थितियों में आपके पास सिर्फ एक सीपीयू है, आपको सेमीफोर का उपयोग करना चाहिए। (मुझे विश्वास है कि कारण स्पष्ट है। अगर सिंगल सीपीयू स्पिन-लॉक को जारी करने के लिए किसी और चीज के इंतजार में व्यस्त है, लेकिन यह केवल सीपीयू पर चल रहा है, तो लॉक को तब तक जारी होने की संभावना नहीं है जब तक कि वर्तमान प्रक्रिया या थ्रेड पूर्व निर्धारित नहीं है ओ / एस, जिसमें कुछ समय लग सकता है और कुछ भी उपयोगी नहीं होता है जब तक कि प्रीमेप्शन नहीं होता है।]


7
मैं दूसरा महत्वपूर्ण है कि सिंगल थ्रेडेड सिस्टम पर स्पिनलॉक का उपयोग करना कितना महत्वपूर्ण है। वे प्राथमिकता उलटा समस्याओं के लिए एक टिक कर रहे हैं। और मुझ पर विश्वास करो: तुम इस तरह के बगों पर बहस नहीं करना चाहते।
निल्स पिपेनब्रिनक

2
लिनक्स कर्नेल में स्पिनलॉक सभी पर होते हैं, भले ही आपके पास एक से अधिक सीपीयू हों। आप का क्या तात्पर्य है?
प्रो। फॉकन

@Aigigable: परिभाषा के अनुसार, एक स्पिनलॉक का अर्थ है कि सीपीयू पर वर्तमान थ्रेड लॉक किए गए ऑब्जेक्ट को जारी करने के लिए कुछ और इंतजार कर रहा है। यदि एकमात्र सक्रिय चीज जो लॉक को बदल सकती है वह वर्तमान सीपीयू है, तो लॉक को कताई से मुक्त नहीं किया जाएगा। यदि कुछ और - एक डीएमए हस्तांतरण या अन्य I / O नियंत्रक लॉक को जारी कर सकते हैं, तो सभी अच्छी तरह से और अच्छा। लेकिन कताई जब ताला को और कुछ नहीं जारी किया जा सकता है तो बहुत समझदार नहीं है - आप सीपीयू को दूसरी प्रक्रिया के लिए तैयार कर सकते हैं क्योंकि अब पहले से तैयार होने की प्रतीक्षा करें।
जोनाथन लेफ़लर

1
मैं बहुत अच्छी तरह से गलत हो सकता हूं, लेकिन मैं इस धारणा के तहत था कि फिर से प्रवेश करने वाला (एकल सीपीयू) लिनक्स कर्नेल एक चलने वाले स्पिन लॉक को बाधित कर सकता है।
प्रो। फालकेन

2
@ योग्य: एक मौका है कि मैं भी गलत हूं, लेकिन मुझे लगता है कि मैं एक स्पिनलॉक की क्लासिक परिभाषा के करीब हूं। पूर्व-खाली समय-निर्धारण के साथ, एक प्रक्रिया अपने समय के अंत तक एक ताला पर घूम सकती है, या जब तक एक रुकावट के कारण उपज नहीं होती है, लेकिन यदि कोई अन्य प्रक्रिया उस स्थिति को प्रदान करती है जो स्पिनलॉक को लॉक करने की अनुमति देती है, तो एक स्पिनलॉक नहीं है एक सीपीयू मशीन पर अच्छा विचार है। जिस सिस्टम पर मैं काम करता हूं उसमें स्पिनलॉक होते हैं और एक गैर-व्यस्त मोड में जाने से पहले स्पिन की संख्या पर एक ऊपरी विन्यास होता है। यह एक उपयोगकर्ता-स्तरीय स्पिन-लॉक है; कर्नेल में अंतर हो सकता है।
जोनाथन लेफ़लर

19

रूबनी द्वारा लिनक्स डिवाइस ड्राइवर्स से

सेमाफोरस के विपरीत, स्पिनलॉक का उपयोग कोड में किया जा सकता है जो सो नहीं सकते हैं, जैसे कि बाधा हैंडलर


8

मैं कर्नेल विशेषज्ञ नहीं हूँ लेकिन यहाँ कुछ बिंदु हैं:

यहां तक ​​कि यूनिप्रोसेसर मशीन स्पिन-लॉक का उपयोग कर सकती है यदि कर्नेल को संकलित करते समय कर्नेल प्रीमेशन को सक्षम किया गया हो। यदि कर्नेल प्रीमेशन को अक्षम कर दिया जाता है तो स्पिन-लॉक (शायद) एक शून्य स्टेटमेंट तक फैल जाता है।

इसके अलावा, जब हम सेमाफोर बनाम स्पिन-लॉक की तुलना करने की कोशिश कर रहे हैं, मेरा मानना ​​है कि सेमाफोर कर्नेल में उपयोग किए जाने वाले को संदर्भित करता है - आईपीसी (यूजरलैंड) के लिए उपयोग नहीं किया गया।

मूल रूप से, स्पिन-लॉक का उपयोग किया जाएगा यदि क्रिटिकल सेक्शन छोटा है (स्लीप / वेक-अप के ओवरहेड से छोटा है) और क्रिटिकल सेक्शन कुछ भी नहीं कहता है जो सो सकता है! यदि महत्वपूर्ण खंड बड़ा है और यह सो सकता है, तो एक सेमाफोर का उपयोग किया जाएगा।

रमन शालोटरा।


7

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

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

यह कहा - विधानसभा में स्प्लिनलॉक लागू करना मुश्किल है, और पोर्टेबल नहीं है।


4
सभी मल्टी-थ्रेडिंग सीपीयू को एक स्पिनलॉक इंस्ट्रक्शन ("टेस्ट और सेट") की आवश्यकता होती है और इसे हमेशा हार्डवेयर में एक सिंगल इंस्ट्रक्शन के रूप में लागू किया जाता है क्योंकि वहाँ हमेशा एक रेस की स्थिति होगी जिसमें एक से अधिक थ्रेड को लगा कि यह संरक्षित संसाधन "स्वामित्व" है।
रिचर्ड टी

मुझे यकीन नहीं है कि आप सेमाफोर को समझ रहे हैं ... देखें कि दिक्जस्त्र
gbjbaanb

POSIX थ्रेड द्वारा साझा किए गए एक सेमाफोर और प्रक्रियाओं द्वारा साझा किए गए एक सेमाफोर के बीच अंतर करता है।
ग्रेग रोजर्स

2
सेमाफोर अंतर-प्रक्रिया सिंक्रनाइज़ेशन के लिए हैं, संचार नहीं।
जोहान बेजेम

6

मैं अपनी टिप्पणियों, अधिक सामान्य और बहुत लिनक्स-विशिष्ट को जोड़ना चाहूंगा।

मेमोरी आर्किटेक्चर और प्रोसेसर क्षमताओं के आधार पर, मल्टी-कोर या मल्टीप्रोसेसर सिस्टम पर सेमाफोर को लागू करने के लिए आपको स्पिन-लॉक की आवश्यकता हो सकती है, क्योंकि इस तरह के सिस्टम में दो या अधिक थ्रेड्स / प्रक्रियाएं होने पर रेस की स्थिति हो सकती है। एक सेमाफोर प्राप्त करने के लिए।

हां, यदि आपकी मेमोरी आर्किटेक्चर किसी अन्य कोर तक पहुँचने में देरी कर रही है, तो एक कोर / प्रोसेसर द्वारा मेमोरी सेक्शन को लॉक करने की सुविधा प्रदान करता है, और यदि आपका प्रोसेसर एक टेस्ट-और-सेट प्रदान करता है, तो आप एक स्पिन-लॉक के बिना सेमाफोर को लागू कर सकते हैं (लेकिन बहुत सावधानी से! )।

हालाँकि, जैसा कि सरल / सस्ते मल्टी-कोर सिस्टम डिज़ाइन किए गए हैं (मैं एम्बेडेड सिस्टम में काम कर रहा हूं), सभी मेमोरी आर्किटेक्चर ऐसे मल्टी-कोर / मल्टीप्रोसेसर फीचर्स का समर्थन नहीं करते हैं, केवल टेस्ट-सेट या समकक्ष होते हैं। फिर एक कार्यान्वयन इस प्रकार हो सकता है:

  • स्पिन-लॉक का अधिग्रहण (व्यस्त प्रतीक्षा)
  • सेमाफ़ोर प्राप्त करने का प्रयास करें
  • स्पिन-लॉक जारी करें
  • यदि सेमाफोर को सफलतापूर्वक प्राप्त नहीं किया गया था, तो सेमीफायर जारी होने तक वर्तमान थ्रेड को निलंबित करें; अन्यथा महत्वपूर्ण अनुभाग के साथ जारी रखें

निम्नांकित को इस प्रकार लागू करना होगा:

  • स्पिन-लॉक का अधिग्रहण करें
  • सेमाफ़ोर जारी करें
  • स्पिन-लॉक जारी करें

हां, और ओएस-स्तर पर सरल बाइनरी सेमाफोर के लिए प्रतिस्थापन के रूप में केवल स्पिन-लॉक का उपयोग करना संभव होगा। लेकिन केवल अगर कोड-वर्गों को संरक्षित किया जाना है तो वास्तव में बहुत छोटा है।

जैसा कि पहले कहा गया था, अगर और जब आप अपने खुद के ओएस को लागू करते हैं, तो सावधान रहना सुनिश्चित करें। इस तरह की त्रुटियों को डीबग करना मजेदार है (मेरी राय, कई लोगों द्वारा साझा नहीं की गई), लेकिन ज्यादातर बहुत थकाऊ और कठिन है।


1

एक "म्यूटेक्स" (या "आपसी बहिष्करण लॉक") एक संकेत है कि दो या अधिक अतुल्यकालिक प्रक्रियाएं अनन्य उपयोग के लिए एक साझा संसाधन आरक्षित करने के लिए उपयोग कर सकती हैं। "म्यूटेक्स" का स्वामित्व प्राप्त करने वाली पहली प्रक्रिया भी साझा संसाधन का स्वामित्व प्राप्त करती है। इससे पहले कि वे इसे प्राप्त करने का प्रयास कर सकें, अन्य प्रक्रियाओं को "म्यूटेक्स" के स्वामित्व की पहली प्रक्रिया के लिए इंतजार करना चाहिए।

कर्नेल में सबसे आम लॉकिंग प्रिमिटिव है। स्पिनलॉक एक बहुत ही सरल सिंगल-होल्डर लॉक है। यदि कोई प्रक्रिया एक स्पिनलॉक प्राप्त करने का प्रयास करती है और यह अनुपलब्ध है, तो प्रक्रिया तब तक प्रयास करती रहेगी (जब तक कि वह लॉक प्राप्त नहीं कर लेती)। यह सादगी एक छोटा और तेज़ लॉक बनाती है।


1

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

उदाहरण: डिवाइस ड्राइवर मॉड्यूल में, ड्राइवर हार्डवेयर रजिस्टर R0 में "0" लिखता है और अब उसे R0 रजिस्टर बनने के लिए इंतजार करना होगा। H / W R0 पढ़ता है और कुछ काम करता है और R0 में "1" लिखता है। यह आम तौर पर त्वरित (माइक्रो सेकंड में) है। अब कताई सोने / एच / डब्ल्यू द्वारा बाधित होने से बेहतर है। बेशक, कताई करते समय, एच / डब्ल्यू विफलता की स्थिति का ध्यान रखना चाहिए!

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


1

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

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

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

जबकि (try_acquire_resource ()); 
 ...  
जारी ();

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

अगर (try_lock ()) {
    add_to_waiting_queue ();
    रुको();
}
...
प्रक्रिया * p = get_next_process_from_waiting_queue ();
p-> वेकअप ();

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

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

पी (resources_sem)
संसाधन = resource.pop ()
...
resources.push (संसाधन)
वी (resources_sem)

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

लिनक्स में बंद


1
इस की एक प्रति / पेस्ट लगता है ;-): स्पिन ताले और semaphores के बीच अंतर क्या है?
हिबू ५

0

स्पिन लॉक को केवल एक प्रक्रिया द्वारा आयोजित किया जा सकता है, जबकि सेमीफोर को एक या अधिक प्रक्रियाओं द्वारा आयोजित किया जा सकता है। स्पिन लॉक प्रतीक्षा करें जब तक कि प्रक्रिया एक ताला जारी नहीं करती है और फिर एक ताला प्राप्त करती है। सेमाफोर स्लीप लॉक है यानी इंतजार करता है और सो जाता है।

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