內核延遲函數分析

linux內核提供3個函數分別進行納秒,微妙和毫秒延時:

void ndelay(unsigned long nsecs);

void udelay(unsigned long usecs);

void mdelay(unsigned long msecs);

這3個函數的延時原理是忙等待,也就是說在延時的過程中並沒有放棄cpu,根據cpu的頻率進行一定次數的循環。

在內核中對於毫秒級以上的延時,最好不要直接使用mdelay函數,這將無謂的浪費cpu的資源,對於毫秒級以上的延時,內核提供了下列函數:

void msleep(unsigned int millisecs);

unsigned long msleep_interruptible(unsigned int milosecs);

void ssleep(unsigned int seconds);

注:受系統HZ以及進程調度的影響,msleep類似函數的精度是有限的。

1 長延時

在內核中,一個直觀的延時的方法是將所要延遲的時間設置的當前的jiffies加上要延遲的時間,這樣就可以簡單的通過比較當前的jiffies和設置的時間來判斷延時的時間時候到來。針對此方法,內核中提供了簡單的宏用於判斷延時是否完成。

time_after(jiffies,delay); /*此刻如果還沒有到達延時的時間,則返回真,否則返回0*/

time_before(jiffies,delay);/*如果延時還沒有完成,則返回真,否則返回0*/

 

下面兩個函數可以將當前進程添加到等待隊列中,從而在等待隊列上睡眠,當超時發生時,進程將被喚醒:

sleep_on_timeout(wait_queue_head_t *q, unsigned long timeout);

interrupt_sleep_on_timeout(wait_queue_head_t *q, unsigned long timeout);

 

 

 

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章