眾所周知,在任何操作系統中,都必須有一個心跳,作為操作系統的最小的時鐘管理單位
在內核當中,這個心跳叫tick,它是定時器產生的兩次時鐘中斷的間隔,頻率為HZ
在如今有越來越強勁的CPU環境下,HZ在不同的體系下有不同的值
在ARMv8體系下,HZ的值是1000,即每秒鐘1000次tick的變化
還有一個用戶層面經常使用的值是jiffies,它記錄了系統從開機之後的總的tick值,在32位體系下是32位的,一定時間過後會溢出,在64位體系下,我這輩子看不到溢出了
所以在用戶層面上,用64位的jiffies能夠掌握精確的系統運行的時間
內核還有一種時鐘叫實時時鐘,它的主要功能是開機的時候從實時時鐘裡讀出現在的時間,其它時候並無什麼作用
對用戶層面和驅動開發層面用的最多的就是系統定時器了,所謂系統定時器就是設定一個時間,時間到了之後就會觸發某個程序的調用
系統定時器是內核在每個tick中檢查定時器的狀態,如果有到時的就觸發一個軟件中斷,所以系統定時器觸發的程序處於軟件中斷環境中,此時不能使用調度,還要注意資源的競爭
OK,此時定時器就設置好了,時間一到就執行定時處理程序,注意定時處理程序執行一次後定時器功能就沒啦,具體定時時間可以配合jiffies和HZ使用(X×HZ 等於X秒)
可以在定時處理程序中使用
重新使能
不用之後要記得刪除
要注意一個多核情況下的競爭條件
假如在當前CPU執行del_timer,但是在另一個CPU上可能已經運行定時處理程序,這個時候可能就會出現同時訪問timer的情況
能解決這個問題,要注意不要在中斷中使用
內核也提供了如上3個函數進行時間等待,但使用這個函數做長時間等待並不理智
他們使用while循環來消耗CPU時間,其實是浪費了CPU的能力,如果延時時間比較長,應該使用更好的辦法
總結:
內核定時器在驅動程序中經常使用
在對時間延時小並且要求高的情況下使用delay函數
在允許調度,並且延時時間比較長的情況下 用schedule_timeout比較好