首先了解workqueue:
linux的工作佇列(workqueue)是另外一種將工作推後執行的形式,它和軟中斷、tasklet 這兩種下半部機制都有不同。工作佇列可以把工作推後,交由乙個核心執行緒去執行,也就是說,這個下半部分可以在程序上下文中執行。這樣,通過工作佇列執行的**能佔盡程序上下文的所有優勢。最重要的就是工作佇列允許被重新排程甚至是睡眠。
那麼,什麼情況下使用工作佇列,什麼情況下使用tasklet。如果推後執行的任務需要睡眠,那麼就選擇工作佇列。如果推後執行的任務不需要睡眠,那麼就選擇tasklet。另外,如果需要用乙個可以重新排程的實體執行你的下半部處理,也應該使用工作佇列。它是唯一能在程序上下文執行的下半部實現的機制,也只有它才可以睡眠。這意味著在需要獲得大量的記憶體時、在需要獲取訊號量時,在需要執行阻塞式的i/o操作時,它都會非常有用。如果不需要用乙個核心執行緒來推後執行工作,那麼就考慮使用 tasklet。
我們地任務就是建立乙個工作者執行緒來處理我們的工作。我們的工作就是在 5 秒鐘之後列印乙個"i'm running"的資訊。
備註://workqueue_struct
是雙向迴圈鍊錶。裡面的單元是
work_struct
//工作佇列子系統是乙個用於建立核心執行緒的介面,通過它建立的核心執行緒被稱作工作者執行緒(worker thread)。
以下是**:
#include
#include
#include
module_license("gpl");
module_author("lovelyc");
module_description("this is a test module");
static struct workqueue_struct *queue = null;//工作佇列
//static struct work_struct work;
//原因詳見:
static struct delayed_work work;//表示工作的結構,因為我的是2.6.32版本的ubantu
//work handle
void work_handle(void *data)
static int init_workqueue(void)//模組裝載時處理函式
printk("create xaut's workqueue ok\n");
init_delayed_work(&work, work_handle);//引數是工作和工作處理函式
//init_work(&work,work_handle);
queue_delayed_work(queue,&work,5000);
return 0;
}static void exit_workqueue(void)//模組解除安裝時處理
module_init( init_workqueue );
module_exit( exit_workqueue );
此外有幾篇部落格是關於workqueue的,推薦:
很好,全,學習!)
workqueue小結於:2023年4月20日22:59:16
Linux 工作佇列
工作佇列 work queue 是另外一種將工作推後執行的形式,它和tasklet有所不同。工作佇列可以把工作推後,交由乙個核心執行緒去執行,也就是說,這個下半部分可以 在程序上下文中執行。這樣,通過工作佇列執行的 能佔盡程序上下文的所有優勢。最重要的就是工作佇列允許被重新排程甚至是睡眠。那麼,什麼...
linux工作佇列
在linux核心中,對下半部 或者說推後執行的工作 的處理方式有好幾種,包括bh bottom half 軟中斷,tasklets和工作佇列等等。在2.6核心中,大名鼎鼎的bh處理被廢除,新增了更方便的工作佇列。工作佇列的方便之處在於它把工作推後,交由乙個核心執行緒去執行,這個核心執行緒總會在程序上...
linux工作佇列
linux工作佇列 1.功能描述 工作佇列 work queue 是linux kernel中將工作推後執行的一種機制。這種機制和bh或tasklets不同之處在於工作佇列是把推後的工作交由乙個核心執行緒去執行,因此工作佇列的優勢就在於它允許重新排程甚至睡眠。2.工作佇列結構體 typedef vo...