先上结论,测试代码附文末:
现象及结论:
-
如果定时器定时长度小于主函数中sleep的时间,那么sleep的睡眠时间将等于定时器定时时长。
-
如果定时器定时长度大于主函数中sleep的时间,那么sleep的睡眠时间保持不变。
原因分析:
sleep
函数是进程阻塞函数,工作时首先将进程阻塞掉,等待硬件定时器事件到达,内核再将进程排入就绪队列,从而唤醒进程。
博主推测,定时器定时时长小于sleep
时长时,当定时器到达定时时间,会同步唤醒进程,相当于sleep
提前结束。
博主对内核编程不太熟悉,不知理解是否正确,如果有误还请各路大佬留言斧正(/手动抱拳)
测试代码:
#include<iostream>
#include<sys/time.h>
#include<signal.h>
#include<unistd.h>//sleep
using namespace std;
void testFun(int a)
{
int t_ = 0;
//测试定时器任务负载对定时精度的影响
// while(1)
// {
// t_ ++;
// if( t_ > 2000000000)
// {
// cout << "t_ = " << t_ << endl;
// struct timeval curtime;
// gettimeofday(&curtime,NULL);
// cout << " curtime.tv_sec:" << curtime.tv_sec << endl;
// cout << " curtime.tv_usec:" << curtime.tv_usec << endl;
// break;
// }
// }
cout << "Hello,Linux timer~" << endl;
//exit(0);
}
int main()
{
struct timeval curtime;
gettimeofday(&curtime,NULL);
cout << "curtime.tv_sec:" << curtime.tv_sec << endl;
cout << "curtime.tv_usec:" << curtime.tv_usec << endl;
struct itimerval timer;
//周期定时器间隔
timer.it_interval.tv_sec =1;
timer.it_interval.tv_usec = 0;//0.5s=500ms=500*1000us
//从设置定时器开始到第一次定时器生效的时间
timer.it_value.tv_sec = 1;//1秒
timer.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &timer, NULL);
signal(SIGALRM, testFun);
int i = 0;
while(1)
{
i++;
//testFun(1);
cout << "背景循环次数:" << i << endl;
//usleep(1000*500);
sleep(10);
};
return 0;
}