यदि मैं ताले का उपयोग करता हूं, तो क्या मेरा एल्गोरिथ्म अभी भी लॉक-मुक्त हो सकता है?


10

लॉक-फ़्री की एक आम परिभाषा यह है कि कम से कम एक प्रक्रिया प्रगति करती है। 1

अगर मेरे पास एक सरल डेटा संरचना है जैसे कि एक कतार, जिसे एक लॉक द्वारा संरक्षित किया जाता है, तो एक प्रक्रिया हमेशा प्रगति कर सकती है, क्योंकि एक प्रक्रिया लॉक को अधिग्रहित कर सकती है, जो वह चाहती है, और उसे जारी करें।

तो क्या यह लॉक-फ़्री की परिभाषा को पूरा करता है?


1 देखें। उदाहरण के लिए एम। हेरली, वी। लुचांग्को और एम। मोइर। बाधा-मुक्त सिंक्रनाइज़ेशन: उदाहरण के रूप में डबल-एंडेड कतार। डिस्ट्रीब्यूटेड कम्प्यूटिंग में, 2003. "यह लॉक-फ्री है अगर यह केवल यह सुनिश्चित करता है कि कुछ धागा हमेशा प्रगति करता है"।


3
मैं हमेशा एक डेटा संरचना और एल्गोरिदम के सेट का वर्णन करने के लिए "लॉक फ्री" समझ गया हूं जो ताले का उपयोग नहीं करता है, बस एट्रोफिक मेमोरी ऑपरेशन का एक छोटा परिभाषित सेट है। जैसे drdobbs.com/parallel/writing-lock-free-code-a-corrected-queue/…
पॉल जॉनसन

जवाबों:


16

यह लॉक-फ़्री के लिए कोई परिभाषा नहीं है।

यदि आप प्रगति की गारंटी दे सकते हैं तो आपके पास गतिरोध-मुक्त है , और यदि आपके पास हर अनुरोध को पूरा करना है, तो आपके पास भुखमरी से मुक्त है , लेकिन लॉक-फ़्री नहीं।

मैं सवाल करता हूं कि क्या आपका सरल उदाहरण वास्तव में यह प्रदान करता है। आपको लॉक पदानुक्रम की आवश्यकता होती है और इसी तरह कई ताले शामिल होने पर वास्तव में प्रगति की गारंटी देता है।


1
मैं एम। हर्लही की परिभाषा का उपयोग कर रहा हूं। अत्यधिक समवर्ती डेटा ऑब्जेक्ट को लागू करने के लिए एक पद्धति। 1993- भाषा और प्रणालियों के कार्यक्रम-लेन-देन पर लेन-देन, "लॉक-फ्री कंडीशन की गारंटी है कि कुछ प्रक्रिया हमेशा अन्य प्रक्रियाओं द्वारा मनमाने ढंग से रुकने या देरी के बावजूद प्रगति करेगी"
जो पेंशन

12
@ जो: यह एक परिभाषा नहीं है, यह एक निहितार्थ का वर्णन करता है। उलटा तर्क तर्क से सावधान रहें।
बेन वोइगट

2
एम। हेरालि, वी। लुचांग्को और एम। मोइर भी उद्धृत कर सकते हैं। बाधा-मुक्त सिंक्रनाइज़ेशन: उदाहरण के रूप में डबल-एंडेड कतार। डिस्ट्रीब्यूटेड कम्प्यूटिंग में, 2003. "यह लॉक-फ्री है अगर यह केवल यह सुनिश्चित करता है कि कुछ धागा हमेशा प्रगति करता है"।
जो पेंशन

1
वहाँ भी भुखमरी मुक्त है जो गतिरोध मुक्त की तुलना में अधिक विशिष्ट है (प्रत्येक प्रक्रिया को कोई फर्क नहीं पड़ता कि कोई अन्य प्रक्रिया क्या करती है) ध्यान दें कि सीएएस लूप (परमाणु आदिम पर आधारित) नहीं हैं
शाफ़्ट फ्रीक

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

11

मैंने द आर्ट ऑफ़ मल्टीप्रोसेसर प्रोग्रामिंग 1 का अध्ययन किया है और उनके पाठ में स्पष्टता का अभाव है, ठीक उसी तरह जैसे आप जिस पुस्तक का उल्लेख करते हैं। यहां TAMPP के कुछ उद्धरण दिए गए हैं:

उद्धरण 1 (लॉक-फ़्री की परिभाषा)

एक विधि लॉक-मुक्त है अगर यह गारंटी देता है कि असीम रूप से अक्सर कुछ विधि कॉल एक सीमित संख्या में चरणों में खत्म होती है।

Quote 2 (नॉनब्लॉकिंग की परिभाषा)

कुल विधि का एक लंबित आह्वान पूरा होने के लिए किसी अन्य लंबित आह्वान की प्रतीक्षा करने की आवश्यकता नहीं है।

