जवाबों:
जब आप नियमित रूप से ताले (म्यूटेक्स, क्रिटिकल सेक्शन आदि) का उपयोग करते हैं, तो ऑपरेटिंग सिस्टम आपके धागे को WAIT राज्य में रख देता है और उसी धागे पर अन्य थ्रेड्स को शेड्यूल करके इसे प्रीपेम करता है। यदि वेटिंग टाइम वास्तव में कम है, तो इसकी परफॉर्मेंस पेनल्टी है, क्योंकि आपके थ्रेड को अब सीपीयू टाइम दोबारा प्राप्त करने के लिए प्रीमीशन का इंतजार करना होगा।
इसके अलावा, गिरी वस्तुएं कर्नेल के प्रत्येक राज्य में उपलब्ध नहीं हैं, जैसे कि एक बाधा हैंडलर में या जब पेजिंग उपलब्ध नहीं है आदि।
स्पिनलॉक प्रीमेशन का कारण नहीं बनते हैं, लेकिन एक लूप ("स्पिन") में तब तक प्रतीक्षा करते हैं जब तक कि अन्य कोर लॉक जारी नहीं करते। यह थ्रेड को अपने क्वांटम को खोने से रोकता है और जैसे ही लॉक निकलता है, जारी रहता है। स्पिनलॉक का सरल तंत्र एक कर्नेल को लगभग किसी भी राज्य में उपयोग करने की अनुमति देता है।
यही कारण है कि एक एकल कोर मशीन पर एक स्पिनलॉक केवल एक "अक्षम इंटरप्ट" या "आईआरक्यूएल बढ़ाता है" जो थ्रेड शेड्यूलिंग को पूरी तरह से रोकता है।
स्पिनलॉक अंततः "बिग कर्नेल लॉक" से बचने के लिए अनुमति देते हैं (जब कोर कर्नेल में प्रवेश करता है और निकास से बाहर निकलता है तो एक लॉक अधिग्रहीत होता है) और कर्नेल प्राइमेटिव पर दानेदार लॉकिंग होता है, जिससे मल्टी-कोर मशीनों पर बेहतर मल्टी प्रोसेसिंग होता है।
संपादित करें : एक प्रश्न सामने आया: "क्या इसका मतलब है कि मुझे जहां भी संभव हो, स्पिनकॉक का उपयोग करना चाहिए?" और मैं इसका जवाब देने की कोशिश करूंगा:
जैसा कि मैंने उल्लेख किया है, स्पिनक्लॉक केवल उन स्थानों में उपयोगी होते हैं जहां प्रत्याशित प्रतीक्षा समय क्वांटम से कम होता है (पढ़ें: मिलीसेकंड) और प्रीमेशन बहुत मायने नहीं रखता है (जैसे कर्नेल ऑब्जेक्ट उपलब्ध नहीं हैं)।
यदि प्रतीक्षा समय अज्ञात है, या यदि आप उपयोगकर्ता मोड में हैं तो स्पिनलॉक कुशल नहीं हैं। अगर आप एक स्पिनलॉक उपलब्ध है, तो आप प्रतीक्षा कोर पर 100% सीपीयू समय का उपभोग करते हैं। आप अन्य धागों को उस कोर पर चलने से रोकते हैं जब तक कि आपके क्वांटम की समाप्ति नहीं हो जाती। यह परिदृश्य केवल कर्नेल स्तर पर छोटी फटने के लिए संभव है और उपयोगकर्ता-मोड एप्लिकेशन के लिए विकल्प की संभावना नहीं है।
यहाँ एसओ को संबोधित करने पर एक सवाल है कि: स्पिनलॉक, वे कितने उपयोगी हैं?
कहते हैं कि एक संसाधन एक ताला द्वारा संरक्षित है, एक धागा जो संसाधन तक पहुंच चाहता है, उसे पहले ताला प्राप्त करना होगा। यदि ताला उपलब्ध नहीं है, तो धागा बार-बार जांच सकता है कि ताला मुक्त हो गया है या नहीं। इस समय के दौरान थ्रेड व्यस्त प्रतीक्षा करता है, लॉक की जांच करता है, सीपीयू का उपयोग करता है, लेकिन कोई उपयोगी काम नहीं कर रहा है। इस तरह के लॉक को स्पिन लॉक कहा जाता है।
यह शत्रुतापूर्ण पाश है जो एक निश्चित स्थिति पूरी होने तक चलता रहता है:
while(cantGoOn) {};
sleep(0)
यह धागे को पहले से ही काट देगा, जिससे पहली जगह पर एक स्पिनलॉक का उपयोग किया जा सकेगा। यदि आपको अन्य थ्रेड्स की आवश्यकता है, तो आपको एक नियमित लॉक का उपयोग करना चाहिए। (मुझे पता है कि आपकी टिप्पणी बहुत पुरानी है, लेकिन दूसरों को सुझाव के रूप में देखने से रोकना चाहती थी)।
while(something != TRUE ){};
// it happend
move_on();
यह एक प्रकार का ताला है जो प्रतीक्षा में व्यस्त रहता है
इसे निम्न-स्तरीय ड्राइवर प्रोग्रामिंग (जहां यह हो सकता है कि "उचित" वेटिंग फ़ंक्शन को कॉल करने के लिए कुछ चक्रों में व्यस्त व्यस्तता से अधिक ओवरहेड है) को छोड़कर इसे एक एंटी-पैटर्न माना जाता है।
उदाहरण के लिए देखें लिनक्स कर्नेल में स्पिनलॉक ।
स्पिनलॉक्स वे होते हैं जिनमें धागा लॉक उपलब्ध होने तक प्रतीक्षा करता है। यह सामान्य रूप से कर्नेल ऑब्जेक्ट को प्राप्त करने के ओवरहेड से बचने के लिए उपयोग किया जाएगा जब कुछ छोटी समयावधि के भीतर कर्नेल ऑब्जेक्ट प्राप्त करने की गुंजाइश हो।
उदाहरण के लिए:
While(SpinCount-- && Kernel Object is not free)
{}
try acquiring Kernel object
जब आप सोचते हैं कि एक व्यस्त वेटिंग लूप दर्ज करना सस्ता है और संसाधन बंद होने पर ब्लॉक करने के बजाय किसी संसाधन को पूल करना सस्ता है, तो आप एक स्पिनलॉक का उपयोग करना चाहेंगे।
कताई फायदेमंद हो सकती है जब ताले ठीक से दानेदार और संख्या में बड़े होते हैं (उदाहरण के लिए, एक लिंक्ड सूची में एक नोड प्रति लॉक) और साथ ही जब लॉक होल्ड बार हमेशा बेहद कम होते हैं। सामान्य तौर पर, स्पिन लॉक को पकड़ते समय, किसी को भी ब्लॉक करने से बचना चाहिए, जो खुद को ब्लॉक कर सकता है, एक बार में एक से अधिक स्पिन लॉक को पकड़ना, गतिशील रूप से प्रेषण कॉल (इंटरफ़ेस और व्हाट्सएप) करना, किसी भी कोड एक कॉल में सांख्यिकीय रूप से प्रेषण कॉल करना। t खुद, या मेमोरी आवंटित करना।
यह भी ध्यान रखना महत्वपूर्ण है कि प्रदर्शन कारणों से स्पिनलॉक एक मूल्य प्रकार है। जैसे, किसी को बहुत सावधानी से स्पिनकॉक उदाहरण की नकल नहीं करनी चाहिए, क्योंकि दो उदाहरण (मूल और प्रतिलिपि) तब पूरी तरह से एक दूसरे से स्वतंत्र होंगे, जिससे संभवतः एप्लिकेशन के गलत व्यवहार का कारण होगा। यदि एक स्पिनलॉक उदाहरण को पास किया जाना चाहिए, तो इसे मूल्य के बजाय संदर्भ द्वारा पारित किया जाना चाहिए।
संक्षेप में, स्पिनलॉक परमाणु तुलना और स्वैप (CAS) या परीक्षण-और-सेट को लॉक फ्री को लागू करने के निर्देश की तरह नियोजित करता है, मुफ्त थ्रेड सुरक्षित मुहावरे की प्रतीक्षा करें। ऐसी संरचनाएं मल्टी-कोर मशीनों में अच्छी तरह से पैमाने पर हैं।
ठीक है, हाँ - स्पिन लॉक (एक पारंपरिक महत्वपूर्ण खंड, आदि) की बात यह है कि वे कुछ परिस्थितियों (मल्टीकोर सिस्टम ..) के तहत बेहतर प्रदर्शन की पेशकश करते हैं, क्योंकि वे तुरंत धागे के बाकी क्वांटम का उत्पादन नहीं करते हैं।
स्पिनलॉक, एक प्रकार का ताला है, जो गैर-ब्लॉक सक्षम और गैर-नींद-सक्षम है। कोई भी धागा जो किसी भी साझा या महत्वपूर्ण संसाधन के लिए एक स्पिनलॉक प्राप्त करना चाहता है, निरंतर प्रसंस्करण सीपीयू को बर्बाद कर देगा, जब तक कि यह निर्दिष्ट संसाधन के लिए लॉक का अधिग्रहण नहीं करता। एक बार स्पिनलॉक हासिल कर लेने के बाद, यह अपने क्वांटम में काम पूरा करने की कोशिश करता है और फिर क्रमशः संसाधन जारी करता है। स्पिनलॉक सर्वोच्च प्राथमिकता प्रकार का ताला है, बस कह सकते हैं, यह गैर-पूर्व-प्रकार का ताला है।