2010-07-09 16 views
13

एक प्रक्रिया 'स्मृति के बारे में बात करते समय, मैंने कोड मेमोरी और डेटा मेमोरी जैसी चीजों के बारे में सुना।कोड मेमोरी कैसे प्रबंधित की जाती है?

और डेटा मेमोरी के लिए, 2 प्रमुख प्रबंधन तंत्र, ढेर और ढेर हैं।

अब मैं सोच रहा हूं कि कोड मेमोरी प्रबंधित कैसे है? और कौन इसे प्रबंधित करता है?

अगर मेरा कथन इतना स्पष्ट नहीं है तो मुझे क्षमा करें।

धन्यवाद।

उत्तर

17

यदि आप प्रक्रिया 'स्मृति प्रबंधन के विवरण के बारे में अधिक जानने में रुचि रखते हैं तो मैं http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory (और अन्य स्मृति संबंधित लेख) की अनुशंसा करता हूं।

कोड स्मृति = पाठ खंड

सूचना कैसे पता स्थान 4GB है। जब कर्नेल एक प्रक्रिया बनाता है तो यह वर्चुअल मेमोरी देता है। नीचे 32 बिट ओएस का एक उदाहरण है। कर्नेल प्रोसेसर के MMU के माध्यम से वास्तविक रैम में कौन से पते मैप किए जाते हैं प्रबंधित करता है। इसलिए, कर्नेल और एमएमयू कोड मेमोरी का प्रबंधन करते हैं, जैसे वे एक प्रक्रिया के पूरे पता स्थान का प्रबंधन करते हैं।

Borrowed from duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

+1

बहुत अच्छा लिंक ... – wrapperm

+0

मैं दूसरा wrapperm। :) – smwikipedia

+2

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

2

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

जैसा कि Space_C0wb0y द्वारा प्रस्तावित किया गया है, क्या हो रहा है इसके विवरण के लिए en.wikipedia.org/wiki/Dynamic_linker देखें।

+1

इस बारे में कुछ अंतर्दृष्टि के लिए गतिशील लोडिंग के बारे में इस विकिपीडिया-आलेख को देखें: http://en.wikipedia.org/wiki/Dynamic_linker –

+0

धन्यवाद Space_C0wb0y, वह लिंक उपयोगी है। – smwikipedia

0

आपका ऑपरेटिंग सिस्टम तथाकथित प्रदान करता है प्रणाली गतिशील स्मृति (malloc, नि: शुल्क, आदि) आवंटित करने के लिए कहता है, यह भी लोड और अपने कार्यक्रम पर अमल करने तंत्र प्रदान करता है।

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

भी इस लेख देखें: http://www.maxi-pedia.com/what+is+heap+and+stack

+0

ढेर को अधिकांश ऑपरेटिंग सिस्टम पर कर्नेल द्वारा प्रबंधित नहीं किया जाता है। यह आमतौर पर किसी प्रकार की रनटाइम लाइब्रेरी (उदा। एनटीएलएल, libc) में रहने वाला एक पूरी तरह से उपयोगकर्ता-मोड घटक होता है जो तब सिस्टम को निचले स्तर के पेज-हैंडलिंग फ़ंक्शंस (उदा। एनटीएल्कोट वर्चुअल मेमरी) में कॉल करता है। – wj32

4

कोड से स्मृति प्रबंधन की जरूरत नहीं है, क्योंकि यह नहीं बदलता है। जब निष्पादन योग्य पता स्थान में लोड किया जाता है, तो कोड निष्पादन योग्य फ़ाइल से स्मृति में पढ़ा जाता है। वास्तव में, आधुनिक ऑपरेटिंग सिस्टम पर, कोड सेगमेंट केवल निष्पादन योग्य फ़ाइल में मैप किया गया स्मृति है।

+1

अच्छा, अच्छा .... यह ऑपरेटिंग सिस्टम पर निर्भर करता है। जैसा कि मुझे ऑपरेटिंग सिस्टम पर ए। सिल्बर्सचैट्स पुस्तक से याद है, कुछ आर्किटेक्चर कोड को स्थानांतरित करने में सक्षम हो सकते हैं, लेकिन यह प्रोग्रामर के लिए पारदर्शी होना चाहिए। गतिशील पुस्तकालयों को लोड/अनलोड करने से कोड के कुछ स्मृति प्रबंधन शामिल होते हैं। – doc

+0

@ डॉक: सही है, लेकिन यह ओएस और वास्तुकला के बीच बदलता है। मैंने ऊपर जो कहा वह ज्यादातर ओएस एक्स निष्पादन योग्य फ़ाइल प्रारूप के साथ पोकिंग पर आधारित है। – JeremyP

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