2009-08-26 21 views
48

मुझे यह जानकर उत्सुकता है कि स्टैक और ढेर टकराते समय क्या होता है। अगर किसी को इसका सामना करना पड़ा है, तो कृपया वे परिदृश्य को समझा सकते हैं।क्या होता है जब ढेर और ढेर कोलाइड

अग्रिम धन्यवाद।

+7

मैं बहुत यकीन है कि यह होता है जब आप –

+1

अंदर चोट नहीं रोक सकता खैर अगर हूँ स्टैक मेमोरी से बाहर और हीप मेमोरी से बाहर एक आउटऑफमेमरी अपवाद फेंक दिया जा सकता है? – CodingBarfield

+18

मैं करीबी वोट (NaRQ) से असहमत हूं। वर्णित स्थिति * वास्तविक है, * आज भी छोटी प्रणालियों में महत्वपूर्ण है, * * बुरा है, और * समझने योग्य है। – dmckee

उत्तर

56

एक आधुनिक एक आधुनिक ओएस पर चलने भाषाओं में, आप या तो एक ढेर अतिप्रवाह (हुर्रे!) या जब आप ढेर विकसित करने के लिए कोशिश malloc() या sbrk() या mmap() असफल हो जायेगी मिलेगा। लेकिन सभी सॉफ्टवेयर आधुनिक है, इसलिए की विफलता मोड पर ध्यान दें: ढेर ढेर में बढ़ता

  • हैं, तो आम तौर पर सी संकलक चुपचाप ढेर के डेटा संरचनाओं अधिलेखित करने के लिए शुरू कर देंगे। एक आधुनिक ओएस पर, एक या अधिक वर्चुअल मेमोरी गार्ड पेज होगी जो ढेर को अनिश्चित काल तक बढ़ने से रोकती है। जब तक गार्ड पृष्ठों में स्मृति की मात्रा कम से कम बढ़ती प्रक्रिया के सक्रियण रिकॉर्ड के आकार के रूप में बड़ी होती है, तो ओएस आपको एक सेगफॉल्ट की गारंटी देगा। यदि आप किसी भी एमएमयू के साथ मशीन पर चल रहे डॉस हैं, तो शायद आप शायद हो।

  • यदि ढेर ढेर में बढ़ता है, तो ऑपरेटिंग सिस्टम को हमेशा स्थिति के बारे में पता होना चाहिए और कुछ प्रकार की सिस्टम कॉल विफल हो जाएगी। malloc() का कार्यान्वयन लगभग निश्चित रूप से विफलता को नोटिस करता है और NULL देता है। इसके बाद क्या होता है आप पर निर्भर करता है।

मैं हमेशा आशा है कि ओएस जगह में गार्ड पृष्ठों डालता ढेर अतिप्रवाह को रोकने के लिए संकलक लेखकों की इच्छा पर चकित हूँ। बेशक, इस चाल अच्छी तरह से काम जब तक आप उन यह समय डॉ एगोन स्पेंग्लर के ऋषि शब्द को चालू करने के लिए है की तरह धागे के हजारों, अपने स्वयं के ढेर के साथ प्रत्येक ... समय में

+1

यहां तक ​​कि एक धागे के साथ, ज्ञात स्टैक-हीप टकराव प्राप्त करना संभव है: https://gcc.gnu.org/ml/gcc-help/2014-07/msg00076.html (हालांकि यह होने की संभावना नहीं है अभ्यास, शायद विशिष्ट हमलों के मामले में छोड़कर)। जीसीसी मैन पेज बहु-थ्रेडेड प्रोग्राम्स के साथ '-फस्टैक-चेक' ध्वज का उपयोग करने की सलाह देता है (और यह ध्वज भी मेरे उदाहरण में टकराव का पता लगाने की अनुमति देता है)। – vinc17

4

यदि आप भाग्यशाली हैं तो आपको मेमोरी अपवाद या स्टैक अपवाद से बाहर निकलना होगा। यदि आप दुर्भाग्यपूर्ण हैं तो प्रोग्राम अमान्य मेमोरी में बंद हो जाता है और या तो खराब स्मृति अपवाद फेंकता है। यदि आप बेहद दुर्भाग्यपूर्ण हैं तो प्रोग्राम कुछ ऐसा करता है और उसे दुर्घटनाग्रस्त करता है और आपको कभी नहीं पता कि आपका प्रोग्राम क्यों विफल रहा।

