🦑

プロセスとスレッドの概念の違い

2024/01/24に公開

みなさんプロセスとスレッドの違いを説明できますか?
僕はできなくて恥をかいたので反省がてらに記事にしました。

概略

概念的には以下です。

解説

プロセス

プロセスはインスタンスの概念です。
プログラムの実行に必要なプログラムコードとその動作に必要なリソース(メモリ、ファイルハンドル、I/Oデバイスなど)が含まれています。
各プロセスに対して独立したメモリ領域を割り当てるため、他プロセスとのリソースの競合が起きません。
基本的にはCPUコア数とプロセス数は同数にすることが多いです。

スレッド

スレッドはプロセス内部のタスク単位です。
プロセスの中には最低一つのスレッドが含まれます。
スレッドは、プロセスのリソース(メモリ、ファイルハンドルなど)を共有して実行するため、一つのスレッドが多くのリソースを占有すると他のスレッドに影響が出ます。
また、スレッド間での通信も可能です。

プロセス数、スレッド数の決め方

CPUバウンド(CPUの処理能力に依存する)プロセスの場合、プロセス数をCPUコアの数に合わせることが効果的。
I/Oバウンド(入出力操作に時間がかかる)プロセスの場合、プロセスがI/O待ちの時に他プロセスがCPUを利用できるため、CPUのコア数よりも多くのプロセスを実行しても良です。

両方のプロセスの概念がある場合にはプロセス数をそれに合わせて調節する場合があります。
例えばgunicornではワーカー数(プロセス数)として2n+1とするよう指標を出しています。
これはCPUバウンド処理を実行するプロセス+I/Oバウンド処理を実行するプロセスです(+1は不明)
https://docs.gunicorn.org/en/stable/design.html#how-many-workers

Discussion