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