#プロセス・スレッドの復習
-
プロセスは実行中のプログラム
- 1つのプロセスには、1つのメモリ空間
- プロセス実行する時に必要なデータはメモリで保持されている
-
スレッドはプログラムを命令を逐次実行する部分
- CPUコアを利用する最小単位
- プロセスは1つ以上のスレッドを持つ
-
CPUがプロセスを実行
- プロセスが持っているメモリデータに対して演算する
- OSがCPUからはメモリだけを見ればいいようにしてくれている!
- プロセスは専用のメモリ領域を使う
- スレッドは共有のメモリ領域を使う
マルチスレッドの意義は独立に動かし、かつ同じプロセス内のメモリ空間を共有することができること
#SMT (同時マルチスレッディング)とは
- ある瞬間で並行して実行されている命令数
- Intelではハイパースレッディングという
- 1個のコアで複数のCPUをもつ(CPUは通常だと1コアに1個)
###CPU構造
- 基盤の上にアドレスバス、データバスがあって、CPUがバス上に乗っている
- CPUの中に回路がいっぱいあって中の回路の数で性能が変わってくる
- 計算ごとに回路がある(整数演算、浮動小数演算など)
- CPU内のコードにより**一度に使える回路数は決まっている **
###CPU中の回路全部使ってることはない
- 勿体無い。
- 理由としては、 制御部+演算部に別れていてCPUの制御部は1個しかないから。
- ここで擬似的に1個のコアに制御部を2つ持たせる
- 注意:イメージ図!
- 1個の制御部でいくつかの演算器を使ってもう1個の制御部で空いてる演算器を使う
- こうすると物理的にコア1個でも論理的には2個に見える。これをSMTという
##性能は単純に二倍ではない
- 4コア8スレッドの場合でも、4コアよりは早いが8コアより遅いなど性能は単純比例しない
- ハイパースレッディングの方がコンテキストスイッチは減る
- 1コア2スレッドの場合、2スレッドでCPUを占有できるのでベスト
- 追加でもう1スレッド立ち上げるなど、受け手側=コア側のキャパ超えたら処理は早くならない
##シングルスレッド/マルチスレッド
- 1プロセスで複数のスレッドを使うかどうかは、アプリケーションの作り方
- シングルスレッドは枝分かれしない処理であり、CPUコアをたくさん搭載しても、意味がない
-
マルチスレッドは 1プロセスで複数の処理を並行実行可能
- マルチスレッドでは、あるプロセスに所属するスレッドはメモリ領域を共有するので注意
- 排他制御を行う必要がある
- スレッドのデータは親プロセスのメモリ領域に保持
- スレッド切り替えで利用する仮想アドレス空間の切り替えが起きない(TLBフラッシュ不要)
処理途中で他スレッドの割り込み発生すると結果が正しく反映されない
synchronizedブロックで排他制御
##コンテキストスイッチとは
- SMT:ある瞬間で並行して実行されている命令数
-
マルチタスク:短い時間で並行して実行されているプログラムの数
- マルチタスクによって実行するアプリケーションを細かく切り替え、同時に動いているように見せることができる
- CPUのコンテキストがプロセスに紐づいててプロセスで最後に実行した状態が保存される
- また順番が回ってきたらそのコンテキスト情報を元に処理を継続
-
コンテキストスイッチ:マルチタスク実行時の処理切替のこと
- 例:割り込み処理で一定間隔でタイマー割り込みをかけている時(Thread0~2使用)
- Thread0で0番目の処理が終わった段階で、タイマー割り込み処理をかける
- CPUは割り込みが入ったことで処理を止めて、割り込みプログラム書いたところに処理を飛ばす
- 終了後、 CPUはコンテキストスイッチをかけることで次のThread1に処理を移し処理を実行
- Thread1が終わったらコンテキストスイッチでThread2へと、順にくりかえず
- これを高速にやるとCPUは一度に一個の処理しかできないのにあたかも複数の処理ができるように見える
- 例:割り込み処理で一定間隔でタイマー割り込みをかけている時(Thread0~2使用)
##MMU(Memory Management Unit)とは
- プロセス毎に専用の物理メモリ領域を確保し、その物理領域にアクセスするための仮想アドレスを用意
- メモリにデータを読み書きする際には1つ1つメモリのアドレスを指定する
- 競合しないよう、他のプロセスが使っていないアドレスを探す必要がある
- このメモリ管理の仕事を、プロセッサ内のMMUが行なっている
- プロセスからは仮想アドレスを指定してメモリアクセスを行い、MMUが仮想アドレスから物理アドレスへの解決を行う
##TLBフラッシュとは
- プロセスを切り替えると、仮想アドレス/物理アドレスのマッピングを切り替える必要
- MMUが一回アドレス解決した結果はキャッシュが残っている
- よってプロセスを切り替えるにはMMUのキャッシュをクリア(TLBフラッシュ)する必要
- パフォーマンスへの影響大