核心延遲操作
核心延遲分為長延遲和段延遲, 長延時一般以jiffies為單位, 短延時則以jiffy為單位, 對於不同延遲應該選用不同的實現方法。
長延遲一般通過硬體時鐘滴答來實現, 對於長延遲,可以使用等待佇列機制
#include long wait_event_timeout(wait_queue_head_t, condition, long timeout); // 休眠時不可中斷
long wait_event_interruptible_timeout(wait_queue_head_t, condition, long timeout); // 可被訊號中斷
#include signed long schedule_timeout(signed long timeout); // 主動放棄cpu timeout時間
應用場景// 等待佇列
wait_queue_head_t wait; // 定義等待佇列
init_waitqueue_head(&wait); // 初始化
wait_event_interruptible_timeout(wait, 0, hz); // 排程,延時
// 主動放棄cpu延時
set_current_state(task_interruptible); // 設定當前程序狀態
schedule_timeout(hz); // 排程,延時
短延遲不依賴時鐘滴答來實現的, 使用軟體迴圈來實現的機制
// 忙等待delay, 常用於不能排程的上下文,例如 中斷, 當使用下列函式實現延時,cpu不排程,仍然停留在該程序上做無用功,浪費cpu時間
#include void ndelay(unsigned long nsecs); // 納秒級
void udelay(unsigned long usecs); // 微秒級
void mdelay(unsigned long msecs); // 毫秒級
// 核心提供sleep介面,是的呼叫者能夠延時的時候主動讓出cpu,實現休眠
void msleep(unsigned int millisecs); // 毫秒級,不可中斷
unsigned long msleep_interruptible(unsigned int millisecs); // 毫秒級,可中斷
void ssleep(unsigned int seconds); // 秒級,不可中斷
ps. 如果能容忍比所請求更長的延遲,則應使用"schedule_timeout"、"ssleep" backbone延遲操作
一 定義乙個function var fun function action 二 利用 delay函式 delay delay function,wait,arguments 類似settimeout,等待wait毫秒後呼叫function。如果傳遞可選的引數arguments,當函式functio...
Linux的核心延遲函式
當核心需要等待乙個比較短的時間間隔時,比方說 有時候裝置驅動器會等待預先定義的若干個微妙的時間直到硬體完成某些操作。由於動態定時器通常有很大的設定開銷和乙個相當大的最小等待時間 1ms 所以裝置驅動器使用它會很不方便。在這些情況下,核心使用udelay 和ndelay 函式 前者接收乙個微妙級的時間...
核心搶占和低延遲
2.8.3 核心搶占和低延遲相關工作 2 如果可以搶占,則需要執行下列步驟 kernel sched.c do while unlikely test thread flag tif need resched 在呼叫排程器之前,搶占計數器的值設定為preempt active。這設定了搶占計數器中的...