दौड़ की स्थिति

From alpha
Jump to navigation Jump to search
एक तर्क सर्किट में दौड़ की स्थिति।यहां, t1 तथा t2 तर्क तत्वों के प्रसार देरी का प्रतिनिधित्व करते हैं।जब इनपुट मूल्य A निम्न से उच्च में परिवर्तन, सर्किट अवधि के एक छोटे स्पाइक को आउटपुट करता है (∆t1 + ∆t2) − ∆t2 = ∆t1

एक दौड़ की स्थिति या दौड़ का खतरा एक इलेक्ट्रानिक्स , सॉफ़्टवेयर , या अन्य प्रणाली की स्थिति है जहां व्यवस्था का मूल व्यवहार अन्य बेकाबू घटनाओं के अनुक्रम या समय पर अनुक्रमिक तर्क है।यह एक सॉफ्टवेयर बग बन जाता है जब एक या अधिक संभावित व्यवहार अवांछनीय होता है।

शब्द रेस कंडीशन पहले से ही 1954 तक उपयोग में था, उदाहरण के लिए डेविड ए। हफमैन के डॉक्टरेट थीसिस में अनुक्रमिक स्विचिंग सर्किट का संश्लेषण।[1] दौड़ की स्थिति विशेष रूप से लॉजिक गेट , थ्रेड (कम्प्यूटिंग), या वितरित कंप्यूटिंग सॉफ्टवेयर प्रोग्राम में हो सकती है।

इलेक्ट्रॉनिक्स में

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

उदाहरण के लिए, निम्नलिखित तर्क के साथ एक दो-इनपुट और गेट खिलाया:

एक तर्क संकेत एक इनपुट और इसके नकारात्मकता पर, (the एक नकार ात्मक है), सिद्धांत में एक अन्य इनपुट पर कभी भी एक सही मूल्य आउटपुट नहीं होता है: ।यदि, हालांकि, के मूल्य में परिवर्तन पहले की तुलना में दूसरे इनपुट पर प्रचार करने के लिए अधिक समय लें झूठे से सच में परिवर्तन तब एक संक्षिप्त अवधि होगी, जिसके दौरान दोनों इनपुट सत्य हैं, और इसलिए गेट का आउटपुट भी सही होगा।[2]


महत्वपूर्ण और गैर-महत्वपूर्ण रूप

एक महत्वपूर्ण दौड़ की स्थिति तब होती है जब वह क्रम जिसमें आंतरिक चर बदल जाते हैं, अंतिम स्थिति को निर्धारित करता है कि परिमित-राज्य मशीन समाप्त हो जाएगी।

एक गैर-महत्वपूर्ण दौड़ की स्थिति तब होती है जब वह क्रम जिसमें आंतरिक चर बदल जाते हैं, अंतिम स्थिति को निर्धारित नहीं करता है कि राज्य मशीन समाप्त हो जाएगी।

स्थिर, गतिशील और आवश्यक रूप

एक स्थिर दौड़ की स्थिति तब होती है जब एक संकेत और इसके पूरक संयुक्त होते हैं।

एक गतिशील दौड़ की स्थिति तब होती है जब यह केवल एक के इरादे से कई संक्रमणों में परिणाम होता है।वे फाटकों के बीच बातचीत के कारण हैं।इसे गेटिंग के दो से अधिक स्तरों का उपयोग करके समाप्त किया जा सकता है।

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

वर्कअराउंड

कर्णगू मैप्स जैसी डिजाइन तकनीक डिजाइनरों को समस्याओं का कारण बनने से पहले नस्ल की स्थिति को पहचानने और समाप्त करने के लिए प्रोत्साहित करती हैं।अक्सर तर्क अतिरेक को कुछ प्रकार की दौड़ को खत्म करने के लिए जोड़ा जा सकता है।

इन समस्याओं के साथ -साथ, कुछ तर्क तत्व मेटैस्टेबिलिटी (इलेक्ट्रॉनिक्स) में प्रवेश कर सकते हैं, जो सर्किट डिजाइनरों के लिए आगे की समस्याएं पैदा करते हैं।

सॉफ्टवेयर में

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

महत्वपूर्ण दौड़ की स्थिति अमान्य निष्पादन और सॉफ्टवेयर बग का कारण बनती है। महत्वपूर्ण दौड़ की स्थिति अक्सर तब होती है जब प्रक्रियाएं या धागे कुछ साझा अवस्था पर निर्भर करते हैं। साझा राज्यों पर संचालन महत्वपूर्ण वर्गों में किया जाता है जो आपसी बहिष्करण होना चाहिए। इस नियम का पालन करने में विफलता साझा राज्य को भ्रष्ट कर सकती है।

डेटा रेस एक प्रकार की दौड़ की स्थिति है। डेटा दौड़ विभिन्न औपचारिक स्मृति मॉडल के महत्वपूर्ण हिस्से हैं। C11 (C मानक संशोधन) और C ++ 11 मानकों में परिभाषित मेमोरी मॉडल निर्दिष्ट करता है कि डेटा रेस वाले C या C ++ प्रोग्राम में अपरिभाषित व्यवहार है।[3][4] एक दौड़ की स्थिति को पुन: पेश करना और डिबग करना मुश्किल हो सकता है क्योंकि अंतिम परिणाम nondeterministic एल्गोरिथ्म है और हस्तक्षेप करने वाले थ्रेड्स के बीच सापेक्ष समय पर निर्भर करता है।इसलिए इस प्रकृति की समस्याएं डीबग मोड में चलते समय गायब हो सकती हैं, अतिरिक्त लॉगिंग जोड़ सकते हैं, या डिबगर संलग्न कर सकते हैं।डिबगिंग के प्रयासों के दौरान इस तरह से गायब होने वाला एक बग अक्सर एक हाइजेनबग के रूप में संदर्भित किया जाता है।इसलिए सावधान सॉफ्टवेयर डिजाइन द्वारा दौड़ की स्थिति से बचना बेहतर है।

उदाहरण

मान लें कि दो थ्रेड प्रत्येक में एक वैश्विक पूर्णांक चर का मूल्य बढ़ाते हैं। 1. आदर्श रूप से, संचालन का निम्न अनुक्रम होगा:

Thread 1 Thread 2 Integer value
0
read value 0
increase value 0
write back 1
read value 1
increase value 1
write back 2

ऊपर दिखाए गए मामले में, अंतिम मूल्य 2 है, जैसा कि अपेक्षित था।हालांकि, यदि दो थ्रेड लॉकिंग या सिंक्रनाइज़ेशन के बिना एक साथ चलते हैं, तो ऑपरेशन का परिणाम गलत हो सकता है।नीचे संचालन का वैकल्पिक अनुक्रम इस परिदृश्य को प्रदर्शित करता है:

Thread 1 Thread 2 Integer value
0
read value 0
read value 0
increase value 0
increase value 0
write back 1
write back 1

इस मामले में, अंतिम मूल्य 2 के अपेक्षित परिणाम के बजाय 1 है। यह इसलिए होता है क्योंकि यहां वृद्धि के संचालन परस्पर अनन्य नहीं हैं।पारस्परिक रूप से अनन्य संचालन वे हैं जिन्हें कुछ संसाधन जैसे कि मेमोरी स्थान तक पहुंचते समय बाधित नहीं किया जा सकता है।

डेटा दौड़

सभी डेटा दौड़ को दौड़ की स्थिति के सबसेट के रूप में नहीं मानते हैं।[5] डेटा रेस की सटीक परिभाषा औपचारिक सहमति मॉडल का उपयोग किया जा रहा है, लेकिन आमतौर पर यह एक ऐसी स्थिति को संदर्भित करता है जहां एक थ्रेड में एक मेमोरी ऑपरेशन संभावित रूप से एक ही समय में एक मेमोरी स्थान तक पहुंचने का प्रयास कर सकता है जो दूसरे थ्रेड में एक मेमोरी ऑपरेशन है उस मेमोरी स्थान पर लिखना, एक संदर्भ में जहां यह खतरनाक है। इसका तात्पर्य यह है कि एक डेटा रेस एक दौड़ की स्थिति से अलग है क्योंकि डेटा दौड़ के बिना एक प्रोग्राम में भी समय के कारण नॉनडेटर्मिनिज़्म होना संभव है, उदाहरण के लिए, एक प्रोग्राम में जिसमें सभी मेमोरी एक्सेस केवल परमाणु संचालन का उपयोग करते हैं।

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

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

विशेष रूप से समवर्ती मॉडल में डेटा दौड़ की उदाहरण परिभाषाएँ

डेटा रेस की सटीक परिभाषा औपचारिक समवर्ती मॉडल में भिन्न होती है।यह मायने रखता है क्योंकि समवर्ती व्यवहार अक्सर गैर-सहज होता है और इसलिए औपचारिक तर्क कभी-कभी लागू होता है।

C ++ मानक, ड्राफ्ट N4296 (2014-11-19) में, डेटा रेस को धारा 1.10.23 (पृष्ठ 14) में निम्नानुसार परिभाषित करता है[6]

दो क्रियाएं संभावित रूप से समवर्ती हैं यदि

  • वे अलग -अलग थ्रेड्स द्वारा किए जाते हैं, या
  • वे अनियंत्रित हैं, और कम से कम एक सिग्नल हैंडलर द्वारा किया जाता है।

एक कार्यक्रम के निष्पादन में एक डेटा रेस होती है यदि इसमें दो संभावित समवर्ती परस्पर विरोधी क्रियाएं होती हैं, जिनमें से कम से कम एक परमाणु नहीं है, और न ही दूसरे से पहले होता है, नीचे वर्णित सिग्नल हैंडलर के लिए विशेष मामले को छोड़कर [छोड़ा गया]।इस तरह के किसी भी डेटा रेस के परिणामस्वरूप अपरिभाषित व्यवहार होता है।

सिग्नल हैंडलर से संबंधित इस परिभाषा के हिस्से C ++ के लिए आदर्श हैं और डेटा रेस की परिभाषाओं के विशिष्ट नहीं हैं।

कमजोर मेमोरी सिस्टम पर डेटा दौड़ का पता लगाने वाला पेपर[7] एक अलग परिभाषा प्रदान करता है:

दो मेमोरी ऑपरेशंस संघर्ष यदि वे एक ही स्थान तक पहुंचते हैं और उनमें से कम से कम एक राइट ऑपरेशन है ... दो मेमोरी ऑपरेशंस, एक्स और वाई, क्रमिक रूप से सुसंगत निष्पादन में एक दौड़ 〈x, y〉, IFF X और Y संघर्ष बनाते हैं, और उन्हें निष्पादन के HB1 संबंध द्वारा आदेश नहीं दिया जाता है। दौड़ 〈x, y〉, एक डेटा रेस है IFF कम से कम x या y का एक डेटा ऑपरेशन है।

यहां हमारे पास एक ही स्थान तक पहुंचने वाले दो मेमोरी ऑपरेशन हैं, जिनमें से एक राइट है।

HB1 संबंध कागज में कहीं और परिभाषित किया गया है, और एक विशिष्ट होने वाले संबंध का एक उदाहरण है; सहज रूप से, अगर हम यह साबित कर सकते हैं कि हम ऐसी स्थिति में हैं जहां एक मेमोरी ऑपरेशन एक्स को एक और मेमोरी ऑपरेशन वाई शुरू होने से पहले पूरा करने के लिए निष्पादित किया जाता है, तो हम कहते हैं कि एक्स होता है- पहले y। यदि न तो x होता है और न ही y और y होता है, तो पहले X होता है, तो हम कहते हैं कि X और y को HB1 संबंध द्वारा आदेश नहीं दिया जाता है। इसलिए, क्लॉज ... और उन्हें निष्पादन के HB1 संबंध द्वारा आदेश नहीं दिया जाता है, इसे सहज रूप से अनुवादित किया जा सकता है ... और x और y संभावित रूप से समवर्ती हैं।

पेपर केवल उन स्थितियों को खतरनाक मानता है जिनमें कम से कम एक मेमोरी ऑपरेशन में से एक डेटा ऑपरेशन है; इस पत्र के अन्य भागों में, कागज सिंक्रनाइज़ेशन संचालन के एक वर्ग को भी परिभाषित करता है जो डेटा संचालन के विपरीत संभावित रूप से एक साथ उपयोग के लिए सुरक्षित हैं।

जावा भाषा विनिर्देश[8] एक अलग परिभाषा प्रदान करता है:

दो एक्सेस टू (पढ़ते हैं या लिखते हैं) एक ही चर को परस्पर विरोधी कहा जाता है यदि कम से कम एक एक्सेस एक राइट है ... जब किसी कार्यक्रम में दो परस्पर विरोधी एक्सेस होते हैं (.417.4.1) जो नहीं हैं।एक होने से पहले रिश्ते द्वारा आदेश दिया गया है, यह एक डेटा दौड़ में शामिल है ... एक डेटा रेस गलत व्यवहार का कारण नहीं बन सकती है जैसे कि एक सरणी के लिए गलत लंबाई वापस करना।

