プログラムはCPUを好きなタイミングで使うことはなく処理待ちしているのが普通です。
CPU時間はプログラムが処理するためにやっと掴んだCPUを占有する時間の累計。そのCPUを『だれが』使うかでユーザーCPU時間とシステムCPU時間に分かれます。
かんたんに分かりやすく、関係とちがいを説明します。
CPU時間とは?
プログラムはCPUで処理します。そのとき、処理で使う分のCPUをほかのプログラムに使われないように独り占めします。
その占有している時間をCPU時間といいます。
プログラムが処理するのに必要なCPUの量(時間)ですね?
もちろん、CPUの性能が高くてOSが効率よくさばけばCPUを使う時間は短くなります。
(CPUを使う量が減るわけではない。)
ユーザーCPU時間とシステムCPU時間
CPUはアプリケーション(プログラム)が使うときと、OS(システム)が使うときがあります。
プログラム | ユーザーCPU時間 |
OS | システムユーザー時間 |
OSのカーネルがCPUをだれが使うのか判断します。
カーネル(kernel)
アプリケーションとハードウェア(CPU, メモリ, HDD/SSD)の間のデータや処理のやりとりをコントロールする、OSの中核機能。
カーネルはコマンド群をもっており、アプリケーションからOSに処理をまかせるときや、OSで直接コマンド入力して操作するのに使う。
システムコールという。
ユーザーCPU時間
ユーザーCPU時間は分かりやすいです。実行するアプリケーションが使うCPU時間のこと。
アプリケーションが占有している間、システムにもほかのアプリケーションにも影響されません。
PHPやJavaなどいろいろなプログラム言語でアプリケーションを作りますが、そのプログラムが使うCPU時間です。
アプリケーションプログラムには必ず実行権限のユーザーを割り当てます。
アプリの運営者と言ったところ。
その運営者が専有するCPU時間です。
システムCPU時間
システムCPU時間はOS(オペレーティングシステム)が使うCPU時間です。
と思うかもしれません。
細かいことをいえば、システムCPU時間はOSカーネルのシステムコールが使うCPU時間です。
(カーネルのシステムコールは、OSが処理するのに使う原始的なプログラムのコマンド。)
Linuxを使うときにコマンド入力しますよね?あれがシステムコールのコマンドです。
コマンドプロンプトで入力するコマンドといったほうが分かりやすいかも。
システムCPU時間はシステムがCPUを占有するので、ほかのシステムの処理やアプリケーションが使うシステムコールに影響されます。
システムCPU時間はシステムコールが使うCPU時間。
システムコールはカーネルに仕事をお願いする命令。
アプリケーションはシステムのCPUを使う
アプリケーションを実行するとき、システムCPU時間は0じゃありません。
アプリケーションを実行するとシステムがなんらかの処理をするからです。
たとえば、
ファイルの読み書き・削除
メモリのコントロール
etc...
OSは効率よくハードウェアを使いまわすように管理するのも大事な仕事なので、ハードウェアまわりの処理はシステムにおまかせします。
アプリケーションの処理のなかには、システムに仕事を丸投げして結果だけをもらうことがけっこうあります。
もちろん、丸投げした先の処理が使うCPUはシステムCPU時間です。
CPU負荷が大きすぎると、OSやアプリケーションがフリーズします。
さっき、アプリが占有しているCPUはほかに影響されないと言いましたが、CPUの量は有限なのでスペックオーバーになると影響を受けます。
フリーズの原因はメモリ不足が多いのですが、CPUの高負荷の原因は大概ファイルの読み書きです。
特に多いのはデータベース。DBはディスクの読み書きを結構しているので、DBアクセスが集中するとCPU負荷が高まりやすい。