linux工作佇列程式設計

2021-05-28 15:41:25 字數 1536 閱讀 5982

首先了解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...