ओएस द्वारा स्टैक और हीप का आकार कैसे सीमित किया जाता है?


21

नोट : यदि आपको जवाब देने में सक्षम होने के लिए एक विशिष्ट ओएस पर विचार करने की आवश्यकता है, तो कृपया लिनक्स पर विचार करें।

जब भी मैं कोई कार्यक्रम चलाता हूं, तो इसे चलाने के लिए एक वर्चुअल मेमोरी स्पेस दिया जाएगा, इसके स्टैक के लिए एक क्षेत्र और इसके ढेर के लिए।

प्रश्न 1 : क्या स्टैक और हीप में स्थिर आकार सीमा होती है (उदाहरण के लिए, प्रत्येक में 2 गीगाबाइट), या यह सीमा डायनेमिक है, जो प्रोग्राम के निष्पादन के दौरान मेमोरी एलोकेशन के अनुसार बदल रही है (यानी, 4 गीगाबाइट कुल द्वारा उपयोग किया जाना है दोनों, इसलिए यदि कोई प्रोग्राम केवल स्टैक का उपयोग करता है, तो यह 4 गीगाबाइट के साथ स्टैक करने में सक्षम होगा)?

प्रश्न 2 : सीमा को कैसे परिभाषित किया जाता है? क्या यह कुल उपलब्ध रैम मेमोरी है?

प्रश्न 3 : पाठ (कोड) और डेटा अनुभागों के बारे में क्या, वे कैसे सीमित हैं?


जवाबों:


23

दो अलग-अलग मेमोरी सीमाएं हैं। वर्चुअल मेमोरी लिमिट और फिजिकल मेमोरी लिमिट।

अप्रत्यक्ष स्मृति

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

मुक्त वर्चुअल मेमोरी को शुरू में प्रयोग करने योग्य के रूप में चिह्नित नहीं किया जाता है, लेकिन आवंटन के दौरान इसे चिह्नित किया जाता है। जबकि ढेर सभी उपलब्ध मेमोरी तक बढ़ सकता है, अधिकांश सिस्टम ऑटो-ग्रो स्टैक नहीं करते हैं। स्टैक के लिए IIRC डिफ़ॉल्ट सीमा लिनक्स पर 8MiB और विंडोज पर 1MiB है और दोनों प्रणालियों पर इसे बदला जा सकता है। वर्चुअल मेमोरी में किसी भी मेमोरी-मैप्ड फाइल और हार्डवेयर होते हैं।

एक कारण है कि स्टैक को स्वतः विकसित नहीं किया जा सकता (मनमाने ढंग से) यह है कि बहु-थ्रेडेड प्रोग्राम को प्रत्येक थ्रेड के लिए अलग स्टैक की आवश्यकता होती है, इसलिए वे अंततः एक-दूसरे के रास्ते में आ जाएंगे।

32-बिट प्लेटफार्मों पर वर्चुअल मेमोरी की कुल मात्रा 4 जीआईबी है, लिनक्स और विंडोज दोनों सामान्य रूप से कर्नेल के लिए अंतिम 1 जीआईबी को संग्रहित करते हैं, जिससे आपको पता स्थान के अधिकांश 3 जीआईबी मिलते हैं। लिनक्स का एक विशेष संस्करण है जो आपको पूर्ण 4GiB देने के लिए कुछ भी आरक्षित नहीं करता है। यह बड़े डेटाबेस के दुर्लभ मामले के लिए उपयोगी है जहां अंतिम 1GiB दिन बचाता है, लेकिन नियमित उपयोग के लिए यह अतिरिक्त पेज टेबल रीलोड के कारण थोड़ा धीमा है।

64-बिट प्लेटफार्मों पर वर्चुअल मेमोरी 64EiB है और आपको इसके बारे में सोचने की ज़रूरत नहीं है।

भौतिक स्मृति

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

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

