定時器的使用和原理淺析,alarm/sleep函數
一、總結
一句話總結:
alarm函數(進程不阻塞):使用alarm函數和signal函數,要注冊信號處理回調函數,就是說進程並沒有被睡眠,處理動作是以信號的形式注冊到內核中,當時間到時,以信號的方式打斷進程,進入信號處理程序。
sleep函數(進程阻塞):sleep函數和usleep函數是將進程阻塞掉,等待硬件定時器時間到達,時間到達后內核再將進程放入就緒隊列,從而將進程喚醒。
select函數(進程阻塞):select函數屬於終端控制篇,或許也可以歸類為接口處理篇。select函數可精確到微妙,且准確。為什么sleect會比usleep精確呢?這可能與select函數內核使用的是比較精確的定時器機制,比如hrtimer等子系統的原因。
二、定時器的使用和原理淺析,alarm/sleep函數
轉自或參考:定時器的使用和原理淺析,alarm/sleep函數
https://www.cnblogs.com/minihaohao/p/5175043.html
alarm,select,sleep函數
(一)alarm函數(進程不阻塞):
設置信號傳送鬧鍾,單位是秒,也就是只能支持到s的精度。且使用的是signal注冊的方式實現函數。
alarm/signal/kill/pause都算作信號處理函數。
使用alarm函數和signal函數,要注冊信號處理回調函數,就是說進程並沒有被睡眠,處理動作是以信號的形式注冊到內核中,當時間到時,以信號的方式打斷進程,進入信號處理程序。
(二)sleep函數(進程阻塞):
sleep函數也算作信號處理函數系列。
sleep函數和usleep函數是將進程阻塞掉,等待硬件定時器時間到達,時間到達后內核再將進程放入就緒隊列,從而將進程喚醒。
(三)select函數(進程阻塞):
select函數屬於終端控制篇,或許也可以歸類為接口處理篇。select函數可精確到微妙,且准確。為什么sleect會比usleep精確呢?這可能與select函數內核使用的是比較精確的定時器機制,比如hrtimer等子系統的原因。
select函數兼具了檢查fd的功能,select函數在檢查fd集不可用后,會schedule將進程睡眠,放設備驅動發現有fd可用后,會喚醒等待在隊列上的進程。當fd都不可用但是超時時間到后,也喚醒等待的進程,返回用戶進程空間。
另一方面,內核需要做的時間管理:
1)提供系統調度所使用的tick中斷
2)維護系統時間
3)維護軟件定時器,高速tcp和多媒體應用要使timer高效精准
為了更好的支持音視頻等需求,提出了hrtimer這個高精度時鍾子系統,為了節約能源,采用了tickless子系統。
內核中有兩種時間:
定時出發滴答的時鍾中斷,時鍾中斷用來維護系統時間,保持設備上的時間的正確性。
時鍾中斷用來控制進程的調度,在每個時鍾中斷的處理函數中,都會處理一遍進程調度隊列,將滿足調度的進程放入就緒隊列中。
時鍾中斷可以用來實現用戶的定時器設置,但是這種方式實現的定時器精度低且代價昂貴。
另一種可編程的控制器,能夠設定時鍾時間並返回中斷
內核使用一系列的子系統兼容舊的機制,支持新的需求,比如tickless方案,hrtimer,時間輪算法等。

