(一)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,時間輪算法等。
轉載聲明: