मान लीजिए कि मैं अपने शेल में cd टाइप करता हूं। क्या सीडी उस समय मेमोरी से भरी हुई है? मेरा अंतर्ज्ञान यह है कि इन अंतर्निहित कमांड को कर्नेल लोड होने के बाद सिस्टम मेमोरी में प्री-लोड किया जाता है, लेकिन किसी ने जोर देकर कहा कि वे केवल तभी लोड होते हैं जब मैं वास्तव में कमांड का आह्वान करता हूं ...
व्यापक रूप में अन्य उत्तर सही हैं - बिल्ट-इन को शेल के साथ लोड किया जाता है, स्टैंड-अलोन को लोड किए जाने पर लोड किया जाता है। हालांकि, एक बहुत ही चिपचिपा-वाई "y" कोई "जोर देकर कह सकता है कि यह इतना आसान नहीं है।
यह चर्चा कुछ हद तक है कि ओएस कैसे काम करता है, और अलग-अलग ओएस का काम अलग-अलग तरीके से होता है, लेकिन मुझे लगता है कि सामान्य रूप से निम्नलिखित सभी समकालीन * निक्स के लिए संभव है।
सबसे पहले, "मेमोरी में लोड किया गया" एक अस्पष्ट वाक्यांश है; वास्तव में हम जिसका उल्लेख कर रहे हैं, उसका वर्चुअल एड्रेस स्पेस मेमोरी में मैप किया गया है । यह महत्वपूर्ण है क्योंकि "वर्चुअल एड्रेस स्पेस" उस सामान को संदर्भित करता है जिसे मेमोरी में रखने की आवश्यकता हो सकती है, लेकिन वास्तव में शुरू में नहीं है: ज्यादातर जो वास्तव में मेमोरी में लोड होता है, वह नक्शा ही है - और नक्शा क्षेत्र नहीं है। "क्षेत्र" डिस्क पर निष्पादन योग्य होगा (या डिस्क कैश में) और, वास्तव में, जब आप किसी निष्पादन योग्य को आमंत्रित करते हैं, तो यह संभवत: मेमोरी में लोड नहीं होता है।
इसके अलावा, "बहुत से क्षेत्र" अन्य क्षेत्रों (साझा पुस्तकालयों) के संदर्भ हैं, और फिर से, सिर्फ इसलिए कि उन्हें संदर्भित नहीं किया गया है इसका मतलब यह नहीं है कि वे वास्तव में लोड किए गए हैं। जब तक वे वास्तव में उपयोग नहीं किए जाते हैं, तब तक वे लोड नहीं होते हैं, और फिर उनमें से केवल उन टुकड़ों को जो वास्तव में "उपयोग" के लिए लोड करने की आवश्यकता होती है जो कि सफल होना है।
उदाहरण के लिए, यहाँ top
एक bash
उदाहरण के संदर्भ में लिनक्स पर आउटपुट का एक स्निपेट है :
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
113 एमबी VIRT वर्चुअल एड्रेस स्पेस है, जिसे रैम में मैप किया जाता है। लेकिन आरईएस प्रक्रिया द्वारा खपत की जाने वाली रैम की वास्तविक मात्रा है - केवल 3.7 केबी। और उसमें से, कुछ ऊपर वर्णित साझा क्षेत्र का हिस्सा है - 1.8 kB SHR। लेकिन मेरी /bin/bash
डिस्क पर 930 kB है, और मूल libc यह एक बार फिर से दो बार (एक साझा lib) से लिंक करता है।
वह खोल अभी कुछ नहीं कर रहा है। मान लीजिए कि मैं एक अंतर्निहित कमांड का आह्वान करता हूं, जिसे हमने पहले ही कहा था कि पहले से ही "मेमोरी में लोड किया गया है" बाकी शेल के साथ। कर्नेल मानचित्र में एक बिंदु पर शुरू होने वाले किसी भी कोड को शामिल करता है, और जब यह कोड के संदर्भ में पहुंचता है जो वास्तव में लोड नहीं किया गया है, तो इसे लोड करता है - डिस्क पर एक निष्पादन योग्य छवि से - भले ही अधिक आकस्मिक में भावना, यह निष्पादन योग्य (यह शेल, एक स्टैंड-अलोन टूल, या एक साझा पुस्तकालय) पहले से ही "मेमोरी में लोड" था।
इसे डिमांड पेजिंग कहा जाता है ।