Linuxは1-1のスレッドモデルを使用し、(カーネルに対して)プロセスとスレッドを区別しません。すべてが実行可能なタスクです。*
Linuxでは、システムコール cloneは設定可能な共有レベルでタスクを複製します。
CLONE_FILES:(コピーを作成する代わりに)同じファイル記述子テーブルを共有する
CLONE_PARENT:新しいタスクと古いタスクの間に親子関係を設定しないでください(そうでない場合、子の getppid() =親のgetpid())
CLONE_VM:同じメモリ空間を共有する(COWを作成する代わりに)コピー
fork()通話clone(以上の共有)とpthread_create()呼び出しclone(最も共有を)。**
forkINGのコストは pthread_createテーブルをコピーしてメモリのCOWマッピングを作成するため、 INGますが、Linuxカーネル開発者はこれらのコストを最小限に抑えることを試みました(そして成功しました)。
データが既にキャッシュに読み込まれている可能性があるため、同じメモリ空間とさまざまなテーブルを共有しているタスクを切り替えると、共有されていない場合よりも少し安価になります。ただし、何も共有されていなくても、タスクの切り替えは非常に高速です。これは、Linuxカーネルの開発者が確認しようとする(そして確認に成功する)別のことです。
実際、マルチプロセッサシステムを使用している場合は、共有を行わない方が実際にはパフォーマンスにメリットがあります。各タスクが別のプロセッサで実行されている場合、共有メモリの同期にはコストがかかります。
*簡略化。 CLONE_THREADシグナル配信を共有させます(CLONE_SIGHANDシグナルハンドラテーブルを共有する必要があります)。
**簡略化。SYS_forkとSYS_clonesyscallの両方が存在しますが、カーネルでは、sys_forkとsys_cloneはどちらも同じdo_fork関数の非常に薄いラッパーcopy_processです。それ自体がの薄いラッパーです。はい、用語はprocess、thread、およびtaskLinuxカーネルではなく、交換可能に使用されます...