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

在這裏插入圖片描述


轉載聲明:

本文轉自https://www.cnblogs.com/minihaohao/p/5175043.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章