वास्तव में "स्पिन-लॉक" क्या हैं?


108

मैं हमेशा सोचता था कि वे क्या हैं: हर बार जब मैं उनके बारे में सुनता हूं, तो मेरे दिमाग के माध्यम से फ्यूचरिस्टिक फ्लाईव्हील जैसे उपकरण नाचते हैं (नाचते हैं?)।

वे क्या हैं?

जवाबों:


125

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

इसके अलावा, गिरी वस्तुएं कर्नेल के प्रत्येक राज्य में उपलब्ध नहीं हैं, जैसे कि एक बाधा हैंडलर में या जब पेजिंग उपलब्ध नहीं है आदि।

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

यही कारण है कि एक एकल कोर मशीन पर एक स्पिनलॉक केवल एक "अक्षम इंटरप्ट" या "आईआरक्यूएल बढ़ाता है" जो थ्रेड शेड्यूलिंग को पूरी तरह से रोकता है।

स्पिनलॉक अंततः "बिग कर्नेल लॉक" से बचने के लिए अनुमति देते हैं (जब कोर कर्नेल में प्रवेश करता है और निकास से बाहर निकलता है तो एक लॉक अधिग्रहीत होता है) और कर्नेल प्राइमेटिव पर दानेदार लॉकिंग होता है, जिससे मल्टी-कोर मशीनों पर बेहतर मल्टी प्रोसेसिंग होता है।

संपादित करें : एक प्रश्न सामने आया: "क्या इसका मतलब है कि मुझे जहां भी संभव हो, स्पिनकॉक का उपयोग करना चाहिए?" और मैं इसका जवाब देने की कोशिश करूंगा:

जैसा कि मैंने उल्लेख किया है, स्पिनक्लॉक केवल उन स्थानों में उपयोगी होते हैं जहां प्रत्याशित प्रतीक्षा समय क्वांटम से कम होता है (पढ़ें: मिलीसेकंड) और प्रीमेशन बहुत मायने नहीं रखता है (जैसे कर्नेल ऑब्जेक्ट उपलब्ध नहीं हैं)।

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

यहाँ एसओ को संबोधित करने पर एक सवाल है कि: स्पिनलॉक, वे कितने उपयोगी हैं?


क्या इसका मतलब यह है कि मुझे जहां संभव हो, स्पिन-लॉक (म्यूटेक्स, क्रिटिकल-सेक्शन आदि के बजाय) करना चाहिए?

1
अगर मैं गलत हूं तो कोई मुझे सही करे, लेकिन एक स्पिनलॉक प्रीइमिशन को अक्षम नहीं करता (यानी पुन: शेड्यूलिंग)। इस सरल कारण के लिए कि, अगर स्पिनलॉक किसी अन्य प्रक्रिया द्वारा लॉक किए गए संसाधन की प्रतीक्षा कर रहा है, तो उस दूसरी प्रक्रिया को संसाधन को चलाने और मुक्त करने का मौका दिया जाना चाहिए। या, दूसरी प्रक्रिया को चलाने के लिए पहली (कताई) प्रक्रिया से पहले की आवश्यकता होती है।
user1284631

इसके बजाय जो स्पिनलॉक करता है, वह TASK_INTERRUPTIBLE (जो एक नींद की अवस्था है) में TASK_RUNNING से प्रक्रिया स्थिति को नहीं बदलता है और, इस प्रकार, यह उस प्रक्रिया (मेमोरी, कैश और इतने पर) के बारे में सब कुछ नहीं बचाता है । इसके बजाय, कताई प्रक्रिया पूर्वनिर्मित है, लेकिन यह "तुरंत शेड्यूल करने योग्य" प्रक्रियाओं को कभी नहीं छोड़ता है: इसे स्मृति में रखा जाता है और अन्य प्रक्रियाएं नियमित रूप से चलती रहती हैं जब तक कि उनमें से कोई एक उस संसाधन को मुक्त नहीं करता है जो उस समय का इंतजार कर रहा है: उस समय, स्पिनलॉक बस लौटता है और कताई प्रक्रिया जारी रखने में सक्षम है। यह हमेशा TASK_RUNNING स्थिति में प्रतीक्षा करता है।
user1284631

1
आप इसके बारे में सही हैं (यह भी देखें: linuxjournal.com/article/5833 ), लेकिन तथ्य यह है कि एक रिसोर्स को लॉक करना और इंटरप्ट को अक्षम करना, हालांकि संयुक्त रूप से प्रदर्शन करने के लिए उपयोगी है, अन्यथा असंबंधित अवधारणाएं हैं। आप मूल रूप से यह सुनिश्चित करना चाहते हैं कि आप असंगत स्थिति में पाए गए संसाधन का उपयोग नहीं कर रहे हैं, और यही कारण है कि आप इसके लॉक का परीक्षण करते हैं। व्यवधान को निष्क्रिय करना (यह भी पूर्वगामी) यह सुनिश्चित करता है कि हाँ, जब आप इससे निपट रहे हैं, तो कोई भी आपके पुनरुत्थान के साथ खिलवाड़ नहीं करेगा। लेकिन, इसके लिए, आपको यह सुनिश्चित करना होगा कि जब आप इसे प्राप्त कर रहे हों तो संसाधन मुक्त हो।
user1284631

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

