スレッド/プロセス/タスクの違いは何ですか?
プロセスは、実行されているコンピュータープログラムのインスタンスです。プログラムコードとその現在のアクティビティが含まれています。オペレーティングシステム(OS)に応じて、プロセスは命令を同時に実行する複数の実行スレッドで構成されます。プロセスベースのマルチタスクにより、テキストエディタを使用すると同時にJavaコンパイラを実行できます。単一のCPUで複数のプロセスを使用する場合、さまざまなメモリコンテキスト間のコンテキスト切り替えが使用されます。各プロセスには、独自の変数の完全なセットがあります。
スレッドは、CPU使用率の基本単位であり、プログラムカウンター、スタック、およびレジスタセットで構成されます。実行のスレッドは、コンピュータープログラムのフォークから、同時に実行される2つ以上のタスクになります。スレッドとプロセスの実装はオペレーティングシステムごとに異なりますが、ほとんどの場合、スレッドはプロセス内に含まれています。同じプロセス内に複数のスレッドが存在し、メモリなどのリソースを共有できますが、異なるプロセスはこれらのリソースを共有しません。同じプロセスのスレッドの例は、自動スペルチェックと書き込み中のファイルの自動保存です。スレッドは、基本的に同じメモリコンテキストで実行されるプロセスです。スレッドは、実行中に同じデータを共有できます。 スレッド図、つまりシングルスレッドとマルチスレッド
タスクは、メモリにロードされるプログラム命令のセットです。
短い答え:
スレッドはスケジューリングの概念であり、CPUが実際に「実行」するものです(プロセスは実行しません)。プロセスには、CPU/OSが実行するスレッドが少なくとも1つ必要です。
プロセスは、データ編成の概念です。リソース(状態を保持するためのメモリ、許可されたアドレススペースなど)がプロセスに割り当てられます。
簡単な用語で説明するには
プロセス:プロセスは、関連データで動作するコードとしての命令のセットであり、プロセスは、プログラムがメモリにロードされるとプロセスになる独自のさまざまな状態、スリープ、実行、停止などを持ちます。 CPUが割り当てられると、各プロセスには少なくとも1つのスレッドがあり、sigledスレッドプログラムと呼ばれます。
スレッド:スレッドはプロセスの一部です。プロセスの一部として複数のスレッドが存在できます。スレッドには、独自のプログラム領域とメモリ領域があります。 1つのプロセス内の複数のスレッドは、お互いのデータにアクセスできません。プロセスは、望ましい動作を達成するために、スレッドのシンクロナイゼーションを処理する必要があります。
タスク:タスクは世界中で広く使用されている概念ではありません。プログラム命令がメモリに読み込まれると、人々はプロセスまたはタスクとして呼び出します。現在、タスクとプロセスは同義語です。
process
は、プログラムを起動または開始します。これは、複数の同じアプリケーションを実行できるプログラムのインスタンスです。 thread
は、プロセス内にある実行の最小単位です。プロセスでは、複数のスレッドを実行できます。スレッドを実行すると、タスクが発生します。したがって、マルチスレッド環境では、マルチスレッドが発生します。
実行中のprogram
はprocess
として知られています。プログラムには、任意の数のプロセスを含めることができます。すべてのプロセスには独自のアドレス空間があります。
スレッドはプロセスのアドレス空間を使用します。スレッドとプロセスの違いは、CPUがあるプロセスから別のプロセスに切り替わるとき、現在の情報をプロセス記述子に保存し、新しいプロセスの情報をロードする必要があることです。あるスレッドから別のスレッドへの切り替えは簡単です。
task
は、メモリにロードされた一連の命令です。スレッド自体は、2つ以上の同時実行タスクに自分自身を分割できます。
詳細については、リンクを参照してください: http://www.careerride.com/os-thread-process-and-task.aspx
ウィキから明確な説明
1:1(カーネルレベルのスレッド化)
ユーザーが作成したスレッドは、カーネル内のスケジュール可能なエンティティと1対1で対応しています。[3]これは、可能な限り最も単純なスレッド実装です。 Win32は最初からこのアプローチを使用していました。 Linuxでは、通常のCライブラリがこのアプローチを実装します(NPTLまたは古いLinuxThreadsを使用)。 Solaris、NetBSD、FreeBSDでも同じアプローチが使用されています。
N:1(ユーザーレベルのスレッド化)
N:1モデルは、すべてのアプリケーションレベルのスレッドが単一のカーネルレベルのスケジュールされたエンティティにマップされることを意味します; [3]カーネルはアプリケーションスレッドの知識がありません。このアプローチを使用すると、コンテキストの切り替えを非常に迅速に行うことができ、さらに、スレッド化をサポートしない単純なカーネルにも実装できます。ただし、主な欠点の1つは、マルチスレッドプロセッサまたはマルチプロセッサコンピュータのハードウェアアクセラレーションの恩恵を受けられないことです。同時に複数のスレッドがスケジュールされることはありません。[3]例:スレッドの1つがI/O要求を実行する必要がある場合、プロセス全体がブロックされ、スレッド化の利点を利用できません。 GNU Portable Threadsは、State Threadsと同様に、ユーザーレベルのスレッド化を使用します。
M:N(ハイブリッドスレッド)
M:Nは、M個のアプリケーションスレッドをN個のカーネルエンティティ[3]または「仮想プロセッサ」にマッピングします。これは、カーネルレベル(「1:1」)とユーザーレベル(「N:1」)のスレッド間の妥協です。一般に、「M:N」スレッドシステムは、カーネルコードとユーザースペースコードの両方を変更する必要があるため、カーネルまたはユーザースレッドよりも実装が複雑です。 M:N実装では、スレッドライブラリは、利用可能なスケジュール可能なエンティティでユーザースレッドをスケジュールします。これにより、システムコールが回避されるため、スレッドのコンテキストスイッチングが非常に高速になります。ただし、これにより、複雑さと優先度の逆転の可能性が高まり、ユーザーランドスケジューラとカーネルスケジューラの間の大規模な(そして高価な)調整を行わない最適以下のスケジューリングが行われます。
ウィキペディア は非常にうまくまとめています:
プロセスと比較したスレッド
スレッドは、次の点で従来のマルチタスクオペレーティングシステムプロセスと異なります。
Windows NTやOS/2などのシステムには、「安価な」スレッドと「高価な」プロセスがあると言われています。他のオペレーティングシステムでは、TLBフラッシュを意味するアドレス空間切り替えのコストを除いて、それほど大きな違いはありません。
タスクとプロセスは同義で使用されます。