
Unixのプロセスがどのように動作するかを学び、子プロセス親プロセスからほとんどの属性(ファイル記述子を含む)を継承します。また、実行者子プロセスの属性を完全に新しいもの(新しいメモリ空間など)に置き換えながら、元のプロセス ID を保持する方法について説明します。
それから私は知っているNode.js のサンドボックス環境では、基本的に空白の状態が提供され、子プロセスのコンテキストに変数と「機能」が追加されます。
私が疑問に思っているのは、子プロセスが受け取る属性にはどのような種類の構成があるのか、そして Unix の子プロセスがなぜ「デフォルト」で親の属性をすべて継承するのかということです。代わりに、子プロセスが独自のメモリ領域などを持たないのはなぜなのか疑問に思っています。
また、これら 2 つのケース (すべての親属性を継承する、またはまったく継承しない) に代わる「子プロセス属性構成」があるかどうかも疑問です。親アドレス空間の半分を継承したり、兄弟プロセスからアドレス空間の一部を使用したり、親からのファイル記述子と独自のファイル記述子をいくつか使用したりすることが必要になるかもしれません。一部のデバイス ドライバーにはアクセスできて、他のデバイス ドライバーにはアクセスできない、などと言うかもしれません。
Unix または他のオペレーティング システムで子プロセスを作成するときに、このような「構成機能」を渡す方法があるかどうか知りたいです。たとえば、「親アドレス空間の半分、兄弟 2 のアドレス空間の 1/4、兄弟 1 のアドレス空間の 1/8 を使用して子プロセスを作成し、残りの 1/8 は自分のローカル アドレス空間を使用します。また、a、b、c デバイス ドライバーへのアクセスを提供し、それ以外はネットワーク アクセスを許可しません。」これは、基本的に子プロセスの「機能セット」を詳細レベルまで構成する任意のものです。
Unix や他のオペレーティング システムでも同様のことが起こるかどうか、起こらない場合、その理由は何か疑問に思います。許可/規制プロセスをこれら 2 つのケースだけにするという決定が下された理由がわかりません。
これはどうやら保護リング概念。ユーザーランドプロセス (子プロセス) が特定の機能にアクセスできないようにします。なぜ、高レベルでこれ以上に構成できないのか不思議です。
答え1
ここではリンゴとオレンジとグレープフルーツを混ぜています。
例えば「node.js」はJavaScript高級言語、これはオペレーティング システムのプロセスとは何の関係もありません (JavaScript はすべて、ホストによって提供されるプロセスまたはスレッド内で実行されます)。
「リング」、またはより一般的には「CPU特権レベル」はマイクロプロセッサチップの物理的特徴、プログラムが発行できる CPU 命令とアクセスできるリソースを決定するために使用されます。
Unix/Linuxのソフトウェアこれらのオペレーティングシステムに特有のアーキテクチャは、「フォーク」これは次のようになります:
if (pid = fork()) { ... you are the parent, and 'pid' is the child's process-id ... } else { ... 'pid' is zero, so you are the child ... }
このすばらしいアイデアが機能するには、親のコンテキストのほとんどを子にコピーする必要があります。
システムexec()
コールは (子プロセスによって) 使用されて、そのコンテキスト全体を新しいプロセスのコンテキストに置き換えることができ、その結果、親プロセスからのすべての「継承」が切断されます。