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