cd
シェルに入力するとします。cd
その瞬間はメモリからロードされますか?私の直感では、これらの組み込みコマンドはカーネルがロードされた後にシステムメモリにプリロードされますが、誰かが実際にコマンドを呼び出すときにのみロードされると主張する人がいます(シェルでEnterキーを押します)。これを説明できる参考資料があるかどうか教えてください。
答え1
私はシェルにcdを入力したとしましょう。今CDはメモリからロードされますか?私の直感では、これらの組み込みコマンドはカーネルがロードされた後にシステムメモリにプリロードされますが、誰かが実際にコマンドを呼び出すときにのみロードされると主張します。
概して、他の答えは正しいです。組み込みはシェルと共にロードされ、スタンドアロンプログラムは呼び出されるとロードされます。しかし、非常に頑固なイタチ「誰か」はそれがそれほど単純ではないと主張するかもしれません。
この議論は、オペレーティングシステムがどのように動作するのか、さまざまなオペレーティングシステムが異なる方法で動作する方法に関するものですが、一般的に次のことはおそらくすべての最新の* nixに適用できると思います。
まず、「メモリにロードされた」はあいまいな表現です。仮想アドレス空間をメモリにマッピング。 「仮想アドレス空間」とは、メモリに格納する必要がある空間を意味しますが、実際には元の空間とは異なるため、これが重要です。実際にメモリにロードされるほとんどのスペースは、地図自体- そして地図は領土ではありません。 「領域」はディスク(またはディスクキャッシュ)の実行ファイルになり、実際にはほとんどいいえ実行可能ファイルを呼び出すとメモリにロードされます。
また、ほとんどの「領域」は他の領域(共有ライブラリ)への参照であり、参照されるとして実際にロードされるという意味ではありません。実際に使用されるまではロードされず、実際にロードする必要がある部分だけが正常に「使用」されます。
たとえば、以下はtop
Linux参照インスタンス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
です。これはシェルと同時にロードされ、単にそのシェルの内部機能です。zsh
ksh
答え3
組み込みコマンドが実際に実行可能ファイルの一部としてロードされることを示すために、次の実験を行いましたbash
。だから組み込みと呼ぶが、常に何かを証明する最良の方法はデモンストレーションである。
はい
新しい
bash
シェルを起動し、対応するプロセスID(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列はメモリ使用量を示しています。
シェル(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
変化がないことがわかります。同様のプログラムを実行するときに追加のメモリ使用量を表示しないでください。ストレス
bash
これは、実際の実行ファイルではなく組み込み関数を扱っていることを知らせる別の方法です。実行しようとすると、strace cd ..
次のメッセージが表示されます。$ strace cd .. strace: cd: command not found
答え4
「組み込みコマンド」は、別のプログラムではなく、シェルに組み込まれたコマンドです。ls
たとえば、実際に組み込まれたコマンドではなく、別のプログラムです。呼び出されると、すでにディスクキャッシュにない限りRAMにロードされます。
組み込みコマンドの例はprintf
またはですcd
。これはシェルの一部であり、残りのシェルと一緒にロードされます。
デフォルトではプリロードされるコマンドはありませんが、これを行うためにシステムが作成されました。