Windowsにこういう記述があり、コア?論理プロセッサー?、L1,2キャッシュ??
となったのでざっくりとどういうものなのかを調べたのでメモしておきます。
厳密には誤りがあるかもしれませんが現段階では理解できないので追々わかってきたら加筆修正していきます。
あんまりよくわからなかった部分には
※よくわからなかった部分 と書かれています。
概念的な部分
プログラム
実行可能なコード(命令)とデータを含むファイル。
プログラム自体は静的なもので実行されるまで動作しない
プロセス
実行中のプログラムを指す。
プログラムがメモリ上にロードされて実行されている状態のことを総合的に差すため
- 実行中のコード(プログラムの命令)
- データ(変数とかデータ構造のようなもの)
- ヒープ領域(プロセスのために動的に確保されたメモリ)
- スタック領域(関数呼び出し、局所変数を保存する場所)
がプロセスに含まれるものとする。
スレッド
プロセス内で実行される最小単位。
プロセスが複数のスレッドを持っていると並行処理が可能になる。
各スレッドは独立して実行されるコードやスタックを持っているけど、プロセス全体のリソース、メモリは共有する。
主に共有するもの
- プロセスが持つメモリ空間(プログラムの命令、データ、ヒープが格納されたメモリ)
- リソース(ネットワーク接続などの類)
尚、各スレッドは自分専用のスタックを持っている。
このスタックの中にはスレッドの関数呼び出しや局所変数を保存してある。
また、各スレッドは自分専用のプログラムカウンタや汎用レジスタを持っている。
スレッド間の共有機能
グローバル変数や静的変数はプロセス内のすべてのスレッドにアクセスができ、スレッド間でデータを共有することができる。また、動的に確保したメモリもスレッド間で共有される。(ヒープ領域)
ただし、同時アクセスが増えるとデータを使う際に競合が発生する場合は避けられない(レースコンディション)
ざっくりと考えるとフランス料理店の厨房でいうところのキッチンでの作業そのものがプロセスで、別の作業を行って料理を完成させる人間がスレッドみたいな感じなのだろうか。
調理器具やコンロが誰かに使われていたら確かに料理はできないね。
実行中のプログラムはプロセスと呼ばれて、プロセスは一つ以上のスレッドを持っている。
もっと踏み込んだ概念的な部分
マルチプロセス
複数のプロセスを同時に実行するコンピュータの設計。
マルチプロセスにおいてはプロセスは以下のような特徴を持っている。
独立のメモリ空間
各プロセスで独立したメモリ空間を持っている。
プロセス間でメモリの干渉をしないため、ある一つのプロセスが別のプロセスのデータを変更することがない。
また、各プロセスはリソースを独自に持つため、プロセス間の競合、リソースの干渉が防がれる。
IPC(プロセス間通信)
※よくわからなかった部分
複数のプロセスが協力して作業を行う場合、プロセス間でデータやメッセージといったものを交換しなくてはならない。そのためプロセス間通信により共有することがある。
共有メモリ(プロセス間で共通のメモリ領域を使ってデータを共有する方法の一つで、パイプ、メッセージキュー、ソケットなど)を使って通信する。
ここでいう共有メモリは複数のプロセスが同じメモリ領域にアクセスしてデータを共有するというものだろうか?
プロセス間で協調動作を可能にする反面、複雑な通信を行う場合もあるので負荷(オーバーヘッド)がかかることが課題らしい。
コンピューターがマルチコアの場合、複数のプロセスやスレッドを同時実行できる。
逆にシングルコアであった場合は単一のプロセスやスレッドを実行して後を待つことになる。
マルチスレッド
※よくわからなかった部分
一つのプロセスで複数のスレッドが動くことを指す。
並行して処理を行うため、複数のタスクを同時に処理することができ、メモリのリソースを共有するためオーバーヘッドも少ない。
ただし、データを共有する場合にはデータの状態は同期されていないと不整合を起こすので、ここを調整するのが難しい。
Goでやったスレッドセーフ(スレッド間でのデータ競合や整合性の問題を防ぐために、同期のメカニズムやロックを用いて設計されたもの)はたぶんここの事を言ってるのかな?
マルチプロセスとマルチスレッドの差異
マルチプロセス
- 各プロセスが独立、異なるメモリ空間を持っている。セキュリティや実行時の安全性が保障される
- IPCを使ってデータ、メッセージなどをやり取りする。
リソースの利用効率はマルチスレッドと比較すると低く、占有率は高いものの、安全性が高くなる場合がある。
マルチスレッド
- 同じプロセス内で複数のスレッドを並行して実行、メモリ空間やリソースも共有。
スレッド間の通信はマルチプロセスと比べると効率的に行うけど、メモリの整合性や同期の管理を徹底した設計にしないといけないため安全性が懸念される可能性がある。
概念的な部分2章
プロセッサー
中央処理装置(CPU)、こんぴゅーたーののうみそ、命令をもとに、計算、処理、実行を行う部分。
マルチプロセッサ
効率よく処理を行うために1つのコンピュータに複数のプロセッサを載せたものを指す。
初期のコンピューターは各半導体に一つのプロセッサーを搭載することが多く、マルチプロセッサーにするためには数に応じて設置しなければならなかったが、半導体の研究が進むにつれ、一つの半導体チップに複数のプロセッサーを搭載できるようになった。
これらをコアと呼ぶことになり、マルチコアなCPUが近年では搭載されることが多い。(マルチコアプロセッサー)
各スレッドはコアに対して命令を与える。
HTT(SMT)
Hyper Threading Technology (Simultaneous Multi-Threading)
SMTは一つのコアに対して複数のスレッドを割り当てることができる技術。 HTTはIntelがその技術を適えるために作られたシステム。
CPUの処理の中で余剰リソースがあることを着目し、ここを上手に利用することによって本来のコア数よりも多くスレッドを割り当てられるようになった。
これらの技術を使ってスレッドに対して割り当てることができる理論上のコアのことを「論理コア」や「仮想コア」と呼ぶ。
マルチコアプロセッサー
マルチコアプロセッサーの場合コアは複数存在し、二次キャッシュ以降のメモリやインターフェイスを共有する構造を持っている。
二次キャッシュまでは各コアに独立して存在しているため、マルチスレッドで懸念されていた資源の取り合いの問題は比較的発生しずらくなっている。
HTTのデメリット
あくまでHTT(SMT)は効率よくコアに対して処理を行わせるための技術なので、効率の良くないユースケースが発生すると性能が低下する可能性は否めない。
例えば - 物理コア内の仮想コアがそれぞれ別の領域のメモリーに大量にアクセスするようなケース - 同じ種類の計算を行うスレッドが並列に実行されるケース(とりわけ命令が演算ユニットに集中するような場合) - スケジューリングの効率が低下するようなケース
においてはHTTの効果が薄れることがある。
まとめ
コア(物理コア)
プロセッサーを構成する要素
- 物理的なプロセッサーの内部に存在する実際の計算ユニット
- 各コアは独立した一次キャッシュ、二次キャッシュなどのリソースを持っており計算処理を独立して行える。
- マルチコアプロセッサーの場合、複数のタスクやスレッドを並行して処理できる。
論理プロセッサー
- HTT(SMT)等の技術を使い仮想的な処理ユニットで論理的に割り当てられたスレッドを指す。
- スレッド間でリソースを共有しながら複数のスレッドを処理する。
例えばHTTを使用するIntelプロセッサーでは、1つの物理コアが2つの論理プロセッサーを持ち、2つのスレッドを並行して処理
参考にさせていただいた文献
https://www.webimpact.co.jp/banchoblog/?p=2173
HTTについての詳しい解説
https://qiita.com/Kiyo_Karl2/items/858f1b2b5ce55216c446#%E5%8F%82%E8%80%83
マルチプロセッサー、マルチコアについての詳しい解説
コア、スレッド、プロセスに関する詳しい解説
https://qiita.com/suema0331/items/0c2567105cc0835e5e4a
SMTに関する詳細なまとめ
https://bookplus.nikkei.com/atcl/catalog/21/S00190/
CPUの大まかな仕事と仕組みについて