क्या एक रनटाइम वातावरण एक अनंत लूप का पता लगा सकता है?


19

क्या एक अनौपचारिक समय के लिए अनंत छोरों का पता लगाना और बाद में संबंधित प्रक्रिया को रोकना संभव होगा, या इस तरह के तर्क को लागू करना हॉल्टिंग समस्या को हल करने के बराबर होगा?

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

( Https://stackoverflow.com/q/16250472/1858225 से पोर्ट किया गया )



मुझे ऐसा नहीं लगता; इनपुट पर कोई अड़चन नहीं हैं।
काइल स्ट्रैंड

क्या आपका सवाल वास्तविक रनटाइम वातावरण (जेवीएम की तरह), या ऐसे लूप का पता लगाने के प्रोग्रामेटिक-जेनेरिक तरीके के बारे में है?
बेंज

@Benj stackoverflow.com/q/16249785/1858225 मूल प्रश्न (जो मेरा नहीं था) वास्तविक रनटाइम वातावरण (या बल्कि, OSes के बारे में) था। हालांकि, यह बंद हो गया, इसलिए मैंने इसे फिर से लिखा, मैंने फोकस को सैद्धांतिक पक्ष में स्थानांतरित कर दिया।
काइल स्ट्रैंड

ठीक। जिस तरह से मैं इसे देखता हूं वह कुछ कीपॉइंट्स को सैंपल करता है और उनमें से एक हैश बनाता है (यह लॉग आउटपुट की आखिरी लाइनें हो सकती है, या कुछ सीपीयू स्टेट जैसे कि स्टैक ptr) और प्रोब के सेट की हैश को स्टोर कर सकता है (एक सेट एक निश्चित समय में) एक मार्कोव श्रृंखला में। फिर, आप चक्रीय ताले का पता लगाने के लिए (सही "जांच" चुनकर) सक्षम होंगे। मैं सिस्टम पुस्तकालयों तक पहुँचने और उनकी प्रविष्टियों को जांच के रूप में उपयोग करने के बारे में सोच रहा हूँ। आनंद लें;)
बेंज

जवाबों:


11

निम्न प्रक्रिया का उपयोग करके ऐसे छोरों की जांच करना एक रनटाइम वातावरण के लिए सैद्धांतिक रूप से संभव हो सकता है :

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

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

ध्यान दें, निश्चित रूप से, यह हॉल्टिंग समस्या का समाधान नहीं है; भेद की चर्चा यहाँ की गई है

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

इसलिए, मुझे संदेह है कि इस तरह के एक रनटाइम वातावरण मौजूद है या यह कभी भी मौजूद होगा, जब तक कि कोई इसे सिर्फ किक के लिए प्रोग्राम नहीं करता है। (जिसे मैं अब कुछ करने के लिए लुभा रहा हूं।)


8
यह संभव है (कम से कम ट्यूरिंग मशीनों की आदर्श दुनिया में और इस तरह) कि एक कार्यक्रम एक राज्य को दोहराए बिना अनंत लूप में प्रवेश करता है । C लूप की तरह कुछ सोचेंfor(i = 0; ; i++) ;
vonbrand

nn<nn+1

@vonbrand, वह विशेष लूप इस विशेष प्रश्न के उद्देश्य के लिए "लूप" की मेरी परिभाषा के अनुकूल नहीं है (यही कारण है कि मैंने अपनी परिभाषा को प्रश्न में ही स्पष्ट कर दिया है)।
काइल स्ट्रैंड

n

शायद मैं आपके सवाल को समझ नहीं पाया। मुझे लगा कि आप जानना चाहते हैं कि क्या यह तय करना संभव था कि कोई कार्यक्रम राज्य को दोहराता है या नहीं । क्या आप सिर्फ यह पूछ रहे थे कि क्या यह तय करना संभव है कि क्या कुछ कार्यक्रम राज्य को दोहराते हैं?
हुक बेनेट

6

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

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

तो चलिए करते हैं। हम इसे एक बार कछुआ रनटाइम में चलाएंगे, और साथ ही हम इसे हरे रनटाइम में चलाएंगे। हालांकि, हम हरे रनटाइम के लिए ठीक दो बार तेजी से काम करने की व्यवस्था करेंगे; हर बार कछुआ रनटाइम एक कदम बनाता है, हरे रनटाइम दो चरण बनाता है।

nपीnnपी

परीक्षण की कुल लागत एक अतिरिक्त राज्य और प्रति चरण एक राज्य की तुलना है, और यह प्रोग्राम के लिए अपने पहले लूप को पूरा करने के लिए उठाए जाने वाले कदमों की संख्या के तीन गुना से अधिक में समाप्त हो जाएगा। (एक बार कछुआ और दो बार हरे में, कुल तीन बार।)

जैसा कि मैंने शब्दों का इस्तेमाल किया था, यह सिर्फ रॉबर्ट फ्लोयड का प्रसिद्ध कछुआ और हरे चक्र का पता लगाने वाला एल्गोरिथम है।


3

जिस तरह मैं फ्लॉयड की साइकिल-डिटेक्शन एल्गोरिदम का सुझाव देने जा रहा था, रिसी के पोस्ट ने मुझे हरा दिया। हालाँकि, पूरे राज्यों की तुलना में तेजी लाकर पूरी बात को और अधिक व्यावहारिक बनाया जा सकता है।

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

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

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

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


2

Aprove समाप्ति उपकरण प्रदर्शन पुनर्लेखन सिस्टम (हास्केल कार्यक्रमों की एक उपवर्ग सहित) जो कर सकते हैं पर स्थिर विश्लेषण साबित गैर समाप्ति, गैर समाप्त कार्यक्रम का एक वास्तविक उदाहरण दे रही है। तकनीक काफी शक्तिशाली है और संकीर्णता नामक तकनीक के एक संस्करण का उपयोग करके काम करती है ।

जहां तक ​​मुझे पता है, हालांकि, सामान्य भाषाओं के लिए वास्तविक गैर-समाप्ति का पता लगाने पर बहुत काम नहीं हुआ है।

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