C ++ दृष्टिकोण और जावा दृष्टिकोण के बीच एक महत्वपूर्ण अंतर यह है कि C ++ में, एक डेटा रेस अपरिभाषित व्यवहार है, जबकि जावा में, एक डेटा दौड़ केवल अंतर-थ्रेड क्रियाओं को प्रभावित करती है।[8]इसका मतलब यह है कि C ++ में, डेटा रेस वाले एक प्रोग्राम को निष्पादित करने का प्रयास (जबकि अभी भी कल्पना का पालन करते हुए) दुर्घटनाग्रस्त हो सकता है या असुरक्षित या विचित्र व्यवहार का प्रदर्शन कर सकता है, जबकि जावा में, डेटा रेस वाले प्रोग्राम को निष्पादित करने का प्रयास कर सकता है।अवांछित समवर्ती व्यवहार लेकिन अन्यथा (यह मानते हुए कि कार्यान्वयन कल्पना का पालन करता है) सुरक्षित है।

SC DRF के लिए

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

उदाहरण के लिए, जावा में, यह गारंटी सीधे निर्दिष्ट है:[8]

एक कार्यक्रम को सही ढंग से सिंक्रनाइज़ किया जाता है यदि और केवल अगर सभी क्रमिक रूप से सुसंगत निष्पादन डेटा दौड़ से मुक्त हैं।

यदि किसी कार्यक्रम को सही ढंग से सिंक्रनाइज़ किया जाता है, तो कार्यक्रम के सभी निष्पादन क्रमिक रूप से सुसंगत दिखाई देंगे (.417.4.3)।

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

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

इसके विपरीत, एक ड्राफ्ट C ++ विनिर्देश सीधे DRF संपत्ति के लिए SC की आवश्यकता नहीं होती है, लेकिन केवल यह देखता है कि वहाँ एक प्रमेय मौजूद है जो इसे प्रदान करता है:

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

ध्यान दें कि C ++ ड्राफ्ट विनिर्देश उन कार्यक्रमों की संभावना को स्वीकार करता है जो मान्य हैं, लेकिन Memory_order_seq_cst के अलावा एक मेमोरी_ऑर्डर के साथ सिंक्रनाइज़ेशन ऑपरेशन का उपयोग करते हैं, जिस स्थिति में परिणाम एक प्रोग्राम हो सकता है जो सही है लेकिन जिसके लिए क्रमिक रूप से स्थिरता की कोई गारंटी नहीं दी गई है। दूसरे शब्दों में, C ++ में, कुछ सही कार्यक्रम क्रमिक रूप से सुसंगत नहीं हैं। यह दृष्टिकोण C ++ प्रोग्रामर को अपने कार्यक्रम के बारे में तर्क देने में आसानी देने की लागत पर तेजी से कार्यक्रम निष्पादन का चयन करने की स्वतंत्रता देने के लिए माना जाता है।[9]

विभिन्न प्रमेय होते हैं, जो अक्सर मेमोरी मॉडल के रूप में प्रदान किए जाते हैं, जो विभिन्न संदर्भों को दिए गए डीआरएफ गारंटी के लिए एससी प्रदान करते हैं।इन प्रमेयों का परिसर आम तौर पर मेमोरी मॉडल (और इसलिए कार्यान्वयन पर), और प्रोग्रामर पर भी बाधाओं को रखता है;यह कहना है, आमतौर पर यह मामला है कि ऐसे कार्यक्रम हैं जो प्रमेय के परिसर को पूरा नहीं करते हैं और जिन्हें क्रमिक रूप से सुसंगत तरीके से निष्पादित करने की गारंटी नहीं दी जा सकती है।

DRF1 मेमोरी मॉडल[10] DRF के लिए SC प्रदान करता है और WO (कमजोर ऑर्डरिंग), RCSC (क्रमिक रूप से सुसंगत विशेष संचालन के साथ निरंतरता), वैक्स मेमोरी मॉडल और डेटा-रेस-फ्री -0 मेमोरी मॉडल के अनुकूलन की अनुमति देता है।पीएलपीसी मेमोरी मॉडल[11] DRF के लिए SC प्रदान करता है और TSO (कुल भंडार आदेश ), PSO, PSO (प्रोसेसर संगति), और RCPC (प्रोसेसर संगति विशेष संचालन के साथ रिलीज स्थिरता) मॉडल के अनुकूलन की अनुमति देता है।DRFRLX[12] आराम से परमाणु की उपस्थिति में DRF प्रमेय के लिए एक SC का एक स्केच प्रदान करता है।

