मतदान से अलग कताई कैसे होती है?


41

क्या पालक और पोलिंग एक ही चीज है?

विकिपीडिया:

स्पिनलॉक एक लॉक होता है, जो थ्रेड को लूप ("स्पिन") में प्रतीक्षा करने के लिए इसे प्राप्त करने का प्रयास करता है, जबकि लॉक उपलब्ध होने पर बार-बार जाँच करता है।

यह बहुत अजीब लगता है:

while(!ready);

मुझे मतदान से बचने के लिए सिखाया गया था जब भी संभव हो यह उप-इष्टतम था। तो, क्या खराब पुराने मतदान के लिए एक फैंसी नाम है? मतदान से अलग एक पालक कैसे होता है?

जवाबों:


85

मतदान का तात्पर्य बार-बार यह जाँचना है कि क्या कोई संसाधन ( किसी भी प्रकार का संसाधन) तैयार है।

एक स्पिनलॉक तब होता है जब आप जिस संसाधन से मतदान कर रहे हैं वह एक ताला है।

ध्यान दें कि मतदान खराब नहीं है । विशेष रूप से, मतदान तब कुशल होता है जब आप मतदान करते समय आमतौर पर तैयार डेटा होते हैं। मतदान केवल अकुशल है यदि आप इसके बिना करते हैं तो बदले में कोई डेटा नहीं मिलता है।

दूसरी ओर, यदि बहुत अधिक डेटा है कि आप लगातार बाधित हो जाते हैं, तो व्यवधान अकुशल होता है। यदि डेटा पर्याप्त रूप से आता है तो वे कुशल हैं कि आप बाधित होने से पहले वास्तव में कुछ उपयोगी काम कर सकते हैं।

मैं आपको अपने स्वयं के अनुभव से एक वास्तविक जीवन का उदाहरण दे सकता हूं: 15 साल पहले, मेरे पास अपना ईमेल प्रोग्राम था जो मुझे हर बार बाधित करने के लिए एक नया ईमेल आता था। जो कि सप्ताह में एक या दो बार होता था। लगातार मेरे इनबॉक्स की जाँच करना समय की भारी बर्बादी होगी।

आजकल, मेरे पास सभी सूचनाएं बंद हैं। मुझे पता है कि जब भी मैं अपने इनबॉक्स में देखता हूं, तो वहां नए ईमेल आएंगे। मतदान अब बहुत अधिक कुशल है।

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

(और निश्चित रूप से, spinlocks केवल तभी काम करते हैं जब सही समानता हो, अन्यथा दूसरे धागे में ताला जारी करने का मौका नहीं होगा। मुझे लगता है कि यह स्पष्ट है, लेकिन मैं इसे वैसे भी बताना चाहता था।)


5
स्पिनलॉक एक सहकारी पर्यावरणीय परिवेश में पूरी तरह से समझदार हो सकते हैं। आपको बस यह सुनिश्चित करना है कि आप लूप में नियंत्रण कर रहे हैं।
केविन

4
ईमेल के साथ महान उदाहरण। मुझे याद दिलाता है कि आपके पास हमेशा ईमेल है ...
पेट्र पुडलक

2
@ केविन: मेरे पास एक स्पिनलॉक का एक बहुत ही शुद्ध विचार है, शाब्दिक एक ताला जो सिर्फ एक खाली लूप में घूमता है। ( atomically_do { while (lock.is_locked?); lock.acquire! }) यदि इसकी पैदावार होती है, तो यह एक खाली लूप नहीं है और इस तरह से उस शुद्ध दृश्य में स्पिनलॉक नहीं है: - लेकिन निश्चित रूप से प्लैटोनिक आदर्श के अन्य प्रकार के ताले या आराम / परिवर्धन के साथ कुछ संकरण वास्तविक दुनिया में सही अर्थ बनाते हैं।
जोर्ग डब्ल्यू मित्तग

3
@bubakazouba: एक स्पिनलॉक एक खाली लूप में "कताई" के द्वारा शाब्दिक रूप से काम करता है और "क्या अभी तक लॉक जारी किया गया है?" बार बार। यदि कोई समानता नहीं है, तो एक ही समय में कोई अन्य धागा नहीं चल रहा है जो लॉक को छोड़ सकता है, इसलिए आपके पास प्रभावी रूप से एक अंतहीन लूप है! अपने ऊपर सीधे टिप्पणी देखें।
जोर्ग डब्ल्यू मित्तग

