定時器的使用和原理淺析,alarm/sleep函數


定時器的使用和原理淺析,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,時間輪算法等。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM