2

我正在使用下面的代码计算每次连续调用处理程序函数所经过的时间(以毫秒为单位)。当我使用 usleep(1000) 时,即每次通话之间的 1 毫秒时间差为 10 毫秒,而当我使用 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;
    }
4

2 回答 2

3

请记住,结构的tv_usec字段timeval永远不会达到(或超过)一百万,而是增加了秒数。

您还必须在计算中使用该tv_sec字段。

于 2013-02-13T11:28:30.753 回答
2

usleep被指定至少睡你给它的量,但它可以睡得更久。它休眠的时间几乎没有上限,因为如果操作系统有更重要的进程要运行,它就不必运行您的进程。

实际上,usleep睡眠时间的分辨率取决于操作系统使用的时钟。直到几年前,大多数类 unix 系统都使用静态 100Hz 计时器(或在某些罕见情况下为 1024Hz)来驱动这样的计时器,因此您的睡眠时间总是会四舍五入到最接近的 10 毫秒。

最近在一些系统上做了一些工作来移除静态时钟,尽管这并不是因为需要更高分辨率的睡眠,而是因为不断唤醒 cpu 以获得静态时钟滴答的事实。对功耗不利。它可能会产生提高计时器分辨率的副作用,但这反过来又会暴露应用程序中的错误,这些应用程序使用非常短的睡眠并且表现得很好。usleep突然间,随着///中的超时分辨率的提高,nanosleep那些短暂的睡眠会导致在 cpu 上旋转的应用程序一直在重新安排它们的睡眠。pollselect

我不确定今天的状态是什么,但是从您的 10 毫秒来看,您的系统似乎仍在为其内部计时器使用 100 赫兹时钟,或者它故意将超时减慢到 10 毫秒的分辨率以防止应用程序中断。

于 2013-02-13T12:08:20.770 回答