आखिरकार ब्रह्मांड क्रैक हो सकता है।

+1

+1 एमएस-डॉस ब्रह्मांड क्रैक हो गया है, लेकिन हमने अभी तक उछाल नहीं देखा है – ATorras

+1

ध्यान दें कि स्टैक ओवरफ़्लो सी ++ अपवाद नहीं हो सकता है। – AProgrammer

+0

@atorras - एमएसडीओएस ब्रह्मांड तब तक क्रैक नहीं करेगा जब तक कि वे मेरे ठंडे मृत हाथों से कमांड का पुरस्कार नहीं देते :-) –

42

यह मंच निर्भर होगा। कई प्लेटफ़ॉर्म पर यह वास्तव में नहीं हो सकता है (ढेर और ढेर अलग-अलग पृष्ठों में आवंटित किए जाते हैं और दो बार मिलेंगे।

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

किसी भी घटना में आप किसी भी आधुनिक, सामान्य उद्देश्य वर्कस्टेशन या सर्वर पर इसे न देखें। आप संसाधन सीमा को हिट करेंगे और मॉलोक विफलताओं को प्राप्त करेंगे, या आप वर्चुअल मेमोरी में भाग लेंगे और आखिरकार सिस्टम "लाल स्विच हिट" के ढेर को घुमाएगा।

+8

+1 हिलेरिटी और उपयोग के लिए, "दो बार दो।" –

11

करना शुरू ....

  • डॉ एगॉन स्पेंगलर: कुछ महत्वपूर्ण बात है जो मैं आपको बताना भूल गया।
  • डॉ।पीटर वेंकमन: क्या?
  • डॉ एगॉन स्पेंगलर: ढेर के साथ ढेर को टक्कर न दें।
  • डॉ पीटर वेंकमन: क्यों?
  • डॉ एगॉन स्पेंगलर: यह बुरा होगा।
  • डॉ पीटर वेंकमन: मैं यहां पूरी "अच्छी/बुरी" चीज़ पर थोड़ा अस्पष्ट हूं। आपका क्या मतलब है, "बुरा"?
  • डॉ एगॉन स्पेंगलर: सभी जीवन की कल्पना करने की कोशिश करें क्योंकि आप जानते हैं कि यह तत्काल बंद हो रहा है और आपके शरीर में हर अणु प्रकाश की गति से विस्फोट कर रहा है।
  • डॉ रे स्टैंटज़: कुल प्रोटोनिक रिवर्सल!
  • डॉ पीटर वेंकमन: यह बुरा है। ठीक है। ठीक है, महत्वपूर्ण सुरक्षा युक्ति। धन्यवाद, एगॉन।
+1

विचित्र रूप से पर्याप्त, मैं जिस वाक्यांश के बारे में सोच रहा था वह था "कुत्ते और बिल्लियों एक साथ रह रहे थे" – plinth

+0

महान चित्रण। उम्मीद है कि 'सार्वभौमिक -debug' इसकी सभी स्मृति को मुक्त करता है! – new123456

1

यदि स्टैक/हीप ओवरफ़्लो होता है तो आपको सेगमेंटेशन गलती या मेमोरी आवंटन त्रुटि मिल जाएगी। यहां एक उदाहरण दिया गया है:

void recursiveFun() 
{ 
    static int i; 
// char *str= (char *)malloc (100); 
    printf ("%d\t", i++); 
    recursiveFun(); 
// free (str); 
} 

मान लीजिए, आप उपरोक्त फ़ंक्शन को कॉल करते हैं, यह स्टैक से बाहर हो जाएगा और प्रोग्राम क्रैश हो जाएगा। अब, टिप्पणी की गई पंक्तियों को हटाएं और फ़ंक्शन को दोबारा कॉल करें, आपको लगता है कि सेगमेंटेशन गलती कम समय में और पिछले संस्करण की तुलना में कम रिकर्सन में होती है। [अपने परीक्षण वातावरण में, स्टैक ओवरफ़्लो पहले मामले में 5,237,765 प्रत्यावर्तन के बाद, जबकि दूसरा परिदृश्य में यह 2,616,325 प्रत्यावर्तन के बाद हुई हुआ।]

संबंधित मुद्दे