/ ,' 3

https://twitter.com/gorlemkun

マルチスレッドことはじめ

CPUはコア数ひとつにつきひとつの処理しか扱えない

ひとつの処理の単位はスレッド

  • スレッドがたくさんあれば、それぞれのスレッドを並行に処理出来る
    • 処理の文脈での並行(Parallelism)と並列(Concurrency)は厳密には違うらしいので注意
    • ただ、文脈によっては違わないこともあるようなので警察にはならないように。
    • 同じ時系列で同じ種類の処理を行うのが並行で、短時間で切り替えながら2個の処理を終えるのが並列という理解。
  • すなわちCPUのコアひとつひとつにスレッドを割り当てて並行処理ができてかっこいい。

スレッドの元にはプロセスがおり、プロセスにはたくさんスレッドがぶら下がる

  • プロセス
    • スレッド
    • スレッド
    • スレッド
  • みたいな感じ
  • ただしこういう状態になるのはマルチスレッド対応のアプリケーションのみで、大体はシングルスレッドで動く。

プロセスを起動する時には、メモリの確保が必要

  • OSがプロセスを起動するタイミングで割り当ててくれる
  • すなわちCPUが処理していたプロセスをやめて、新たなプロセスを開始するにはコストがかかる

複数のプロセスでメモリを共有することはない

  • OSはプロセス別にメモリを割り当てる

一つのプロセス上にぶら下がるスレッド達には、同じメモリ空間が見えている

  • マルチコアのCPUはそれぞれを並行に処理できる
  • 同じメモリ空間の上に居るのでスレッド同士でデータを共有することもできる
  • 互いに影響を及ぼし合わないプロセスはスレッドセーフであるといえる
  • (意図せず?)影響を及ぼし合うプロセスはスレッドセーフでない
  • もうプロセスにメモリが割り当てられた後なので、同じプロセス下に居るスレッドが新たに開始するぶんにはメモリ確保のコストはプロセスを用意するのに比べるとかからない

参考

(こういうことわかりやすく解説してくれる方々本当にすくないので超たすかります)

moro-archive.hatenablog.com

絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)

そしてこういうことがわかってくると、各言語の並列処理対応度や、アプローチの良さ悪さがだんだん評価できるようになってくる。