在Linux中用C++实现一个低开销的间隔定时器
Implementing a low-overhead interval timer with C++ in Linux
我正在尝试实现一个后台用户空间程序,该程序将在Linux中每100ms执行各种任务和计算。我可以通过在Linux中使用警报信号来实现这一点,下面的结构是我实现间隔计时器的方式。
void timer_handler (int signum){
printf("In timer handler!n");
}
int main (){
struct sigaction s_action;
struct itimerval timer;
/* Set Up a Timer */
/* Install timer_handler as the signal handler for SIGVTALRM. */
memset (&s_action, 0, sizeof (s_action));
s_action.sa_handler = &timer_handler;
sigaction (SIGVTALRM, &s_action, NULL);
/* Timer configuration for 100ms */
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 100000;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 100000;
/* Set up the timer */
setitimer (ITIMER_VIRTUAL, &timer, NULL);
while(1);
}
然而,由于无限循环,这种方法似乎不是实现这一点的最佳方式(就性能而言)。它显著提高了CPU利用率。一旦它开始在后台运行,我的其他程序的性能就会下降15%。
理想情况下,我想要的是有一个程序,除非计时器中断,否则它将保持睡眠。多线程似乎是一种选择,但我对这个主题没有太多经验。我将感谢任何关于如何以最小的开销实现这样的程序的建议或指针。
读取时间(7)、信号(7),timerfd_create(2)、轮询(2),nanosleep(2)和高级Linux编程。
您的信号处理程序不正确(它不应该调用printf
;它可能调用write
)。
你可以有
while(1) poll(NULL, 0, 1);
但是在用CCD_ 4初始化的文件描述符上使用CCD_。
当然,我认为你相当有信心,每一项周期性任务的持续时间都比这段时间短得多。(例如,每个任务不需要超过50毫秒,但具有100毫秒的周期)。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 虚拟继承的性能开销(如果只有一个基具有数据成员)
- 当类层次结构中只有一个类时,请避免在每个功能呼叫上读取V-Table的开销
- 在Linux中用C++实现一个低开销的间隔定时器
- 当“虚拟”是一个相当大的开销时,有什么经验法则吗
- 在另一个类中定义复杂(大尺寸)的类是否有任何开销
- 静态成员函数会给类增加一个开销