कंप्यूटर सुरक्षा

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

दौड़ की स्थिति का उपयोग जानबूझकर हार्डवेयर यादृच्छिक संख्या जनरेटर और शारीरिक रूप से अस्पष्ट कार्यों को बनाने के लिए किया जाता है।[16][citation needed] PUFs को एक नोड के समान पथों के साथ सर्किट टोपोलॉजी डिजाइन करके बनाया जा सकता है और विनिर्माण विविधताओं पर भरोसा करने के लिए बेतरतीब ढंग से यह निर्धारित करने के लिए कि कौन से पथ पहले पूरा करेंगे।प्रत्येक निर्मित सर्किट के दौड़ स्थिति के परिणामों के विशिष्ट सेट को मापने से, प्रत्येक सर्किट के लिए एक प्रोफ़ाइल एकत्र किया जा सकता है और बाद में एक सर्किट की पहचान को सत्यापित करने के लिए गुप्त रखा जा सकता है।

फ़ाइल सिस्टम

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

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

नेटवर्किंग

नेटवर्किंग में, आज्ञा जैसे वितरित चैट नेटवर्क पर विचार करें, जहां एक उपयोगकर्ता जो एक चैनल शुरू करता है, स्वचालित रूप से चैनल-ऑपरेटर विशेषाधिकार प्राप्त करता है। यदि एक ही नेटवर्क के अलग-अलग छोरों पर, अलग-अलग सर्वर पर दो उपयोगकर्ता, एक ही समय में एक ही नाम वाले चैनल को शुरू करने का प्रयास करें, तो प्रत्येक उपयोगकर्ता का संबंधित सर्वर प्रत्येक उपयोगकर्ता को चैनल-ऑपरेटर विशेषाधिकार प्रदान करेगा, क्योंकि न तो सर्वर ने अभी तक प्राप्त किया होगा। अन्य सर्वर का संकेत है कि उसने उस चैनल को आवंटित किया है। (यह समस्या काफी हद तक इंटरनेट रिले चैट#दुरुपयोग की रोकथाम विभिन्न आईआरसी सर्वर कार्यान्वयन द्वारा की गई है।)

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

दौड़ की स्थिति तब भी मौजूद हो सकती है जब एक कंप्यूटर प्रोग्राम बर्कले सॉकेट के साथ लिखा जाता है#ब्लॉकिंग बनाम नॉन-ब्लोकिंग मोड | गैर-ब्लॉकिंग सॉकेट, जिस स्थिति में कार्यक्रम का प्रदर्शन नेटवर्क लिंक की गति पर निर्भर हो सकता है।

जीवन-आलोचनात्मक प्रणाली

जीवन-महत्वपूर्ण प्रणालियों में सॉफ्टवेयर की खामियां विनाशकारी हो सकती हैं।Therac-25 विकिरण थेरेपी मशीन में दौड़ की स्थिति खामियों में से थी, जिसके कारण कम से कम तीन रोगियों की मृत्यु हो गई और कई और चोटें आईं।[17] एक अन्य उदाहरण जीई ऊर्जा द्वारा प्रदान की जाने वाली ऊर्जा प्रबंधन प्रणाली है और इसका उपयोग ओहियो -आधारित FirstEnergy Corp (अन्य बिजली सुविधाओं के बीच) द्वारा किया जाता है।अलार्म सबसिस्टम में एक दौड़ की स्थिति मौजूद थी;जब तीन सैगिंग पावर लाइनों को एक साथ ट्रिप किया गया था, तो स्थिति ने अलर्ट को निगरानी तकनीशियनों को उठाए जाने से रोक दिया, जिससे समस्या के बारे में उनकी जागरूकता में देरी हुई।इस सॉफ्टवेयर फ्लॉ ने अंततः 2003 के उत्तरी अमेरिका ब्लैकआउट का नेतृत्व किया।[18] जीई एनर्जी ने बाद में पहले से अनदेखे त्रुटि को ठीक करने के लिए एक सॉफ्टवेयर पैच विकसित किया।

उपकरण

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

थ्रेड सेफ्टी एनालिसिस एनोटेशन-आधारित इंट्रा-प्रोसेडुरल स्टेटिक एनालिसिस के लिए एक स्टेटिक एनालिसिस टूल है, जिसे मूल रूप से जीसीसी की एक शाखा के रूप में लागू किया गया है, और अब बजना में फिर से तैयार किया गया है, जो Pthreads का समर्थन करता है।[19][non-primary source needed] गतिशील विश्लेषण उपकरण में शामिल हैं:

  • इंटेल निरीक्षक , एक मेमोरी और थ्रेड चेकिंग और डिबगिंग टूल को सी/सी ++ और फोरट्रान एप्लिकेशन की विश्वसनीयता, सुरक्षा और सटीकता बढ़ाने के लिए;Intel सलाहकार, एक नमूना आधारित, SIMD वेक्टरकरण अनुकूलन और C, C ++, C#, और Fortran सॉफ्टवेयर डेवलपर्स और आर्किटेक्ट्स के लिए साझा मेमोरी थ्रेडिंग सहायता उपकरण;
  • थ्रेडसिटाइज़र, जो बाइनरी (चुनावी रिग -आधारित) या स्रोत, LLVM -आधारित इंस्ट्रूमेंटेशन का उपयोग करता है, और pthreads का समर्थन करता है);[20][non-primary source needed] और हेलग्रिंड, C, C ++ और Fortran कार्यक्रमों में सिंक्रनाइज़ेशन त्रुटियों का पता लगाने के लिए एक Valgrind टूल जो POSIX Pthreads थ्रेडिंग प्राइमिटिव्स का उपयोग करता है।[21][non-primary source needed]
  • डेटा रेस डिटेक्टर[22] GO प्रोग्रामिंग भाषा में डेटा दौड़ खोजने के लिए डिज़ाइन किया गया है।

