【问题标题】:Differences between real time, user time, and system time [duplicate]实时,用户时间和系统时间之间的差异[重复]
【发布时间】:2011-08-15 20:10:03
【问题描述】:

可能重复:
What specifically are wall-clock-time, user-cpu-time, and system-cpu-time in UNIX?

以下程序将运行一个命令,然后显示关于它使用了多少时间的各种值:

#include <iostream>
#include <sys/times.h>
using namespace std;

static void pr_times(clock_t, struct tms *, struct tms *);
static void do_cmd(char *);

int main(int argc, char *argv[])
{
    int i;
    setbuf(stdout, NULL);
    for (i = 1; i < argc; i++)
        do_cmd(argv[i]);    /* once for each command-line arg */
    exit(0);
}

    static void
do_cmd(char *cmd)        /* execute and time the "cmd" */
{
    struct tms  tmsstart, tmsend;
    clock_t     start, end;
    int         status;

    printf("\ncommand: %s\n", cmd);

    if ((start = times(&tmsstart)) == -1)    /* starting values */
        cout << "times error" << endl; 

    if ((status = system(cmd)) < 0)     /* execute command */
        cout << "system error" << endl; 

    if ((end = times(&tmsend)) == -1)
        cout << "times error" << endl;                                          
    pr_times(end-start, &tmsstart,
            &tmsend);
    exit(status);
}
    static void
pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend)
{
    static long     clktck = 0;

    if (clktck == 0)    /* fetch clock ticks per second first time */
        if ((clktck = sysconf(_SC_CLK_TCK)) < 0)
            cout << "sysconf error" << endl;
    printf(" real:  %7.2f\n", real / (double) clktck);
    printf(" user:  %7.2f\n",
            (tmsend->tms_utime - tmsstart->tms_utime) / (double) clktck);
    printf(" sys:   %7.2f\n",
            (tmsend->tms_stime - tmsstart->tms_stime) / (double)
            clktck);
    printf(" child user:   %7.2f\n",
            (tmsend->tms_cutime - tmsstart->tms_cutime) /
            (double) clktck);
    printf(" child sys:    %7.2f\n",
            (tmsend->tms_cstime - tmsstart->tms_cstime) /
            (double) clktck);
}

这是一个输出示例:

 real:     1.44
 user:     0.00
 sys:      0.00
 child user:      0.03
 child sys:       0.00

实际时间是总共经过了多少时间,对吗?其他值是什么?

【问题讨论】:

    标签: c++ time process


    【解决方案1】:

    实时是用挂钟测量的时间,即从进程产生到结束的时间。用户时间是在用户模式下进程花费了多少 CPU 时间,sys 是在执行进程请求的操作时在操作系统中花费的 CPU 时间。

    为了提供一些不同的例子来说明这意味着什么,当一个进程调用sleep(10)时,进程中花费的实际时间增加了10秒,但进程本身并没有做任何实际工作,所以用户和系统时间都没有递增。对操作系统的调用,如读取或写入磁盘,获取或释放内存或任何其他操作系统操作将意味着 CPU 正忙于在系统中为该进程工作,因此这将增加 sys 时间(和实时),但不会增加用户时间。在进程内部执行的复杂数学计算将占用用户时间(进程时间),但不会在操作系统中花费任何 CPU 周期,因此它会增加用户时间(和实时),但不会增加系统时间。

    【讨论】:

    • 子用户和系统呢?这些在这个程序中代表什么?
    • @nodeninja 子进程的用户和系统时间(总计,非平均)。
    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2021-02-11
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多