1
@kasperd: आप अभी भी nginx जैसे इवेंट-संचालित सर्वर सॉफ़्टवेयर में सहकारी मल्टीटास्किंग देख सकते हैं। उस स्थिति में, एक थ्रेड होता है और कोई लॉकिंग नहीं होता है, जिसका अर्थ है कि आप केवल एक कोर का दोहन करने के लिए प्राप्त करते हैं। मेरे ज्ञान का सबसे अच्छा करने के लिए, वास्तव में सच मल्टीकोर सहकारी मल्टीटास्किंग का कोई वास्तविक दुनिया उदाहरण नहीं है । इस तरह की व्यवस्था बेवकूफी होगी, क्योंकि आपको बिना किसी ताले के उल्टा सहकारी मल्टीटास्किंग के सभी डाउनसाइड मिल जाएंगे।
केविन

10

एक स्पिनलॉक एक प्रकार का ताला है, विशेष रूप से, जिसे मतदान के माध्यम से प्राप्त किया जाता है

मतदान किसी चीज़ की स्थिति की जाँच करने की एक विधि है (स्थिति के लिए पूछकर, जैसा कि स्थिति को बताने के लिए प्रतीक्षा करने का विरोध किया जाता है)।

सभी मतदान एक स्पिनलॉक नहीं है, उदाहरण के लिए, कीबोर्ड कुंजियों की स्थिति को मतदान करना।


इसके अलावा, मतदान स्वाभाविक रूप से बुरा नहीं है। मतदान के बहुत कम समय महंगी संदर्भ पारियों से बच सकते हैं जिनमें व्यवधानों के उपयोग की आवश्यकता होगी, यह उल्लेख नहीं करने के लिए कि मतदान कभी-कभी लागू करने के लिए सरल हो सकता है और इस प्रकार बनाए रखना आसान होता है, खासकर निचले स्तरों पर। हमेशा की तरह, निरपेक्षता एक भयानक चीज है, और आपको उस विधि का उपयोग करना चाहिए जो आपकी आवश्यकताओं के लिए उपयुक्त प्रदर्शन / जटिलता व्यापार को बंद कर देता है, जैसा कि आपने उन्हें नेत्रहीन रूप से उपयोग या त्यागने के बजाय उन्हें मापा है


5

स्पिनलॉक मतदान से अलग है क्योंकि यह केवल कुछ मिलीसेकंड या उससे कम के आदेश पर बहुत कम समय के लिए होता है । मतदान अनिश्चित काल तक चल सकता है।

समानांतर प्रोग्रामिंग में, कताई का एक संक्षिप्त एपिसोड अक्सर अवरुद्ध करने के लिए बेहतर होता है, क्योंकि यह संदर्भ स्विचिंग और कर्नेल संक्रमणों की लागत से बचा जाता है।

इसके अलावा
सी #
स्पिनलॉक और रीड-राइट लॉक इन सी


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

@ पेटर शायद यही अलभारी का मतलब था। यही उसका पाठ कहता है।
रॉबर्ट हार्वे

4

अंतर यह है कि एक स्पिनकॉक (उम्मीद है) केवल उन स्थितियों में उपयोग किया जाता है जहां यह उपयुक्त है, और इन स्थितियों में यह बहुत कुशल है।

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

कभी-कभी दोनों संयुक्त होते हैं; आप स्पिन लॉक को थोड़े समय के लिए चलाते हैं और अगर स्पिनलॉक काम नहीं करता है तो एक अलग रणनीति पर स्विच करें।


2

अत्यधिक मतदान कुछ ऐसा है जो आपको नहीं करना चाहिए क्योंकि यह सिस्टम संसाधनों को बर्बाद करता है। यदि सिस्टम सिस्टम को बर्बाद नहीं करता है तो यह ठीक है कि मतदान ठीक है

उदाहरण के लिए अत्यधिक मतदान से उन मामलों में 100% तक सीपीयू लोड होगा जहां वास्तविक कार्य केवल 2% लोड होगा।

मतदान का उपयोग अन्य चीजों के लिए किया जा सकता है while(!ready)। उदाहरण के लिए, इसका मतलब है कि यदि उपयोगकर्ता ने एक कुंजी दबाया है तो नियमित रूप से जांच करना। प्रत्येक 15 मिलीसेकंड में एक बार एक कार्यान्वयन कार्यान्वित होगा, इसलिए यह प्रत्येक ~ 20 मिलियन घड़ी चक्रों में से एक है। इस तरह का मतदान महान है, क्योंकि यह सिस्टम संसाधनों को बर्बाद नहीं करता है।

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

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

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