কখন অন্তর্নির্মিত কমান্ডগুলি মেমরিতে লোড হয়


11

আমি যদি cdআমার শেলটি টাইপ করি তবে তা বলি । হয় cdসেই মুহুর্তে মেমরি থেকে লোড? আমার অন্তর্নিহিততাটি হ'ল এই বিল্ট-ইন কমান্ডগুলি কার্নেলটি লোড হওয়ার পরে সিস্টেম মেমোরিতে প্রাক লোড করা হয়, তবে কেউ জোর দিয়েছিলেন যে সেগুলি কেবল তখনই লোড করা হবে যখন আমি প্রকৃতপক্ষে কমান্ডটি আহ্বান করব (শেলের উপরে এন্টার টিপুন)। আপনি কি দয়া করে আমাকে বলতে পারেন কোনও রেফারেন্স আছে যা এটি ব্যাখ্যা করে?


1
আমি মনে করি এই উত্তরটি আপনাকে বুঝতে সাহায্য করবে, যদিও এটি কোনও সদৃশ নয়।
সিজেএম

@ সিজেএম: ধন্যবাদ এটি পড়ার পক্ষে সত্যই একটি ভাল ব্যাখ্যা ছিল।
ফোরথিংকার

উত্তর:


9

আসুন বলি আমি আমার শেল সিডি টাইপ করি যদি। সেই মুহুর্তে কি স্মৃতি থেকে সিডি লোড করা হয়? আমার অন্তর্নিহিততাটি হ'ল এই বিল্ট-ইন কমান্ডগুলি কার্নেলটি লোড হওয়ার পরে সিস্টেম মেমোরিতে প্রাক লোড করা হয়, তবে কেউ জোর দিয়েছিলেন যে যখন আমি আসলে কমান্ডটি প্রার্থনা করব তখনই সেগুলি লোড করা হয় ...

বিস্তৃত শর্তে অন্যান্য উত্তরগুলি সঠিক - বিল্ট-ইনগুলি শেল দিয়ে লোড করা হয়, আহ্বান করলে স্ট্যান্ড-অ্যালোনগুলি লোড করা হয়। তবে, খুব স্টিলিই ওয়েসেল-ওয়াই "কেউ" জোর দিতে পারে যে এটি এত সহজ নয়।

এই আলোচনাটি ওএস কীভাবে কাজ করে এবং বিভিন্ন ওএসের কাজ বিভিন্ন উপায়ে তা সম্পর্কে কিছুটা হলেও আমি সাধারণভাবে নিম্নলিখিত সমকালীন * নিক্সের ক্ষেত্রে সম্ভবত সত্য বলে মনে করি।

প্রথমত, "স্মৃতিতে লোড করা" একটি দ্ব্যর্থক বাক্য; আমরা যা উল্লেখ করছি তা হ'ল এর ভার্চুয়াল ঠিকানার স্থানটি মেমরিতে ম্যাপ করা হয়েছে । এটি উল্লেখযোগ্য কারণ "ভার্চুয়াল অ্যাড্রেস স্পেস" এমন স্টাফগুলিকে বোঝায় যা মেমোরিতে রাখার প্রয়োজন হতে পারে তবে বাস্তবে এটি প্রাথমিকভাবে নয়: বেশিরভাগ যা আসলে মেমরিতে লোড হয় তা মানচিত্র নিজেই - এবং মানচিত্রটি অঞ্চল নয়। "টেরিটরিটি" ডিস্কে এক্সিকিউটেবল (বা ডিস্ক ক্যাশে) হবে এবং বাস্তবে আপনি যখন কোনও এক্সিকিউটিভকে ডাকেন তখন এর বেশিরভাগ সম্ভবত মেমরিতে লোড হয় না

এছাড়াও, "অঞ্চলটি" এর বেশিরভাগ অংশ অন্যান্য অঞ্চলগুলিতে (ভাগ করে নেওয়া লাইব্রেরি) উল্লেখ করা হয় এবং আবারও, কারণ তাদের উল্লেখ করা হয়েছে তার অর্থ এই নয় যে তারা সত্যই লোড হয়েছে are এগুলি আসলে ব্যবহার না হওয়া অবধি তারা লোড পাবে না এবং তারপরে কেবলমাত্র সেগুলির টুকরোগুলিই লোড হওয়া দরকার যা কিছু "ব্যবহার" সফল হতে পারে তার জন্য।

উদাহরণস্বরূপ, এখানে topএকটি bashউদাহরণ উল্লেখ করে লিনাক্সের আউটপুট- এর একটি স্নিপেট রয়েছে :

VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                  
113m 3672 1796 S  0.0  0.1   0:00.07 bash   

