コンテンツにスキップ

CPU時間

出典: フリー百科事典『ウィキペディア(Wikipedia)』
シングルCPUマルチタスクシステムのCPU時間
  CPU color time for program P1

(CPUじかん、: CPU time)またはプロセス時間: process time[注釈 1]は、CPU(中央処理装置)がコンピュータプログラムまたはオペレーティングシステム命令の処理に使用された時間である。これは、入力/出力(I/O)操作の待機や低電力(アイドル)モードへの移行が含まれる経過時間(elapsed time)と対比される。CPU時間は、クロックティックまたは秒の単位で計測される。多くの場合、CPU時間をCPUキャパシティ(最大能力)のパーセンテージとして計測すると便利である。これは、CPU使用率CPU usage)と呼ばれる。CPU時間とCPU使用率には、主に2つの用途がある。

CPU時間は、2つの機能的に同一のアルゴリズムの全体的な経験的効率を定量化するために使用される。たとえば、ソートアルゴリズムは、ソートされていないリストを受け取り、ソートされたリストを返す。これは、指定された入力リストに基づいて決定論的なステップ数で行われる。ただし、バブルソートマージソート実行時の複雑さが異なるため、マージソートはより少ないステップで完了する傾向がある。たとえどちらのアルゴリズムの動作についても知識がなかったとしても、バブルソートのCPU時間がより大きければ、特定の入力データに対してマージソートよりも効率が悪いということはわかる。

このタイプの計測は、複雑さが自明ではないようなアルゴリズムを比較する場合に特に役立つ。この場合、実測時間(実際の経過時間)[注釈 2]は関係ない。CPUの温度などの現実世界の変数や、プロセスの優先度などの他のオペレーティングシステム変数に応じて、コンピュータによるプログラムの実行速度は遅くなったり速くなったりすることがある。

CPU使用率は、プロセッサがコンピュータプログラム間でどのように共有されているかを定量化するために使用される。単一のプログラムによるCPU使用率が高い場合は、処理能力が非常に要求されているか、誤動作している可能性がある(たとえば無限ループに陥っているなど)。CPU時間により、単一のプログラムが必要とする処理能力を計測できるため、入力を待機して実行された時間や、他のプログラムを実行できるように一時停止された時間などの干渉が排除される。

対照的に、経過実時間(または単に実時間、ウォールクロック時間)は、通常の時計によって計測されるような、コンピュータプログラムの開始から終了までの所要時間である。経過実時間には、I/O時間、マルチタスク遅延、およびプログラムによって発生する他のすべてのタイプの待機が含まれる。

区分

[編集]

CPU時間またはCPU使用率は、スレッドごと、プロセスごと、またはシステム全体のいずれかで報告される。さらに、CPUが正確に何をしていたかに応じて、報告される値は次のように細分化できる。

  • ユーザー時間は、CPUがユーザー空間でコードを実行するのに忙しかった時間を指す。
  • システム時間は、CPUがカーネル空間でコードを実行するのに忙しかった時間。この値がスレッドまたはプロセスについて報告されている場合は、たとえば、スレッドがシステムコールを発行した後など、実行中のコンテキストに代わってカーネルが作業を行っていた時間を表す。
  • アイドル時間idle time、システム全体のみ)は、CPUがビジーでない時間、またはCPUがシステムアイドルプロセスを実行した時間。アイドル時間は、実際には未使用のCPUキャパシティを計測する。
  • スチール時間steal time、システム全体のみ)は、仮想化ハードウェアでは、オペレーティングシステムが実行を望んでいたが、ハイパーバイザーによって実行が許可されなかった時間[3]。これは、物理ハードウェアが複数のゲストオペレーティングシステムを実行していて、ハイパーバイザーがCPUタイムスロットを別のタイムスロットに割り当てることを選択した場合に発生する可能性がある。

CPU時間のUnixコマンド

[編集]
UnixライクなGNU / Linux )システムでのさまざまなプロセスのCPU時間のtopの表示。

Unixコマンド top

[編集]

Unixコマンドtopは、すべてのプロセスのCPU時間、優先度、経過リアルタイム、およびその他の情報を提供し、それをリアルタイムで更新する。

Unixコマンド time

[編集]

Unixコマンドtimeは、UnixプロセスのCPU時間と経過リアルタイムを出力する。

% gcc nextPrimeNumber.c -o nextPrimeNumber
% time ./nextPrimeNumber 30000007
Prime number greater than 30000007 is 30000023
0.327u 0.010s 0:01.15 28.6%     0+0k 0+0io 0pf+0w

このプロセスには合計0.337秒のCPU時間がかかり、そのうち0.327秒がユーザースペースで費やされ、最後の0.010秒がプロセスに代わってカーネルモードで費やされた。経過実時間は1.15秒。

以下は、上記の例で使用されたアプリケーション nextPrimeNumber のソースコード(C99以降を想定)。

// nextPrimeNumber.c
#include <stdio.h>
#include <stdlib.h>

int isPrimeNumber(unsigned long int n) {
    for (int i = 2; i <= (n >> 1); ++i)
        if (n % i == 0) return 0;
    return 1;
}

int main(int argc, char *argv[]) {
    unsigned long int argument = strtoul(argv[1], NULL, 10), n = argument;
    while (!isPrimeNumber(++n));

    printf("Prime number greater than %lu is %lu\n", argument, n);
    return 0;
}

関連項目

[編集]

脚注

[編集]

注釈

[編集]
  1. ^ 処理時間(: processing time)とは異なるニュアンスを持つ。
  2. ^ 実時間、壁時計時間(wall-clock timeまたはwall time)とも呼ばれる[1][2]

出典

[編集]

外部リンク

[編集]
  • Thimmannagari, Chandra (2005-01-01). CPU Design: Answers to Frequently Asked Questions. Springer. p. 68. ISBN 0-387-23799-2. https://archive.org/details/cpudesignanswers00thim_0/page/68