お使いのコンピュータは8コアですが、現在数百ものプロセスが実行されています。ここには魔法のような仕組みなどありません。OSのカーネルがCPU時間を非常に細かなスライスに分割し、各プロセスに順番に割り当てているのです。
どこで流れが異なるのか
各プロセスには独自のアドレス空間があります。2つのプロセスは互いのメモリを読み取ることができないため、一方がクラッシュしても、もう一方は正常に動作し続けます。その代わり、データをやり取りするにはパイプ、ソケット、または共有メモリを経由する必要があり、いずれもオーバーヘッドがかかります。
スレッドは同じプロセス内にあり、メモリを共有します。データのやり取りは、単に同じメモリ領域への読み書きを行うだけなので非常に高速ですが、その代わり、競合の処理は自分で行う必要があります。
時間の経過と文脈の変化
- 各スレッドには、通常数ミリ秒のタイムスライスが割り当てられます
- そのスライスが終了すると、カーネルはすべてのレジスタをダンプし、次のスレッドのレジスタを読み込みます。これを「コンテキストスイッチ」と呼びます
- 1回のコンテキストスイッチには数マイクロ秒かかり、さらにCPUキャッシュが冷えることによるオーバーヘッドも加わる
そのため、スレッドを過剰に作成すると処理が遅くなります。CPUは実際の計算ではなく、スレッド間の切り替えにほとんどの時間を費やしてしまうからです。
なぜ100個のタブを開いてもスムーズに動作するのか
タブの大部分は、計算を行わず待機状態にあります。ネットワークの応答を待ったり、ユーザーがマウスでスクロールするのを待ったり、タイマーが切れるのを待ったりしています。待機中のスレッドはCPUを消費せず、イベントが発生するまで、カーネルによってキューから除外されます。
PCの動作が遅くなるのは、CPUの性能不足が原因であることはめったにありません。たいていはRAMが不足しているためディスクへのスワップが行われているか、あるいはあるプロセスがディスクを占有していることが原因です。
自分のパソコンで試してみる
ps -eLf | wc -l # tổng số luồng đang có
vmstat 1 5 # cột cs = số lần chuyển ngữ cảnh mỗi giây
pidstat -w 1 3 # tiến trình nào chuyển ngữ cảnh nhiều nhấtもし cs 毎秒数十万まで増加しているのに、マシンに負荷のかかる処理が行われていない場合、ほぼ間違いなく、無駄にリソースを消費しているソフトウェアが存在します。
Thảo luận