2012-07-24 23 views
6

मैं इन सवालों के साथ बहुत उलझन में हूं।वर्चुअल मेमोरी?

  1. 32 बिट प्रोसेसर पर, प्रत्येक प्रक्रिया में 4 जीबी वर्चुअल मेमोरी होती है। लेकिन, यदि 100 प्रक्रिया चल रही है तो ईवे प्रक्रिया में 4 जीबी स्पेस की तुलना में यह बड़ी राशि होगी - यह स्वैप क्षेत्र से अधिक है। क्या कोई इसे समझा सकता है; मैं बहुत असमंजस में हूँ।

  2. ऑपरेटिंग सिस्टम एक प्रक्रिया में स्मृति आवंटित करता है? मान लें कि एक प्रक्रिया में a = malloc(2) है। इस स्मृति को प्रक्रिया में कौन आवंटित करेगा? क्या ओएस प्रक्रिया में इन 2 बाइट्स मेमोरी देगा।
    (हम एक [2] तक पहुंचते हैं जो सेगमेंटेशन त्रुटि उत्पन्न करता है)।

  3. मुख्य मेमोरी में या माध्यमिक मेमोरी में प्रक्रिया के विभिन्न हिस्सों (कोड, डेटा, स्टैक, हीप) कहां रहता है।

ताकि मैं भी आभासी स्मृति और उसके पूरे तंत्र लिंक के रूप में मैंने पाया पूरी तरह से आभासी स्मृति समझा नहीं कर रहे हैं समझ सकते हैं मुझे कुछ अच्छा लिंक दे।

+0

चूंकि किसी ने इससे पहले यह नहीं देखा है, तो यह ध्यान दिया जाना चाहिए कि यदि आप 2-बाइट सरणी आवंटित करते हैं, तो [2] उस सरणी का हिस्सा नहीं होगा, केवल एक [0] और एक [1] होगा। –

+0

क्या मॉलोक हर बार सेगमेंटेशन देगा। चूंकि मॉलोक ढेर से अंतरिक्ष आवंटित करेगा और फिर ढेर का आकार सामान्य रूप से बहुत बड़ा होता है तो हम एक [2] तक पहुंचने में सक्षम क्यों नहीं हैं? इसे कुछ यादृच्छिक मूल्य देना चाहिए। सेगमेंटेशन का मतलब है कि हम उस तक पहुंच नहीं पा रहे हैं। अगर मैं गलत हूं तो मुझे सही करें – RATHI

+0

यह वास्तव में आपकी मशीन और कंपाइलर पर निर्भर करता है। लेकिन, नीचे की रेखा यह है कि यदि आपने अपने प्रोग्राम के उपयोग के लिए स्मृति आवंटित नहीं की है, तो आपको इसे एक्सेस या परिवर्तित नहीं करना चाहिए। –

उत्तर

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

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

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

वैसे, सबसे 32-बिट OSes पर, ओएस ही 1GB या 2GB कि आभासी स्मृति अंतरिक्ष के लेता है, प्रक्रिया द्वारा केवल 2 जीबी या 3 जीबी वास्तव में प्रयोग योग्य छोड़कर। 64-बिट ओएस पर, ओएस उस स्थान में से कोई भी नहीं लेता है, इसलिए पूर्ण 4 जीबी 32-बिट प्रक्रियाओं के लिए उपलब्ध है।

+0

इसलिए टिप्पणी # 2 के अनुसार, malloc() रैम में आरक्षित आरक्षित स्मृति नहीं है, यह सिर्फ प्रविष्टि जोड़ता है। जब हम उस आवंटित स्मृति तक पहुंचते हैं तो केवल राम आरक्षित होता है ??? – Jeyaram

+0

@rjayavrp: जब आप स्मृति तक पहुंचते हैं, तो राम आवंटित किया जाता है। यह आरक्षित नहीं है क्योंकि ऑपरेटिंग सिस्टम इसे वापस ले जाएगा यदि इसके लिए इसका अधिक महत्वपूर्ण उपयोग है। –