डेटा रेस डिटेक्शन टूल की प्रभावशीलता का मूल्यांकन करने के लिए कई बेंचमार्क डिज़ाइन किए गए हैं

  • DataRacebench[23] एक बेंचमार्क सूट है जिसे व्यवस्थित रूप से और मात्रात्मक रूप से डेटा रेस डिटेक्शन टूल का मूल्यांकन करने के लिए डिज़ाइन किया गया है जो OpenMP में लिखे गए बहु-थ्रेडेड एप्लिकेशन का विश्लेषण करता है।

अन्य क्षेत्रों में

न्यूरोसाइंस यह प्रदर्शित कर रहा है कि नस्ल की स्थिति स्तनपायी दिमाग में भी हो सकती है।[24][25] यूके रेलवे सिग्नलिंग में, नियम 55 से बाहर ले जाने में एक दौड़ की स्थिति उत्पन्न होगी। इस नियम के अनुसार, यदि एक ट्रेन को सिग्नल द्वारा रनिंग लाइन पर रोक दिया गया था,सिग्नलमैन कि ट्रेन मौजूद थी।कम से कम एक मामले में, 1934 में winwick_rail_crash पर, एक दुर्घटना हुई क्योंकि सिग्नलमैन ने फायरमैन के आने से पहले एक और ट्रेन स्वीकार कर ली।आधुनिक सिग्नलिंग अभ्यास ड्राइवर के लिए रेडियो द्वारा सिग्नल बॉक्स से तुरंत संपर्क करने के लिए ड्राइवर के लिए संभव बनाकर दौड़ की स्थिति को हटा देता है।

यह भी देखें