Quote 3 (दावा है कि लॉक-फ्री नॉनब्लॉकिंग है)

प्रतीक्षा-मुक्त और लॉक-फ़्री नॉनब्लॉकिंग प्रगति की स्थिति गारंटी देती है कि समग्र रूप से गणना प्रगति करती है, स्वतंत्र रूप से सिस्टम शेड्यूल कैसे करता है।

समस्या यह है कि उद्धरण 3 में दावा स्पष्ट रूप से उद्धरण 1 में परिभाषा से पालन नहीं करता है। जैसा कि पहले ही उल्लेख किया गया है, एक समन्वित कतार उद्धरण 1 को संतुष्ट करने के लिए लगती है: असीम रूप से अक्सर कुछ विधि सफलतापूर्वक लॉक और पूर्ण का अधिग्रहण करेगी।

नोट 3 में विशेष रूप से काफी अस्पष्ट वाक्यांश नोट करें: "स्वतंत्र रूप से सिस्टम शेड्यूल कैसे करता है"। यह, "धागे की शेड्यूलिंग प्रणाली 'का औपचारिक वर्णन के किसी भी प्रकार से पहले नहीं कर रहा है तो हम परिभाषाओं क्या पर हमारे पूर्वाग्रहों के आधार पर उसके गुण फिर से संगठित करने छोड़ दिया जाता है चाहिए मतलब है:

  1. सिस्टम हमेशा कुछ थ्रेड के निर्देशों को निष्पादित करता है ;
  2. यह कभी भी किसी दिए गए धागे के निर्देशों को निष्पादित नहीं कर सकता है ;
  3. सभी सूत्र विचाराधीन विधि को लागू कर रहे हैं।

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

लॉक-फ़्री की सही परिभाषा

एक विधि लॉक-मुक्त है यदि यह गैर-अवरुद्ध है और, इसके अतिरिक्त, गारंटी देता है कि अक्सर असीम रूप से कुछ विधि कॉल चरणों की एक सीमित संख्या में समाप्त होती है।

1 मौरिस हेरलहि, नीर शाविट, द आर्ट ऑफ मल्टीप्रोसेसर प्रोग्रामिंग, एल्सेवियर, पीपी। 58-60।


1
बोली 1 का शब्दांकन वास्तव में अजीब है। उन्हें "असीम रूप से अक्सर" से क्या मतलब है? जाहिर है "हमेशा" की तुलना में कुछ अलग है, इसलिए यह ठीक है कि विधि "कुछ" मामलों में कभी वापस नहीं आती है?
हल्क

हाँ, भाषा के अतिक्रमण को रोकना। वैसे भी "अक्सर" क्या है? मुझे लगता है कि उनका मतलब है "अनंत निष्पादन इतिहास में, यह विशेष घटना अनंत बार होती है"।
मार्को टोपोलनिक

5

शब्दावली हमेशा संगत नहीं होती है, लेकिन मुझे लगता है कि प्रस्तावित एल्गोरिथम या सिस्टम के बारे में निम्नलिखित प्रश्न पूछना महत्वपूर्ण है:

  1. क्या उन घटनाओं का कोई क्रम है जहां धागे एक दूसरे के इंतजार में फंस सकते हैं, भले ही सभी थ्रेड्स सभी सीपीयू समय का उपयोग करने की अनुमति दें [यदि ऐसा है, तो यह गतिरोध मुक्त नहीं है]
  2. यदि एक थ्रेड को एक मनमाने ढंग से लंबे समय के लिए ब्लॉक किया गया था, तो अन्य थ्रेड या बिगड़ा सिस्टम ऑपरेशन को अनियंत्रित रूप से लंबे समय के लिए स्टाल कर सकता है [यदि ऐसा है, तो यह गैर-अवरुद्ध नहीं है]।
  3. क्या थ्रेड शेड्यूलिंग के कुछ कम से कम-सैद्धांतिक रूप से संभव संयोजन है जो सभी थ्रेड को एक ही संचालन को दोहराते हुए एक-दूसरे के काम को अमान्य कर सकता है, बिना किसी को प्रगति किए [अगर ऐसा है, तो यह लॉक-फ्री नहीं है]
  4. यदि कुछ थ्रेड्स को दूसरे के सापेक्ष सीपीयू समय पर्याप्त रूप से दिया जाता है, तो क्या वे बाद के धागे को इसके संचालन को अनिश्चित काल तक जारी रखने के लिए मजबूर कर सकते हैं [यदि ऐसा है, तो यह प्रतीक्षा-मुक्त नहीं है]।

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


यह मानक शब्दावली से अलग है: आपका 2. गैर-ब्लॉकिंग के मानक अर्थ को संदर्भित करता है जबकि 3. लॉक स्वतंत्रता को संदर्भित करता है।
मार्को टोपोलनिक 14

