サブシェルの寿命は作成直後に終了しますか?つまり、その資産はその資産内で実行されるプロセスに置き換えられますか? bashで実行していると仮定すると、
grep -r "something"
シェルは最初は「grep」ではなく子プロセスを作成し、bash自体のフォークで始まりますが、最終的に「grep」がランタイムになりたいので、子プロセスシェルの資産は「早く」grepプロセスに置き換えられました。 (写真の中:Shell ---> "Child Shell"(寿命が短いですか?)---> Process)すべてのシェルコマンドはサブシェルを生成しますか?例えば、「ls -l」のような単純なコマンドを実行しても、短い時間にサブプロセスが生成されますか? 1で説明したのと同じ理由がここに再適用されるため、 "ls"自体はプログラムであり、実行時にそのプロセスが自分のシェルプロセスを置き換えることを望まない。
2に対する答えが「はい」の場合、これは多くのシェルコマンドを含むシェルスクリプトを実行すると、「多くの」サブシェルとプロセスが生成されることを意味しますか?
答え1
プロセスとその中で実行されている項目を区別することが重要です(あなたの質問によれば、これらの区別を知っていることが示されています)。プロセスで実行されている特定のプログラムが別のプログラムを実行しようとするたびに、2つのオプションがあります。オペレーティングシステムに、現在のプロセスのプログラムを新しいプログラムに置き換えるように依頼することができます(exec
関数系列)またはオペレーティングシステムに新しいプロセスを作成するように依頼することができます(fork
機能その後、プロセスはオペレーティングシステムに新しいプロセスの新しいプログラムと交換するように要求します。
grep
シェルで実行すると、シェルは通常、後で制御権を取り戻すことを望んでいるため、分岐され、分岐されたgrep
プロセスが完了するのを待ちます。はい。フォーク内のシェルは一時的ですが、ほとんどの最新のオペレーティングシステムでは、フォーク内のシェルの「資産」を「作成」するのに費用がかかりません(記録中のコピー機能のおかげで)。器具)。対話型シェルにも同様に適用されます
ls -l
。しかし、場合によっては、シェルは分岐せず、それ自体で置き換えられます。bashが単純なコマンドのサブシェルを生成しないのはなぜですか?もっと学ぶ。シェルスクリプトを実行すると、スクリプトを実行しているシェルのプロセス、シェル内の各外部コマンドのプロセス、および特定のシェル構成のサブシェルが生成されることがあります。
プロセスを作成するのは安価ですが、exec
コストがかかりません。これが、人々が使用しているプロセスの数を制限することに興味がある理由の1つです。 2つの異なる理由(おそらくより重要です)は、プログラムを開始するためにそのプログラムを開始するための費用が含まれ、しばしばプロセス全体の一部を繰り返すことに関連している(後者とシステムの比較または複数のfind ... -exec grep
呼び出しなど)。または)。外部コマンドに過度に依存してシェルスクリプトで速度の問題が発生し始めると、通常は他のプログラムを使用せずに、より多くのデータを処理できるより有能なプログラミング環境に切り替える必要があるという信号です。grep -r
grep
sed
sed
awk