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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章