プロセスとスレッドを作成するためのLinuxシステムコール 質問する

プロセスとスレッドを作成するためのLinuxシステムコール 質問する

私はプロセスとスレッドを作成するための基礎となるシステム コールは実際には同じであり、したがってスレッドよりもプロセスを作成するコストはそれほど大きくありません。

  • まず、プロセス/スレッドを作成するシステム コールが何であるかを知りたいです (サンプル コードまたはリンクはありますか?)
  • 第二に、スレッドの代わりにプロセスを作成する方がコストがかからないと著者が想定するのは正しいでしょうか?

編集:
記事を引用:

pthread をプロセスに置き換えることは、特に pthread とプロセスの両方が同じ基礎システム コールを使用して呼び出される Linux では、驚くほどコストがかかりません。

ベストアンサー1

プロセスは通常 で作成されfork、スレッド (軽量プロセス) は現在では通常 で作成されますclone。ただし、逸話的に、どちらも実行しない 1:N スレッド モデルも存在します。

forkと は両方とも、内部的にclone同じカーネル関数にマップされますdo_fork。この関数は、渡すフラグに応じて、古いプロセスとアドレス空間を共有する軽量プロセス、または別のプロセス (および他の多くのオプション) を作成できます。syscall は、clone多かれ少なかれそのカーネル関数を直接転送するものであり (より高レベルのスレッド ライブラリによって使用されます)、50 年前の従来の Unix 関数の機能をforkラップします。do_fork

重要な違いは、forkアドレス空間の完全な別個のコピーが作成されるという保証です。Basil が正しく指摘しているように、これは現在ではコピーオンライトで行われるため、想像するほどコストはかかりません。
スレッドを作成すると、元のアドレス空間と同じメモリが再利用されるだけです。

ただし、コピーオンライトがあるため、UNIX 系システムでのプロセス作成は一般に「軽量」であると想定すべきではありません。Windows などに比べると多少は軽量ですが、無料にはほど遠いです。
理由の 1 つは、実際のページはコピーされませんが、新しいプロセスにはページ テーブルのコピーが必要であることです。大量のメモリを使用するプロセスの場合、これは数キロバイトから数メガバイトのメモリになります。もう 1 つの理由は、コピーオンライトは目に見えない優れた最適化ですが、無料ではなく、魔法をかけることもできないことです。どちらかのプロセスによってデータが変更されると (これは必然的に発生します)、影響を受けるページに障害が発生します。

forkRedis は、軽量ではないことがわかる良い例です(forkバックグラウンド保存に使用されます)。

おすすめ記事