個人的な解釈でのConcurrent Programmingについて
同義語
- マルチスレッド・プログラミング
- 並行プログラミング
スレッドとは
CPUのコアが処理するプロセスのQueue的なものです。
CPUサイクル毎に処理できるスレッドの数は、物理的なコア数に比例しています。
よって、CPUのコア数が4つの場合は
CPUサイクル毎に4つのスレッドを処理することが可能です。
マルチスレッドとは
1つのコアに対して、複数のスレッドの管理をお願いするのがマルチスレッドです。
しかし、処理速度がスレッドの数だけn倍に向上する訳ではありません。
先に述べた通り、CPUサイクル毎で1コアが処理できるスレッドは1つのみです。
Concurrent Programming vs Parallel Programming
Concurrent Programmingは並行したスレッド管理というデザインで問題を解決するのに対して
Parallel Programmingは別のコアを利用し並列で処理するというハードウェアで問題を解決するパラダイムです。
なぜ1つのコアに複数のスレッドを割り当てるのか
理由はリソースを効率よく活用するためです。
スレッド内のプロセスには、CPUバウンド(計算処理)、I/Oバウンド (ネットワーク系、ファイル読み書き) の処理が必要なものがあります。
複数のスレッドを切り替える事により、リソースを効率的に利用してパフォーマンスを向上させることが出来ます。
スレッドはいくつ作れるのか
OS自体やメモリーの上限はありますが、作ろうと思えば結構幾つでも作れます。
しかし、スレッドの管理自体にも多少のメモリーを持っていかれるので無駄に作ることは避けるべきです。
マルチスレッドで注意する点
マルチプロセス(プロセスを別々のコアで処理する)とは対比的に、マルチスレッドの場合はスレッド同士がリソースをシェアする状態になります。
マルチスレッドの場合、各スレッドの実行は順不同なので共有リソースの管理が難しくなってきます。
この際特に気を付けてなければならないのが、デッドロックという現象です。
デッドロックとは、スレッド達が各自の完了を待ち合って、結果的にすべてのスレッドが停止してしまう状態です。体育のバレーであった、お見合いするような状態です。
マルチスレッドが得意な言語
プログラミング言語の中にはマルチスレッドの得手不得手があります。
マルチスレッドが簡単に可能な言語の例は...
- Go
- Elixir
- C#
- Java
一方、マルチスレッドが不得意な言語の代表例がjavascriptです。
どうやってjavascriptはasyncオペレーションを処理するかは、また別の話です。
#参照
https://www.howtogeek.com/194756/cpu-basics-multiple-cpus-cores-and-hyper-threading-explained/
https://www.jstorimer.com/blogs/workingwithcode/7970125-how-many-threads-is-too-many
https://www.tutorialspoint.com/multi-threading-models
https://takuti.me/note/parallel-vs-concurrent/
https://bytearcher.com/articles/parallel-vs-concurrent/