25

कहते हैं कि एक संसाधन एक ताला द्वारा संरक्षित है, एक धागा जो संसाधन तक पहुंच चाहता है, उसे पहले ताला प्राप्त करना होगा। यदि ताला उपलब्ध नहीं है, तो धागा बार-बार जांच सकता है कि ताला मुक्त हो गया है या नहीं। इस समय के दौरान थ्रेड व्यस्त प्रतीक्षा करता है, लॉक की जांच करता है, सीपीयू का उपयोग करता है, लेकिन कोई उपयोगी काम नहीं कर रहा है। इस तरह के लॉक को स्पिन लॉक कहा जाता है।


2
अच्छा उत्तर! +1
जयेश भोई

18

यह शत्रुतापूर्ण पाश है जो एक निश्चित स्थिति पूरी होने तक चलता रहता है:

while(cantGoOn) {};

1
और / या जबकि (कैंटीनऑन) {नींद (0)};
१४:०४ पर जुमिन २ J

@ यदि आप इसे लगाते हैं तो sleep(0)यह धागे को पहले से ही काट देगा, जिससे पहली जगह पर एक स्पिनलॉक का उपयोग किया जा सकेगा। यदि आपको अन्य थ्रेड्स की आवश्यकता है, तो आपको एक नियमित लॉक का उपयोग करना चाहिए। (मुझे पता है कि आपकी टिप्पणी बहुत पुरानी है, लेकिन दूसरों को सुझाव के रूप में देखने से रोकना चाहती थी)।
सेदत कपपनोग्लू

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


5

यह एक प्रकार का ताला है जो प्रतीक्षा में व्यस्त रहता है

इसे निम्न-स्तरीय ड्राइवर प्रोग्रामिंग (जहां यह हो सकता है कि "उचित" वेटिंग फ़ंक्शन को कॉल करने के लिए कुछ चक्रों में व्यस्त व्यस्तता से अधिक ओवरहेड है) को छोड़कर इसे एक एंटी-पैटर्न माना जाता है।

उदाहरण के लिए देखें लिनक्स कर्नेल में स्पिनलॉक


3

स्पिनलॉक्स वे होते हैं जिनमें धागा लॉक उपलब्ध होने तक प्रतीक्षा करता है। यह सामान्य रूप से कर्नेल ऑब्जेक्ट को प्राप्त करने के ओवरहेड से बचने के लिए उपयोग किया जाएगा जब कुछ छोटी समयावधि के भीतर कर्नेल ऑब्जेक्ट प्राप्त करने की गुंजाइश हो।

उदाहरण के लिए:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

3

जब आप सोचते हैं कि एक व्यस्त वेटिंग लूप दर्ज करना सस्ता है और संसाधन बंद होने पर ब्लॉक करने के बजाय किसी संसाधन को पूल करना सस्ता है, तो आप एक स्पिनलॉक का उपयोग करना चाहेंगे।

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

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


1

संक्षेप में, स्पिनलॉक परमाणु तुलना और स्वैप (CAS) या परीक्षण-और-सेट को लॉक फ्री को लागू करने के निर्देश की तरह नियोजित करता है, मुफ्त थ्रेड सुरक्षित मुहावरे की प्रतीक्षा करें। ऐसी संरचनाएं मल्टी-कोर मशीनों में अच्छी तरह से पैमाने पर हैं।


बहुत परिभाषा के अनुसार, किसी भी लॉक लॉक को मुफ्त में लागू करने या मुफ्त प्रतीक्षा करने के लिए एक स्पिनलॉक का उपयोग नहीं किया जाता है।
rdb

0

यह एक लूप है जो एक शर्त पूरी होने तक इधर-उधर घूमता रहता है।


0

ठीक है, हाँ - स्पिन लॉक (एक पारंपरिक महत्वपूर्ण खंड, आदि) की बात यह है कि वे कुछ परिस्थितियों (मल्टीकोर सिस्टम ..) के तहत बेहतर प्रदर्शन की पेशकश करते हैं, क्योंकि वे तुरंत धागे के बाकी क्वांटम का उत्पादन नहीं करते हैं।


0

स्पिनलॉक, एक प्रकार का ताला है, जो गैर-ब्लॉक सक्षम और गैर-नींद-सक्षम है। कोई भी धागा जो किसी भी साझा या महत्वपूर्ण संसाधन के लिए एक स्पिनलॉक प्राप्त करना चाहता है, निरंतर प्रसंस्करण सीपीयू को बर्बाद कर देगा, जब तक कि यह निर्दिष्ट संसाधन के लिए लॉक का अधिग्रहण नहीं करता। एक बार स्पिनलॉक हासिल कर लेने के बाद, यह अपने क्वांटम में काम पूरा करने की कोशिश करता है और फिर क्रमशः संसाधन जारी करता है। स्पिनलॉक सर्वोच्च प्राथमिकता प्रकार का ताला है, बस कह सकते हैं, यह गैर-पूर्व-प्रकार का ताला है।

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