Linux编程itimerval计时器结构体问题

我试验了下,设置成1秒间隔,初始也是1秒,为什么最后结果比1秒还大?这什么原理?懂的给讲解下,谢谢。... 我试验了下,设置成1秒间隔,初始也是1秒,为什么最后结果比1秒还大?这什么原理?懂的给讲解下,谢谢。 展开
 我来答
宛莹2T
2014-03-02 · TA获得超过427个赞
知道小有建树答主
回答量:442
采纳率:0%
帮助的人:366万
展开全部

楼主的程序没有用 signal 注册 SIGPROC 对应函数,在 for 循环的时候可能已经发生了多次中断和重置计时器。至于比1秒大,手册中有解释 Timers will never expire before the requested time, but may expire some (short)  time  afterward,  which depends on the system timer resolution and on the system load; see time(7). 


要在1秒间隔调用一个函数,需要加上 signal,比如

#include <signal.h>
#include <sys/time.h>
#include <stdio.h>
#include <time.h>

static struct itimerval a;

void timeover( int event )
{
    struct itimerval b;
    printf( "timeover at %ld\n", time(NULL) );
    getitimer( ITIMER_PROF, &b );
    printf( "sec = %ld, usec = %ld\n", b.it_value.tv_sec, b.it_value.tv_usec );
}

int main()
{
    signal( SIGPROF, timeover );

    printf( "begin at %ld\n", time(NULL) );

    a.it_interval.tv_sec = 1;
    a.it_interval.tv_usec = 0;
    a.it_value.tv_sec = 1;
    a.it_value.tv_usec = 0;

    setitimer( ITIMER_PROF, &a, NULL );

    while(1);

    return 0;
}
追问
我还想问下关于 ITIMER_PROF 和 ITIMER_VIRTUAL的问题。
根据我的理解,PROF是总CPU时间,VIRTUAL是USER时间,PROF-VIRTUAL是内核时间。
那么如果我做像fibonacci这种递归计算,是不是内核时间应该很少?因为中间没有用system call。
不知道我的理解对不对。
多谢回答。
追答

首先说明本人没有试过,下面的说法只是个人理解。

  1. VIRTUAL 只是进程时间,如果进程被系统调度挂起或没有获得时间片则不计入其中

  2. PROF 时间包含 VIRTUAL 时间,此外还包括了系统执行这一进程的相关时间。按个人理解这些额外的时间至少应该包括系统加载程序及相关动态链接时间、和系统调度任务所用时间

  3. REAL 时间是真正的外部时间,不因 CPU 性能和系统调度而改变的绝对时间。


我想 PROC 一定大于 VIRTUAL 时间,但系统调用时间应该两者之中都有包含。递归计算对于两者的差别应该不大。个人见解,请指正

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式