+0

malloc libc में कार्यान्वित किया गया है और यह syscall sbrk() को कॉल करता है। यदि sbrk को केवल अनुरोध का मनोरंजन करने के लिए एक और पृष्ठ की आवश्यकता है तो ओएस शामिल है अन्यथा malloc उपयोगकर्ता मोड में पूरा हो गया है ... क्या मैं यहाँ हूँ? – theadnangondal

0

पहला: 32 बिट का अर्थ 32 बिट है। अधिक मेमोरी स्पेस को संबोधित करने के लिए और बिट्स नहीं हैं। मल्टीप्रोसेसर-सिस्टम नए आविष्कार नहीं हैं। 32 बिट के साथ आप केवल 4gigs स्पेस को संबोधित कर सकते हैं। पीएई http://en.wikipedia.org/wiki/Physical_Address_Extension जैसे कुछ कामकाज।

दूसरा और तीसरा .. मुझे सच में यकीन नहीं है कि यह आज कैसे काम करता है। लेकिन http://en.wikipedia.org/wiki/Virtual_memory

+0

पीईई 4 जीबी * भौतिक * मेमोरी तक पहुंचने के लिए एक कामकाज है। यह प्रश्न * वर्चुअल * मेमोरी सीमाओं के बारे में है। –

+0

ओह .. आपका सही है। – Mirko

0

पर एक नज़र डालें, आपसे एक गंभीर गलतफहमी वर्चुअल मेमोरी और मेमोरी के बीच भिन्न है। एक प्रक्रिया पीओवी से, कोई फर्क नहीं पड़ता है, प्रक्रिया केवल स्मृति तक पहुंचती है और यह ओएस है जो भौतिक (रैम) और आभासी स्मृति के बीच डेटा के हिस्से को स्वैप करने का प्रभारी है।

1) कि प्रक्रिया के पते की जगह 4 जीबी तक पहुंच सकती है इसका मतलब यह नहीं है कि प्रत्येक प्रक्रिया में आवंटित 4 जीबी है। ओएस आवश्यकतानुसार उन्हें स्मृति निर्दिष्ट करता है।

2) ओएस ब्लॉक में स्मृति (* 1) देता है। जब आप एक मॉलोक करते हैं, तो मैलोक फ़ंक्शन जो प्रोग्राम मेमोरी को प्रबंधित करता है आंतरिक रूप से प्रक्रिया मेमोरी के अंदर आवश्यक स्थान प्राप्त करता है और पॉइंटर लौटाता है (शायद प्रक्रिया में वे ओएस से अतिरिक्त मेमोरी का अनुरोध करते हैं, लेकिन इसकी आवश्यकता नहीं है)।

3) शुरुआत में ही शुरू हुआ, यह एक ओएस मुद्दा है। प्रत्येक ओएस तय कर सकता है कि वे कौन से हिस्सों को वर्चुअलाइज करते हैं और वे कौन से हिस्से नहीं करते हैं, स्वैप की संख्या को कम करने के लिए जटिल रणनीतियां शामिल हैं।

* 1 ध्यान दें कि मैं स्मृति के बारे में बात करता हूं, वीएम नहीं। एप्लिकेशन को पता नहीं है कि इसकी मेमोरी के कौन से हिस्से वर्चुअल या भौतिक हैं, यह उनके लिए पारदर्शी है।

2

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

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

3) प्रत्येक सेगमेंट कहां स्थित है, इस बारे में विवरण ऑपरेटिंग सिस्टम निर्भर है, लेकिन सामान्य और पोर्टेबल कोड के लिए, जानने की कोई आवश्यकता नहीं है।

इन सभी विषयों पर अधिक जानकारी के लिए osdev विकी, paging और memory allocation पर विशेष रूप से भाग से परामर्श करें।

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