usleep()函式来计算经过时间的行为怪异(usleep() to calculate elaps

2019-07-19 19:35发布

我计算毫秒的经过使用下面的代码来处理函数每个连续通话时间。 当我使用usleep(1000),即每个呼叫之间1毫秒的时间差是10ms并且当我使用usleep(1000000),即之间的每个呼叫下降到小于1毫秒1秒出奇时间间隔。 以下是代码片段:

    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/time.h>
    #include<unistd.h>

    struct timeval start_time;
    void handler(int);

    int main()
    {
            struct timeval current_time;
            int i=0;
            gettimeofday(&start_time,0);
            gettimeofday(&current_time,0);
            printf("%012.3fms: emulationbegins\n",((current_time.tv_usec-start_time.tv_usec)/1000.0));

            while(i++<5)
            {
                    usleep(1000); // compare with usleep(1000000)
                    handler(i);
            }

            return 0;
    }

    void handler(int i)
    {
            printf("In Handler %d\n",i);
            struct timeval current_time;
            gettimeofday(&current_time,0);
            printf("%012.3fms: Handler Called\n",((current_time.tv_usec-start_time.tv_usec)/1000.0));
            return;
    }

Answer 1:

请记住, tv_usec该领域timeval结构从来就没有到(或以上)百万,而不是秒数增加。

你必须使用tv_sec领域,以及在你的计算。



Answer 2:

usleep指定睡觉至少你给它的量,但它可以睡更长的时间。 有一个关于多久就会入睡,因为操作系统没有运行的过程中,如果有运行更重要的进程几乎没有上限。

在实践中多久分辨率usleep将睡眠是由操作系统使用的时钟决定。 直到几年前,大多数类Unix系统中使用的静态100Hz的定时器(或1024Hz的在某些罕见的情况下)来驱动这样的计时器,所以你usleep就会让四舍五入到最接近的10毫秒。

已经有最近在一些系统上做了删除静态时钟一些工作,虽然这还没有对更高分辨率睡驱动尽可能多的需要,而是由事实不断唤醒CPU进行静态时钟节拍是坏的功耗。 它可以有改善计时器分辨率的副作用,而这又暴露出缺陷在于,所用很短睡,似乎正确运行的应用程序。 突然,有更高的分辨率在超时的usleep / nanosleep / poll / select那些睡眠少的人会导致应用程序纺在CPU重新规划他们睡觉的所有时间。

我不知道今天的这个状态,但是从你的10毫秒,它看起来像你的系统依然采用的是100Hz的时钟,用于其内部定时器或者说,它有意减慢超时到10ms的分辨率,以防止应用程序破坏。



文章来源: usleep() to calculate elapsed time behaves weird