संदर्भ

  1. Huffman, David A. "The synthesis of sequential switching circuits." (1954).
  2. Unger, S.H. (June 1995). "Hazards, Critical Races, and Metastability". IEEE Transactions on Computers. 44 (6): 754–768. doi:10.1109/12.391185.
  3. "ISO/IEC 9899:2011 - Information technology - Programming languages - C". Iso.org. Retrieved 2018-01-30.
  4. "ISO/IEC 14882:2011". ISO. 2 September 2011. Retrieved 3 September 2011.
  5. Regehr, John (2011-03-13). "Race Condition vs. Data Race". Embedded in Academia.
  6. "Working Draft, Standard for Programming Language C++" (PDF). 2014-11-19.
  7. Adve, Sarita & Hill, Mark & Miller, Barton & H. B. Netzer, Robert. (1991). Detecting Data Races on Weak Memory Systems. ACM SIGARCH Computer Architecture News. 19. 234-243. 10.1109/ISCA.1991.1021616.
  8. 8.0 8.1 8.2 "Chapter 17. Threads and Locks". docs.oracle.com.
  9. 9.0 9.1 Adve, Sarita V.; Boehm, Hans-J. (2010). "Semantics of Shared Variables & Synchronization (a.k.a. Memory Models)" (PDF).
  10. Adve, Sarita (December 1993). Designing Memory Consistency Models For Shared-Memory Multiprocessors (PDF) (PhD thesis). Archived (PDF) from the original on 2021-12-09. Retrieved 2021-12-09.
  11. Kourosh Gharachorloo and Sarita V. Adve and Anoop Gupta and John L. Hennessy and Mark D. Hill, Programming for Different Memory Consistency Models, JOURNAL OF PARALLEL AND DISTRIBUTED COMPUTING, 1992, volume 15, page 399--407
  12. Sinclair, Matthew David (2017). "Chapter 3: Efficient Support for and Evaluation of Relaxed Atomics" (PDF). Efficient Coherence and Consistency for Specialized Memory Hierarchies (PhD). University of Illinois at Urbana-Champaign.
  13. "CVE-2015-8461: A race condition when handling socket errors can lead to an assertion failure in resolver.c". Internet Systems Consortium. Retrieved 5 June 2017.
  14. 14.0 14.1 "Vulnerability in rmtree() and remove_tree(): CVE-2017-6512". CPAN. Retrieved 5 June 2017.
  15. "security: stat cache *very large* race condition if caching when follow_symlink disabled". lighttpd. Retrieved 5 June 2017.
  16. Colesa, Adrian; Tudoran, Radu; Banescu, Sebastian (2008). "Software Random Number Generation Based on Race Conditions". 2008 10th International Symposium on Symbolic and Numeric Algorithms for Scientific Computing: 439–444. doi:10.1109/synasc.2008.36. ISBN 978-0-7695-3523-4. S2CID 1586029.
  17. Leveson, Nancy; Turner, Clark S. "An Investigation of Therac-25 Accidents – I". Courses.cs.vt.edu. Archived from the original on 2017-12-15.
  18. Poulsen, Kevin (2004-04-07). "Tracking the blackout bug". SecurityFocus. Retrieved 2011-09-19.
  19. "Thread Safety Analysis – Clang 10 documentation". clang.llvm.org.
  20. "ThreadSanitizer – Clang 10 documentation". clang.llvm.org.
  21. "Helgrind: a thread error detector". Valgrind.
  22. "Data Race Detector". Golang.
  23. "Data race benchmark suite". July 25, 2019 – via GitHub.
  24. "How Brains Race to Cancel Errant Movements". Neuroskeptic. Discover Magazine. 2013-08-03.
  25. Schmidt, Robert; Leventhal, Daniel K; Mallet, Nicolas; Chen, Fujun; Berke, Joshua D (2013). "Canceling actions involves a race between basal ganglia pathways". Nature Neuroscience. 16 (8): 1118–24. doi:10.1038/nn.3456. PMC 3733500. PMID 23852117.


इस पृष्ठ में गुम आंतरिक लिंक की सूची

  • प्रचार देरी
  • वितरित अभिकलन
  • धागा (कम्प्यूटिंग)
  • घड़ी संकेत
  • परिमित अवस्था मशीन
  • कर्नोघ मैप
  • आपसी बहिष्कार
  • सी 11 (सी मानक संशोधन)
  • सी ++ 11
  • महत्वपूर्ण अनुभाग
  • नॉनडेटर्मिनिस्टिक एल्गोरिथ्म
  • फटा हुआ लिखना
  • आईएफएफ
  • विमोचन स्थिरता
  • प्रोसेसर स्थिरता
  • सर्विस अटैक से इनकार
  • समय-समय पर समय-समय पर उपयोग
  • शारीरिक रूप से अप्राप्य कार्य
  • डेमन (कम्प्यूटिंग)
  • जीवन-आलोचना प्रणाली
  • विकिरण उपचार
  • 2003 उत्तरी अमेरिका ब्लैकआउट
  • स्थैतिक कार्यक्रम विश्लेषण
  • इंटेल सलाहकार
  • नियम ५५
  • समकालीकरण
  • रेखीयता

बाहरी संबंध

]