यह एंड्रॉइड (जो कि लिनक्स भी है) पर प्रक्रियाएं मर जाती हैं। तर्क के साथ तर्क में सुधार किया गया था कि प्रक्रिया क्या है और यह कितनी पुरानी है, इसके आधार पर अस्तित्व से हटाने की प्रक्रिया है। एंड्रॉइड की प्रक्रियाएं बस कुछ भी करना बंद कर देती हैं, लेकिन पृष्ठभूमि में बैठते हैं और "आउट ऑफ मेमोरी किलर" उन्हें मार डालेगा जब उसे नए लोगों के लिए मेमोरी की आवश्यकता होती है।


9

मुझे लगता है कि स्मृति का उपयोग कैसे किया जाता है, इस आदेश से इसका उत्तर देना आसान है।

प्रश्न 3: पाठ (कोड) और डेटा अनुभागों के बारे में क्या, वे कैसे सीमित हैं? टेक्स्ट और डेटा कंपाइलर द्वारा तैयार किए जाते हैं। कंपाइलर की आवश्यकता यह सुनिश्चित करने के लिए है कि वे सुलभ हैं और उन्हें पता स्थान के निचले हिस्से में पैक करें। सुलभ पता स्थान हार्डवेयर द्वारा सीमित होगा, उदाहरण के लिए यदि निर्देश सूचक रजिस्टर 32-बिट है, तो पाठ पता स्थान 4 GiB होगा।

प्रश्न 2: सीमा को कैसे परिभाषित किया जाता है? क्या यह कुल उपलब्ध रैम मेमोरी है? पाठ और डेटा के बाद, ऊपर का क्षेत्र ढेर है। आभासी स्मृति के साथ, ढेर व्यावहारिक रूप से बढ़ सकता है ऊपर अधिकतम पता स्थान के करीब है।

प्रश्न 1: क्या स्टैक और हीप में स्थिर आकार सीमा होती है (उदाहरण के लिए, प्रत्येक में 2 गीगाबाइट), या यह सीमा डायनेमिक है, जो प्रोग्राम के निष्पादन के दौरान मेमोरी एलोकेशन के अनुसार बदल रही है (यानी, 4 गीगाबाइट कुल द्वारा उपयोग किया जाना है दोनों, इसलिए यदि कोई प्रोग्राम केवल स्टैक का उपयोग करता है, तो यह 4 गीगाबाइट के साथ स्टैक करने में सक्षम होगा)? प्रक्रिया पता स्थान में अंतिम खंड स्टैक है। स्टैक पता स्थान का अंतिम खंड लेता है और यह अंत से शुरू होता है और नीचे बढ़ता है

क्योंकि ढेर बढ़ता है और ढेर नीचे बढ़ता है, वे मूल रूप से एक दूसरे को सीमित करते हैं। इसके अलावा, क्योंकि दोनों प्रकार के खंड लेखन योग्य हैं, यह हमेशा सीमा पार करने के लिए उनमें से एक का उल्लंघन नहीं था, इसलिए आप बफर या स्टैक ओवरफ्लो कर सकते थे। अब उन्हें होने से रोकने के लिए तंत्र हैं।

शुरू करने के लिए प्रत्येक प्रक्रिया के लिए ढेर (ढेर) के लिए एक निर्धारित सीमा है। इस सीमा को रनटाइम (brk () / sbrk () का उपयोग करके) में बदला जा सकता है। मूल रूप से क्या होता है जब प्रक्रिया को अधिक हीप स्थान की आवश्यकता होती है और यह आवंटित स्थान से बाहर चला गया है, मानक पुस्तकालय ओएस को कॉल जारी करेगा। ओएस एक पृष्ठ आवंटित करेगा, जिसे आमतौर पर प्रोग्राम के उपयोग के लिए उपयोगकर्ता लाइब्रेरी द्वारा प्रबंधित किया जाएगा। Ie यदि प्रोग्राम 1 KiB चाहता है, तो OS अतिरिक्त 4 KiB देगा और लाइब्रेरी प्रोग्राम को 1 KiB देगा और जब प्रोग्राम अगली बार अधिक मांगेगा तो उपयोग के लिए 3 KiB छोड़ देगा।

अधिकांश समय लेआउट टेक्स्ट, डेटा, हीप (बड़ा हो जाता है), असंबद्ध स्थान और अंत में स्टैक (नीचे बढ़ता है) होगा। वे सभी एक ही पते की जगह साझा करते हैं।

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