जब अंतर्निहित कमांड को मेमोरी में लोड किया जाता है


11

मान लीजिए कि मैं cdअपने शेल में टाइप करता हूं। है cdकि इस समय स्मृति से भरी हुई? मेरा अंतर्ज्ञान यह है कि इन अंतर्निहित कमांड को कर्नेल लोड होने के बाद सिस्टम मेमोरी में प्री-लोड किया जाता है, लेकिन किसी ने जोर देकर कहा कि वे केवल तभी लोड होते हैं जब मैं वास्तव में कमांड को दबाता हूं (शेल पर एंटर करें)। क्या आप मुझे बता सकते हैं कि क्या ऐसा कोई संदर्भ है जो यह बताता है?


1
मुझे लगता है कि यह उत्तर आपको समझने में मदद करेगा, हालांकि यह बिल्कुल डुप्लिकेट नहीं है।
cjm

@ cjm: धन्यवाद यह वास्तव में पढ़ने के लिए एक अच्छी व्याख्या थी।
फॉरेथिंकर

जवाबों:


9

मान लीजिए कि मैं अपने शेल में 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) से लिंक करता है।

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

इसे डिमांड पेजिंग कहा जाता है ।


9

हेवीवेट में से एक के आने और पूर्ण ऐतिहासिक परिप्रेक्ष्य देने की प्रतीक्षा करते हुए, मैं आपको अपनी अधिक सीमित समझ दूंगा।

में निर्मित की तरह आदेशों alias, cd, echoआदि अपने खोल का हिस्सा हैं ( bash, zsh, kshया जो कुछ भी)। वे उसी समय लोड हो जाते हैं जब शेल होता है और उस शेल के केवल आंतरिक कार्य होते हैं।


4

मैंने निम्न प्रयोग यह दिखाने के लिए किया कि बिल्टइन कमांड वास्तव में एक्सटेक्टेबल के हिस्से के रूप में लोड किए गए हैं bash। इसलिए, उन्हें बिलीन्स क्यों कहा जाता है, लेकिन एक डेमो हमेशा कुछ साबित करने का सबसे अच्छा तरीका है।

उदाहरण

  1. एक नया bashशेल शुरू करें , और इसकी प्रक्रिया आईडी (PID) नोट करें:

    $ bash
    $ echo $$
    6402
    
  2. दूसरे टर्मिनल में psकमांड चलाएं ताकि हम देख सकें और देख सकें कि क्या bashकोई अतिरिक्त मेमोरी लेना शुरू कर रहा है:

    $ watch "ps -Fp 6402"
    

    आउटपुट इस तरह दिखता है:

    Every 2.0s: ps -Fp 6402                        Sat Sep 14 14:40:49 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml      6402  6349  0 28747  6380   1 14:33 pts/38   00:00:00 bash
    

    नोट: मेमोरी उपयोग यहाँ SZ और RSS कॉलम के साथ दिखाया गया है।

  3. शेल में कमांड चलाना शुरू करें (pid 6402):

    जैसा कि आप cdचारों ओर देखते हैं कि स्मृति वास्तव में ऊपर जाती है, लेकिन यह निष्पादन योग्य cdमेमोरी में लोड होने के कारण नहीं है , बल्कि ऐसा इसलिए है क्योंकि डिस्क पर निर्देशिका संरचना मेमोरी में लोड हो रही है। यदि आप cdअन्य निर्देशिकाओं में रहते हैं, तो आप देखेंगे कि यह लगातार बढ़ रहा है।

    Every 2.0s: ps -Fp 30208                        Sat Sep 14 15:11:22 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml     30208  6349  0 28780  6492   0 15:09 pts/38   00:00:00 bash
    

    आप इस तरह अधिक विस्तृत परीक्षण कर सकते हैं:

    $ for i in `seq 1000`; do cd ..; cd 90609;done
    

    यह कमांड एक लेवल को cd करेगा और फिर डाइरेक्टरी में 90609 1000 बार वापस जाएगा। इसे चलाते समय यदि आप psविंडो में मेमोरी उपयोग की निगरानी करते हैं तो आप देखेंगे कि यह नहीं बदलता है। इस तरह से कुछ चलाते समय, अतिरिक्त मेमोरी उपयोग पर ध्यान नहीं दिया जाना चाहिए।

  4. strace

    यहाँ एक और बताया गया है कि हम bashवास्तविक निष्पादन के बजाय बिलियन फ़ंक्शन के साथ काम कर रहे हैं । जब आप प्रयास करते हैं और चलाते हैं strace cd ..तो आपको निम्न संदेश मिलेगा:

    $ strace cd ..
    strace: cd: command not found
    

3

"बिल्ट-इन कमांड" अलग-अलग प्रोग्राम के बजाय शेल में निर्मित कमांड को संदर्भित करता है। ls, उदाहरण के लिए, वास्तव में एक अंतर्निहित कमांड नहीं है, लेकिन एक अलग कार्यक्रम है। जब यह डिस्क कैश में पहले से ही है, तो इसे रैम में लोड किया जाएगा।

एक अंतर्निहित कमांड का एक उदाहरण होगा printfया cd। ये शेल का हिस्सा हैं, और बाकी शेल के साथ लोड होते हैं।

कोई भी आदेश डिफ़ॉल्ट रूप से पूर्व-लोड नहीं किया जाता है, हालांकि ऐसा करने के लिए सिस्टम बनाए गए हैं।

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