組み込みコマンドはいつメモリにロードされますか?

組み込みコマンドはいつメモリにロードされますか?

cdシェルに入力するとします。cdその瞬間はメモリからロードされますか?私の直感では、これらの組み込みコマンドはカーネルがロードされた後にシステムメモリにプリロードされますが、誰かが実際にコマンドを呼び出すときにのみロードされると主張する人がいます(シェルでEnterキーを押します)。これを説明できる参考資料があるかどうか教えてください。

答え1

私はシェルにcdを入力したとしましょう。今CDはメモリからロードされますか?私の直感では、これらの組み込みコマンドはカーネルがロードされた後にシステムメモリにプリロードされますが、誰かが実際にコマンドを呼び出すときにのみロードされると主張します。

概して、他の答えは正しいです。組み込みはシェルと共にロードされ、スタンドアロンプ​​ログラムは呼び出されるとロードされます。しかし、非常に頑固なイタチ「誰か」はそれがそれほど単純ではないと主張するかもしれません。

この議論は、オペレーティングシステムがどのように動作するのか、さまざまなオペレーティングシステムが異なる方法で動作する方法に関するものですが、一般的に次のことはおそらくすべての最新の* nixに適用できると思います。

まず、「メモリにロードされた」はあいまいな表現です。仮想アドレス空間をメモリにマッピング。 「仮想アドレス空間」とは、メモリに格納する必要がある空間を意味しますが、実際には元の空間とは異なるため、これが重要です。実際にメモリにロードされるほとんどのスペースは、地図自体- そして地図は領土ではありません。 「領域」はディスク(またはディスクキャッシュ)の実行ファイルになり、実際にはほとんどいいえ実行可能ファイルを呼び出すとメモリにロードされます。

また、ほとんどの「領域」は他の領域(共有ライブラリ)への参照であり、参照されるとして実際にロードされるという意味ではありません。実際に使用されるまではロードされず、実際にロードする必要がある部分だけが正常に「使用」されます。

たとえば、以下はtopLinux参照インスタンスbashの出力フラグメントです。

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

113MB VIRTは仮想アドレス空間です。マッピングされた記憶の中に。しかし、RESはプロセスが消費する実際のRAMの量でわずか3.7kBです。これらのいくつかは、上記の共有領域(1.8kB SHR)の一部です。しかし、私の/bin/bashディスクサイズは930kBで、リンクされているデフォルトのlibc(共有ライブラリ)はそのサイズの2倍です。

シェルは現在何もしません。前に、シェルの残りの部分と一緒に「メモリにロード」されたと言われた組み込みコマンドを呼び出すとしましょう。カーネルは、マップ内の特定のポイントから関連するすべてのコードを実行し始め、まだ実際にロードされていないコードへの参照に達すると、それをロードします。ディスクの実行可能イメージから- より一般的な意味では、実行可能ファイル(シェル、スタンドアロンツール、または共有ライブラリ)はすでに「メモリにロード」されています。

これは…ページング要求

答え2

私は有力な人物が完全な歴史的観点を提供するのを待っていますが、私はより制限された理解をあなたに提供します。

aliasその他cdの組み込みコマンドは、シェルecho(またはその他のコマンド)の一部bashです。これはシェルと同時にロードされ、単にそのシェルの内部機能です。zshksh

答え3

組み込みコマンドが実際に実行可能ファイルの一部としてロードされることを示すために、次の実験を行いましたbash。だから組み込みと呼ぶが、常に何かを証明する最良の方法はデモンストレーションである。

はい

  1. 新しいbashシェルを起動し、対応するプロセスID(PID)をメモします。

    $ bash
    $ echo $$
    6402
    
  2. 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
    

    このコマンドは1レベル上に移動し、90609ディレクトリに1000回戻ります。このプログラムを実行しながらウィンドウでメモリ使用量を監視すると、ps変化がないことがわかります。同様のプログラムを実行するときに追加のメモリ使用量を表示しないでください。

  4. ストレス

    bashこれは、実際の実行ファイルではなく組み込み関数を扱っていることを知らせる別の方法です。実行しようとすると、strace cd ..次のメッセージが表示されます。

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

答え4

「組み込みコマンド」は、別のプログラムではなく、シェルに組み込まれたコマンドです。lsたとえば、実際に組み込まれたコマンドではなく、別のプログラムです。呼び出されると、すでにディスクキャッシュにない限りRAMにロードされます。

組み込みコマンドの例はprintfまたはですcd。これはシェルの一部であり、残りのシェルと一緒にロードされます。

デフォルトではプリロードされるコマンドはありませんが、これを行うためにシステムが作成されました。

関連情報