Linux中定时器对sleep的影响

先上结论,测试代码附文末:

现象及结论:

  1. 如果定时器定时长度小于主函数中sleep的时间,那么sleep的睡眠时间将等于定时器定时时长。

    在这里插入图片描述

  2. 如果定时器定时长度大于主函数中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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章