- 論理CPU上でプロセスが切り替わること
例えば、以下のようなプロセス0で動作するコードがある場合、
<!-- プロセス0で動作 -->
func sample():
foo();
bar();
fooの実行直後にbarが必ずしも動くとは限らない。
fooの実行直後にコンテキストスイッチが発生してCPUが実行するプロセスが切り替わった場合、fooの実行後、少し時間を置いてから(再度コンテキストスイッチが発生してプロセス0に切り替わったタイミングで)barが実行される。
論理CPU上の実行の流れ(時間は右方向)
┌─ プロセス0 ─┐ ┌─ 別プロセス ─┐ ┌─ プロセス0 ─┐
│ foo() 実行 │ │ ... 実行中 ... │ │ bar() 実行 │
└────────────┘ └───────────────┘ └────────────┘
▲ ▲
│ │
コンテキストスイッチ コンテキストスイッチ
(P0 → 別プロセス) (別プロセス → P0)
└──────── この間、P0 は待たされる ────────┘
・foo() の直後に必ず bar() が走るとは限らない
・切り替わった隙に「時間差」が生まれる
処理に時間がかかった場合に、「コンテキストスイッチが発生したかもしれない」という視点を持つのが大切。