gpt4 book ai didi

由于多个进程导致的linux高分辨率posix定时器延迟

转载 作者:太空狗 更新时间:2023-10-29 12:43:28 26 4
gpt4 key购买 nike

在下面发布的代码中,我使用了高分辨率 posix 定时器 'timer_create' 在每 1 毫秒后定期调用回调函数(posix 定时器说它可以提供微秒延迟)。如果我只运行一个可执行文件的实例,它工作正常并且回调每 1 毫秒被调用一次,但是如果我运行同一个可执行文件的多个实例(比如 10 个实例并且在每个实例中我都配置了 1 毫秒的周期性计时器),那里在每个实例中调用回调函数时会有大约 2 到 4 毫秒的延迟。以下是程序。

            #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <errno.h>

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); }while(0)

unsigned long long old_time = 0, diff = 0;
timer_t timerid;
struct sigaction sa;
struct sigevent sev;
struct itimerspec its;

static void timer_cb(int sig, siginfo_t *si, void *uc)
{
unsigned long long time = 0;
struct timeval tv;

gettimeofday(&tv, NULL);
time = (tv.tv_sec * 1000000) + tv.tv_usec;

if(old_time != 0)
{
diff = time - old_time;
if (diff > 1100)
{
printf("%lld\n",diff);
}
}
old_time = time;
}


int main (void)
{
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_cb;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGRTMIN, &sa, NULL) == -1)
errExit("sigaction");

/* Create the timer */

sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGRTMIN;
sev.sigev_value.sival_ptr = &timerid;

if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1)
errExit("timer_create");

its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 1000 * 1000;

its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 1000 * 1000;

if (timer_settime(timerid, 0, &its, NULL) < 0)
{
errExit("timer_settime");
}

while(1)
{
sleep(10);
}

return 0;
}

上面的代码是否有任何错误导致延迟,或者是否有任何其他方法可以正确实现 1 毫秒的延迟。

最佳答案

您的代码没有任何问题。 Linux 只是不支持开箱即用的用例。 Linux 不是实时操作系统,以毫秒精度运行多个任务绝对属于实时系统领域。有 Linux 的实时扩展,尝试查看 RTWiki .

关于由于多个进程导致的linux高分辨率posix定时器延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33951626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com