मुझे यह जानकर उत्सुकता है कि स्टैक और ढेर टकराते समय क्या होता है। अगर किसी को इसका सामना करना पड़ा है, तो कृपया वे परिदृश्य को समझा सकते हैं।क्या होता है जब ढेर और ढेर कोलाइड
अग्रिम धन्यवाद।
मुझे यह जानकर उत्सुकता है कि स्टैक और ढेर टकराते समय क्या होता है। अगर किसी को इसका सामना करना पड़ा है, तो कृपया वे परिदृश्य को समझा सकते हैं।क्या होता है जब ढेर और ढेर कोलाइड
अग्रिम धन्यवाद।
एक आधुनिक एक आधुनिक ओएस पर चलने भाषाओं में, आप या तो एक ढेर अतिप्रवाह (हुर्रे!) या जब आप ढेर विकसित करने के लिए कोशिश malloc()
या sbrk()
या mmap()
असफल हो जायेगी मिलेगा। लेकिन सभी सॉफ्टवेयर आधुनिक है, इसलिए की विफलता मोड पर ध्यान दें: ढेर ढेर में बढ़ता
हैं, तो आम तौर पर सी संकलक चुपचाप ढेर के डेटा संरचनाओं अधिलेखित करने के लिए शुरू कर देंगे। एक आधुनिक ओएस पर, एक या अधिक वर्चुअल मेमोरी गार्ड पेज होगी जो ढेर को अनिश्चित काल तक बढ़ने से रोकती है। जब तक गार्ड पृष्ठों में स्मृति की मात्रा कम से कम बढ़ती प्रक्रिया के सक्रियण रिकॉर्ड के आकार के रूप में बड़ी होती है, तो ओएस आपको एक सेगफॉल्ट की गारंटी देगा। यदि आप किसी भी एमएमयू के साथ मशीन पर चल रहे डॉस हैं, तो शायद आप शायद हो।
यदि ढेर ढेर में बढ़ता है, तो ऑपरेटिंग सिस्टम को हमेशा स्थिति के बारे में पता होना चाहिए और कुछ प्रकार की सिस्टम कॉल विफल हो जाएगी। malloc()
का कार्यान्वयन लगभग निश्चित रूप से विफलता को नोटिस करता है और NULL
देता है। इसके बाद क्या होता है आप पर निर्भर करता है।
मैं हमेशा आशा है कि ओएस जगह में गार्ड पृष्ठों डालता ढेर अतिप्रवाह को रोकने के लिए संकलक लेखकों की इच्छा पर चकित हूँ। बेशक, इस चाल अच्छी तरह से काम जब तक आप उन यह समय डॉ एगोन स्पेंग्लर के ऋषि शब्द को चालू करने के लिए है की तरह धागे के हजारों, अपने स्वयं के ढेर के साथ प्रत्येक ... समय में
यहां तक कि एक धागे के साथ, ज्ञात स्टैक-हीप टकराव प्राप्त करना संभव है: https://gcc.gnu.org/ml/gcc-help/2014-07/msg00076.html (हालांकि यह होने की संभावना नहीं है अभ्यास, शायद विशिष्ट हमलों के मामले में छोड़कर)। जीसीसी मैन पेज बहु-थ्रेडेड प्रोग्राम्स के साथ '-फस्टैक-चेक' ध्वज का उपयोग करने की सलाह देता है (और यह ध्वज भी मेरे उदाहरण में टकराव का पता लगाने की अनुमति देता है)। – vinc17
यदि आप भाग्यशाली हैं तो आपको मेमोरी अपवाद या स्टैक अपवाद से बाहर निकलना होगा। यदि आप दुर्भाग्यपूर्ण हैं तो प्रोग्राम अमान्य मेमोरी में बंद हो जाता है और या तो खराब स्मृति अपवाद फेंकता है। यदि आप बेहद दुर्भाग्यपूर्ण हैं तो प्रोग्राम कुछ ऐसा करता है और उसे दुर्घटनाग्रस्त करता है और आपको कभी नहीं पता कि आपका प्रोग्राम क्यों विफल रहा।
आखिरकार ब्रह्मांड क्रैक हो सकता है।
+1 एमएस-डॉस ब्रह्मांड क्रैक हो गया है, लेकिन हमने अभी तक उछाल नहीं देखा है – ATorras
ध्यान दें कि स्टैक ओवरफ़्लो सी ++ अपवाद नहीं हो सकता है। – AProgrammer
@atorras - एमएसडीओएस ब्रह्मांड तब तक क्रैक नहीं करेगा जब तक कि वे मेरे ठंडे मृत हाथों से कमांड का पुरस्कार नहीं देते :-) –
यह मंच निर्भर होगा। कई प्लेटफ़ॉर्म पर यह वास्तव में नहीं हो सकता है (ढेर और ढेर अलग-अलग पृष्ठों में आवंटित किए जाते हैं और दो बार मिलेंगे।
ध्यान रखें कि ढेर के ऊपर की ओर बढ़ने का विचार और नीचे की ओर बढ़ने वाला ढेर केवल वैचारिक है। बहुत छोटी प्रणालियों (जैसे पुराने 8-बिट माइक्रो जो सीपी/एम चलाते हैं) और कुछ पीआईसी और अन्य फ्लैट मेमोरी मॉडल सिस्टम (एमएमयू के बिना और न ही किसी अन्य वर्चुअल या संरक्षित मेमोरी सपोर्ट) पर ढेर और ढेर पर ढेर वास्तव में इस तरह से लागू किया जा सकता है। उस मामले में व्यवहार अपरिभाषित होगा ... लेकिन जैसे ही कोड दूषित स्टैक के शीर्ष पर कुछ पते पर लौटने की कोशिश करता है या एक से अप्रत्यक्ष सूचक का पालन करता है, एक दूसरे के ढेर का हिस्सा या ...
किसी भी घटना में आप किसी भी आधुनिक, सामान्य उद्देश्य वर्कस्टेशन या सर्वर पर इसे न देखें। आप संसाधन सीमा को हिट करेंगे और मॉलोक विफलताओं को प्राप्त करेंगे, या आप वर्चुअल मेमोरी में भाग लेंगे और आखिरकार सिस्टम "लाल स्विच हिट" के ढेर को घुमाएगा।
+1 हिलेरिटी और उपयोग के लिए, "दो बार दो।" –
करना शुरू ....
यदि स्टैक/हीप ओवरफ़्लो होता है तो आपको सेगमेंटेशन गलती या मेमोरी आवंटन त्रुटि मिल जाएगी। यहां एक उदाहरण दिया गया है:
void recursiveFun()
{
static int i;
// char *str= (char *)malloc (100);
printf ("%d\t", i++);
recursiveFun();
// free (str);
}
मान लीजिए, आप उपरोक्त फ़ंक्शन को कॉल करते हैं, यह स्टैक से बाहर हो जाएगा और प्रोग्राम क्रैश हो जाएगा। अब, टिप्पणी की गई पंक्तियों को हटाएं और फ़ंक्शन को दोबारा कॉल करें, आपको लगता है कि सेगमेंटेशन गलती कम समय में और पिछले संस्करण की तुलना में कम रिकर्सन में होती है। [अपने परीक्षण वातावरण में, स्टैक ओवरफ़्लो पहले मामले में 5,237,765 प्रत्यावर्तन के बाद, जबकि दूसरा परिदृश्य में यह 2,616,325 प्रत्यावर्तन के बाद हुई हुआ।]
मैं बहुत यकीन है कि यह होता है जब आप –
अंदर चोट नहीं रोक सकता खैर अगर हूँ स्टैक मेमोरी से बाहर और हीप मेमोरी से बाहर एक आउटऑफमेमरी अपवाद फेंक दिया जा सकता है? – CodingBarfield
मैं करीबी वोट (NaRQ) से असहमत हूं। वर्णित स्थिति * वास्तविक है, * आज भी छोटी प्रणालियों में महत्वपूर्ण है, * * बुरा है, और * समझने योग्य है। – dmckee