113 মেগাবাইট ভিআইআরটি হ'ল ভার্চুয়াল অ্যাড্রেস স্পেস, যা র‌্যামে ম্যাপ করা হয়েছে। তবে আরইএস হ'ল এই প্রক্রিয়াটি কেবলমাত্র র‌্যামের পরিমাণে র‍্যাম খায় - মাত্র ৩.7 কিলোবাইট। এবং এর মধ্যে কিছু অংশ উপরে উল্লিখিত ভাগ করা অঞ্চলের অংশ - 1.8 কেবি এসএইচআর। তবে আমার /bin/bashঅন ​​ডিস্কটি 930 কেবি, এবং এটির সাথে দ্বিগুণ বড় ল্যাবসিটি (একটি ভাগ করা লিবিব) লিঙ্ক করেছে।

এই শেলটি এখনই কিছু করছে না। ধরা যাক আমি একটি অন্তর্নির্মিত কমান্ডটি প্রার্থনা করছি, যা আমরা আগে বলেছিলাম বাকী শেলটির সাথে ইতিমধ্যে "স্মৃতিতে লোড" ছিল। কার্নেল মানচিত্রের এক পর্যায়ে যা কিছু কোড জড়িত তা কার্যকর করে এবং যখন কোডটি এমন কোনও রেফারেন্সে পৌঁছায় যা সত্যিই লোড হয় নি, এটি এটি লোড করে - ডিস্কে একটি এক্সিকিউটেবল ইমেজ থেকে - এমনকি আরও কিছুটা নৈমিত্তিক হলেও ইন্দ্রিয়, যে এক্সিকিউটেবল (এটি শেল, একা একা থাকা সরঞ্জাম, বা ভাগ করা লাইব্রেরি) ইতিমধ্যে "স্মৃতিতে লোড করা" ছিল।

একে বলা হয় ডিমান্ড পেজিং


9

হেভিওয়েটগুলির মধ্যে একটি এসে সম্পূর্ণ waitingতিহাসিক দৃষ্টিকোণ দেওয়ার জন্য অপেক্ষা করার সময়, আমি আপনাকে আমার আরও সীমাবদ্ধ বোঝাপড়া দেব।

বিল্ট-ইন মত কমান্ড alias, cd, echoইত্যাদি আপনার শেল অংশ ( bash, zsh, kshবা যাই হোক না কেন)। এগুলি শেলটি একই সাথে লোড হয় এবং এটি কেবল সেই শেলের অভ্যন্তরীণ ফাংশন।


4

আমি অন্তর্নিহিত কমান্ডগুলি বাস্তবে অস্থির অংশ হিসাবে লোড করা হয়েছে তা দেখানোর জন্য আমি নিম্নলিখিত পরীক্ষাটি করেছিলাম bash। সুতরাং কেন তাদের বিল্টিন বলা হয় তবে কোনও কিছু প্রমাণ করার জন্য ডেমো সর্বদা সর্বোত্তম উপায়।

উদাহরণ

  1. একটি নতুন bashশেল শুরু করুন এবং তার প্রক্রিয়া আইডি (পিআইডি) নোট করুন:

    $ 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
    

    দ্রষ্টব্য: মেমরির ব্যবহার এখানে এসজেড এবং আরএসএস কলামগুলির সাথে দেখানো হয়েছে।

  3. শেলের মধ্যে কমান্ড চালানো শুরু করুন (পিড 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
    

    এই কমান্ডটি একটি স্তর সিডি করবে এবং তারপরে 90609 1000 বার ডিরেক্টরিতে ফিরে আসবে। এটি চালানোর সময় আপনি যদি psউইন্ডোতে মেমরির ব্যবহার নিরীক্ষণ করেন তবে আপনি লক্ষ্য করবেন যে এটি পরিবর্তন হয় না। এই জাতীয় কিছু চালানোর সময়, কোনও অতিরিক্ত মেমরির ব্যবহার লক্ষ্য করা উচিত নয়।

  4. strace,

    এখানে আরেকটি বলুন যে আমরা একটি বিল্টিন ফাংশনটির সাথে bashপ্রকৃত এক্সিকিউটেবলের পরিবর্তে কাজ করছি । আপনি চেষ্টা এবং চালানোর সময় strace cd ..আপনি নিম্নলিখিত বার্তা পাবেন:

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

3

"বিল্ট-ইন কমান্ড" বলতে আলাদা প্রোগ্রামের পরিবর্তে শেলের মধ্যে নির্মিত কমান্ডকে বোঝায়। lsউদাহরণস্বরূপ, আসলে একটি অন্তর্নির্মিত কমান্ড নয় বরং একটি পৃথক প্রোগ্রাম। এটি চালিত হলে এটি র‍্যামে লোড হবে, যদি না এটি ইতিমধ্যে ডিস্ক ক্যাশে থাকে।

অন্তর্নির্মিত কমান্ডের একটি উদাহরণ হতে পারে printfবা cd। এগুলি শেলের একটি অংশ, এবং শেলের বাকী অংশের সাথে লোড হয়।

কোনও কমান্ড পূর্বনির্ধারিতভাবে পূর্ব-লোড হয় না, যদিও এটি করার জন্য সিস্টেম তৈরি করা হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.