मैंने असंगत शब्दावली को देखा है, और मुझे "आधिकारिक" मानक का पता नहीं है। जो सबसे महत्वपूर्ण है वह यह है कि अलग-अलग गारंटियाँ हैं एक एल्गोरिथ्म की पेशकश करने में सक्षम हो सकता है, और एक एल्गोरिथ्म का उपयोग करना महत्वपूर्ण है जो आवेदन की आवश्यकताओं को पूरा करने के लिए पर्याप्त गारंटी प्रदान करता है। कई कागजात केवल ऊपर की कुछ गारंटियों को कवर करते हैं, लेकिन ऐसे मामले हैं जिनमें से प्रत्येक आवेदन की आवश्यकताओं को किसी अन्य गारंटी की तुलना में अधिक आसानी से संतुष्ट करने में सक्षम हो सकता है जो आवश्यकताओं को पूरा करेगा।
सुपरकैट

मुझे लगता है कि द आर्ट ऑफ़ मल्टीप्रोसेसर प्रोग्रामिंग में प्रस्तुत शब्दावली "मानक" है।
मार्को टोपोलनिक

@MarkoTopolnik: मैं पोस्ट को फिर से फिट करने के लिए संपादित करूँगा। क्या आपको नया संस्करण पसंद है?
सुपरकैट

शांत, बहुत अच्छा।
मार्को टोपोलनिक

4

आपको संदर्भ में उद्धृत "परिभाषा" को देखना होगा :

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

आप आपसी बहिष्करण के लिए ताले का उपयोग कर रहे हैं, इस प्रकार यह लॉक-मुक्त तकनीक नहीं है जिसके बारे में वे बात कर रहे हैं।


2

यदि मैं ताले का उपयोग करता हूं, तो क्या मेरा एल्गोरिथ्म अभी भी लॉक-मुक्त हो सकता है?

यह हो सकता है, लेकिन यह एल्गोरिथ्म पर निर्भर करता है।

अगर मेरे पास एक सरल डेटा संरचना है जैसे कि एक कतार, जिसे एक लॉक द्वारा संरक्षित किया जाता है, तो एक प्रक्रिया हमेशा प्रगति कर सकती है, क्योंकि एक प्रक्रिया लॉक को अधिग्रहित कर सकती है, जो वह चाहती है, और उसे जारी करें।

तो क्या यह लॉक-फ़्री की परिभाषा को पूरा करता है?

नोट प्रति से

यदि "ऐसा करना चाहता है" कदम में किसी अन्य ताले को प्राप्त करना शामिल नहीं है, और इसे एक सीमित समय में पूरा करने की गारंटी है, तो आपके एल्गोरिथ्म का यह विशेष हिस्सा गतिरोध मुक्त होगा।

हालांकि, अगर उन पूर्व शर्त से संतुष्ट नहीं हैं, तो कम से कम गतिरोध की संभावना है ...


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

1

आपके द्वारा दिया गया उदाहरण निम्न कारणों से लॉक-फ़्री नहीं है।

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

सामान्यतया, एल्गोरिदम जो ताले का उपयोग करते हैं, वे लॉक-फ़्री नहीं हैं।

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


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

@MarkoTopolnik आपकी टिप्पणी का कोई मतलब नहीं है। लॉक-फ्रीडम में बाधा-स्वतंत्रता शामिल है। कुछ भी जो लॉक-फ़्री है, बाधा-मुक्त होना चाहिए। और आपने जो परिभाषा दी है, वह थ्रेडिंग थ्रेड को बाहर नहीं करती है।
चारण

कृपया "सही होने" से "समझ बनाने" में अंतर करने का ध्यान रखें। मेरी टिप्पणी गलत है, जैसा कि मेरे बाद के उत्तर से देखा जा सकता है। लेकिन विकिपीडिया की परिभाषा भी गलत है या कम से कम अस्पष्ट है।
मार्को टोपोलनिक

@MarkoTopolnik चूंकि आप स्वीकार करते हैं कि आपकी टिप्पणी सही नहीं है, इसलिए आपको अन्य पाठकों को भ्रमित करने से बचने के लिए इसे हटा देना चाहिए। विकिपीडिया अक्सर गलत या अस्पष्ट है। आप की तरह इस तरह के रूप में शैक्षिक पेपर "लॉक-स्वतंत्रता" सूक्ष्म परिभाषाओं खोजना चाहिए cs.rochester.edu/~scott/papers/2006_PPoPP_synch_queues.pdf (खंड 2.1 में ताला मुक्त है की परिभाषा)
Chaoran

हां, लॉक-फ्रीडम की परिभाषा के एक हिस्से के रूप में नॉनब्लॉकिंग प्रॉपर्टी भी इसे करने का एक तरीका है। यह मेरे उत्तर के पहले संशोधन में कहा गया था।
मार्को टोपोलनिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.