2011-03-25 13 views
23

मुझे पता है कि जब मैं लिनक्स में exec() सिस्टम कॉल में से एक को कॉल करता हूं तो यह वर्तमान में चल रही प्रक्रिया को एक नई छवि के साथ बदल देगा। तो जब मैंने एक नई प्रक्रिया का फोर्क किया और exec() चलाया, तो बच्चे को नई प्रक्रिया के साथ बदल दिया जाएगा।निष्पादन के बाद malloced स्मृति के साथ क्या होता है() प्रोग्राम छवि को बदलता है?

ढेर से आवंटित किसी भी स्मृति के साथ क्या होता है? मान लें कि मैं आज्ञाओं की मनमानी संख्या को पार्स करना चाहता हूं और इसे exec() में भेजना चाहता हूं। इस मनमानी संख्या को पकड़ने के लिए, मुझे शायद किसी बिंदु पर स्मृति आवंटित करना होगा क्योंकि मुझे नहीं लगता कि मैं इसे स्थिर आकार के सरणी के साथ सही तरीके से कर सकता हूं, इसलिए मैं malloc() या कुछ समकक्ष का उपयोग करूंगा।

मुझे exec() कहने के बाद तक इस स्मृति को आवंटित रखने की आवश्यकता है, लेकिन exec() कभी वापस नहीं आती है।

क्या स्मृति ऑपरेटिंग सिस्टम द्वारा पुनः प्राप्त की जाती है?

+0

बीटीडब्ल्यू यहां एक बहुत ही समान प्रश्न हैं http://stackoverflow.com/questions/3617332/what-happens-with-memory-usage-after-exec – sharptooth

उत्तर

18

जब आप fork() पर कॉल करते हैं, तो कॉलिंग प्रक्रिया की एक प्रति बनाई जाती है। यह बच्चा प्रक्रिया (लगभग) माता-पिता के समान ही है, यानी malloc() द्वारा आवंटित स्मृति संरक्षित है और आप इसे पढ़ने या संशोधित करने के लिए स्वतंत्र हैं। संशोधन माता-पिता की प्रक्रिया के लिए दृश्यमान नहीं होंगे, हालांकि, माता-पिता और बाल प्रक्रियाएं पूरी तरह अलग हैं।

जब आप बच्चे में exec() पर कॉल करते हैं, तो बच्चे की प्रक्रिया को एक नई प्रक्रिया द्वारा प्रतिस्थापित किया जाता है। execve (2) से:

execve() does not return on success, and the text, data, bss, and stack 
of the calling process are overwritten by that of the program loaded. 

data खंड अधिलेखित करके, exec() कॉल को प्रभावी ढंग से याद है कि पहले malloc() द्वारा आवंटित किया गया था reclaims।

माता-पिता की प्रक्रिया इस सब से अप्रभावित है। यह मानते हुए कि आपने fork() पर कॉल करने से पहले माता-पिता को मूल प्रक्रिया में आवंटित किया है, स्मृति अभी भी मूल प्रक्रिया में उपलब्ध है।

संपादित करें: malloc() के आधुनिक कार्यान्वयन अज्ञात मेमोरी मैपिंग का उपयोग करें, mmap (2) देखें। निष्पादन (2) के अनुसार, मेमोरी मैपिंग exec() कॉल पर संरक्षित नहीं हैं, इसलिए इस मेमोरी को पुनः दावा भी किया जाता है।

+0

यह स्पष्ट नहीं करता है कि ढेर के साथ क्या होता है। ठीक है, डेटा सेगमेंट ओवरराइट किया गया है, लेकिन इसका मतलब है कि ढेर दूषित हो जाता है, रीसेट नहीं होता है। – sharptooth

+0

हीप डेटा सेगमेंट है। एक सरल कार्यान्वयन में, 'malloc() 'डेटा सेगमेंट बढ़ाने और अधिक मेमोरी प्राप्त करने के लिए' brk() 'का उपयोग करेगा। जब डेटा सेगमेंट ओवरराइट हो जाता है, तो इसका आकार भी रीसेट हो जाता है और मेमोरी प्रभावी रूप से मुक्त हो जाती है। –

+0

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

3

संपूर्ण ढेर - आवंटित स्मृति, और सभी तर्क malloc इसे प्रबंधित करने के लिए उपयोग करता है - प्रक्रिया छवि का हिस्सा है जो बदल जाता है। यह बस गायब हो जाता है, जहां तक ​​आपकी प्रक्रिया संबंधित है। प्रणाली, ज़ाहिर है, इसे ठीक करता है और इसे पुन: उपयोग करता है।

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