プロセス・スレッド・並列処理
プロセスとスレッド
プロセスやスレッドやマルチスレッドや並列処理など関係ありそうだけど、今まであやふやなまま放置していたので、まとめる。
プロセス
OSが実行しているプログラム。
WordやExcelなどタスクマネージャーで表示されるもの。
プロセスが並行処理されることを「マルチプロセス」と呼ぶ。
スレッド
プログラムの実行単位。
CPUのコアは1コアあたり、1スレッドしか実行できない。そのため、スレッド=CPUコアの処理単位。
ex)画面を描画するスレッド、キー入力を受け取るスレッドなど。
スレッドはプロセスの中に含まれ、1つのプロセスの中で複数のスレッドを動作させることができる。(マルチスレッド)
マルチスレッドにすることでCPUの複数のコアに処理を割り振れるため、シングルスレッドよりも処理を高速化できる。(CPUが複数コアに限る)
プロセスとスレッドの違い
同じメモリ領域を共有するかしないか
プロセスはOSからメモリ領域を割り当てられるため、各プロセスがメモリを共有することはない。
ex)メモ帳に書いた文字がWordに反映されない。スレッドは同じメモリ領域を共有するため、マルチスレッドの場合はメモリの管理をしないとバグが発生する可能性がある。
並列処理(マルチスレッドプログラミング)
複数のスレッドを同時に実行するプログラムを作成することをマルチスレッドプログラミングと呼ぶ。
ただし実際は並行に処理を行っているのではなく、人間には分からない程高速でスレッドの切り替えをして、同時に処理を行っているようにみえている。
using System; using System.Threading; using System.Threading.Tasks; public class TaskSample { public static void Main() { // 並行処理 var task1 = Task.Run(() => ThreadMethod("A")); var task2 = Task.Run(() => ThreadMethod("B")); task1.Wait(); task2.Wait(); } static void ThreadMethod(String str) { for(var i =0; i < 100; i++){ Console.Write(str); }; } }
//値が交互に出力される BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
スレッドセーフ
複数のスレッドで同じリソースにアクセスしようとすると、想定の値にならないバグが発生する可能性がある。このバグを防止することをスレッドセーフと呼ぶ。 リソースを読み取り専用にする、排他制御(スレッドによる書き込み中は他のスレッドからのアクセスを不可にする)をかけるなど