गंभीर वेकप्स स्पष्टीकरण एक बग की तरह लगता है जो सिर्फ फिक्सिंग के लायक नहीं है, क्या यह सही है?


30

Spurious Wakeups पर विकिपीडिया लेख के अनुसार

"एक धागा अपनी प्रतीक्षा अवस्था से जागृत हो सकता है, भले ही कोई धागा स्थिति चर का संकेत न दे"।

जब मैं इस 'फीचर' के बारे में जानता हूं तो मुझे कभी नहीं पता था कि वास्तव में इसके कारण क्या है, एक ही लेख में

"अजीब वेकअप अजीब लग सकता है, लेकिन कुछ मल्टीप्रोसेसर सिस्टम पर, हालत जगा पूरी तरह से अनुमान लगाने योग्य सभी हालत चर संचालन धीमा कर सकता है।"

एक बग की तरह लगता है जो सिर्फ फिक्सिंग के लायक नहीं है, क्या यह सही है?


1
संबंधित: "क्यों pthread_cond_wait में अजीब वेकअप हैं?", stackoverflow.com/questions/8594591/…
फ्लोरियन कैस्टेलन

जवाबों:


39

टीएल; डीआर असेंशन ("कॉन्ट्रैक्ट") स्प्यूरियस वेकअप थ्रेड शेड्यूलर के वास्तविक रूप से मजबूत कार्यान्वयन के लिए अनुमति देने के लिए किया गया एक समझदार वास्तु निर्णय है।

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

एसओ पर इस उत्तर में स्पूर्शियस वेकअप की अवधारणा को पेश करने के लिए बहुत अधिक सम्मोहक कारण प्रदान किया गया है जो कि बहुत ही लेख के (पुराने संस्करण) में प्रदान किए गए अतिरिक्त विवरणों पर आधारित है:

विचित्र लेखों पर विकिपीडिया लेख में यह tidbit है:

pthread_cond_wait()लिनक्स में समारोह का उपयोग कर कार्यान्वित किया जाता है futexसिस्टम कॉल। EINTRजब सिस्टम सिग्नल प्राप्त करता है, तो लिनक्स पर प्रत्येक ब्लॉकिंग सिस्टम कॉल अचानक लौटता है । ... pthread_cond_wait()प्रतीक्षा को पुनः आरंभ नहीं किया जा सकता है क्योंकि यह futexसिस्टम कॉल के बाहर होने पर थोड़े समय में एक वास्तविक वेकअप याद कर सकता है ...

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

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

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


थ्रेड परिप्रेक्ष्य से, यह कुछ हद तक एक पोस्टल कानून (उर्फ मजबूती सिद्धांत ) जैसा दिखता है ,

आप जो करते हैं उसमें रूढ़िवादी हो सकते हैं, जो आप दूसरों से स्वीकार करते हैं, उसमें उदार रहें

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


10
ऊग ... पोस्टेल का नियम ... यही कारण है कि HTML और सभी प्रकार की वेब तकनीकों में बहुत अधिक बकवास डाली गई है (उदाहरण के लिए खराब टैग नेस्टिंग की HTML स्वीकृति)। एक तरफ, अच्छा जवाब।
थॉमस एडिंग

3
पोस्टेल का नियम है कि कई कीड़े सालों तक बिना रुके चलते रहते हैं क्योंकि हे, भले ही आपका फ़ंक्शन गलत आउटपुट देता हो, फिर भी ऐप काम करने लगता है! सर्वश्रेष्ठ आविष्कार।
पचेरियर

2
@ स्पेसर: गलत आउटपुट देने वाला फ़ंक्शन पोस्टेल के नियम (रूढ़िवादी भाग) का पालन नहीं करता है।
यव्सगेरेई

@ स्पेसर: ओटीओएच, अन्य घटकों की सख्त मांग करने के लिए ताकि कीड़े को पहले पकड़ा जा सके, एक दिलचस्प स्थिति है, जो 'फेल फास्ट' सिद्धांत और 'कॉन्ट्रैक्ट आधारित' डिजाइन के पक्ष में है।
यवसगेरे

1

यह ठीक करने योग्य नहीं है क्योंकि दौड़ की स्थिति से निपटने के लिए कॉलर कोड को वैसे भी उसी उपचार (स्थिति की जांच) का उपयोग करना चाहिए।

दो मुद्दों के लिए एक उपचार, जिसे मैं निम्नलिखित द्वारा संक्षेप में प्रस्तुत करता हूं:

स्पुरियस वेकअप: वेटिंग थ्रेड अनुसूचित होने से पहले निर्धारित किया गया है।
जबरन निगरानी: प्रतीक्षा थ्रेड को शर्त के बाद फिर से निर्धारित किया गया है।

चूँकि बाद में हो सकता है, कुछ लोग जहाँ तक थे, अनुबंध में जगह बनाने की कोशिश कर रहे थे:

  • विधेय छोरों की आवश्यकता द्वारा अच्छी प्रथाओं को लागू करने के लिए।
  • शेड्यूलर कार्यान्वयन के लिए कुछ स्वतंत्रता देने के लिए (आपातकालीन वसूली विकल्प सहित, @gnat द्वारा बताया गया है)।

एसओ संदर्भ


मैं इसे +1 करना चाहता हूं, लेकिन इस विचार के लिए कि किसी ने जानबूझकर अजीबोगरीब वेकेशन शुरू किए हैं ताकि फोन करने वालों को मजबूर ओवरलोड्स को संबोधित करने के लिए विधेय लूप जोड़ने के लिए मिल सके। मुझे वह अटूट लगता है।
खंड

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