Linux中的工作佇列

2021-08-22 00:20:54 字數 1427 閱讀 2519

工作佇列(work queue)是linux kernel中將工作推後執行的一種機制。這種機制和bh或tasklets不同之處在於工作佇列是把推後的工作交由乙個核心執行緒去執行,因此工作佇列的優勢就在於它允許重新排程甚至睡眠。

工作佇列是2.6核心開始引入的機制,在2.6.20之後,工作佇列的資料結構發生了一些變化,因此本文分成兩個部分對2.6.20之前和之後的版本分別做介紹。

資料結構:

structwork_struct ;

pending是用來記錄工作是否已經掛在佇列上;

entry是迴圈鍊錶結構;

func作為函式指標,由使用者實現;

data用來儲存使用者的私人資料,此資料即是func的引數;

wq_data一般用來指向工作者執行緒(工作者執行緒參考下文);

timer是推後執行的定時器。

work_struct的這些變數裡,func和data是使用者使用的,其他是內部變數,我們可以不用太過關心。

api:

init_work(_work, _func, _data);

intschedule_work(structwork_struct *work);

intschedule_delayed_work(structwork_struct *work, unsignedlongdelay);

voidflush_scheduled_work(void);

intcancel_delayed_work(structwork_struct *work);

1、初始化指定工作,目的是把使用者指定的函式_func及_func需要的引數_data賦給work_struct的func及data變數。

2、對工作進行排程,即把給定工作的處理函式提交給預設的工作佇列和工作者執行緒。工作者執行緒本質上是乙個普通的核心執行緒,在預設情況下,每個cpu均有乙個型別為「events」的工作者執行緒,當呼叫schedule_work時,這個工作者執行緒會被喚醒去執行工作鍊錶上的所有工作。

3、延遲執行工作,與schedule_work類似。

4、重新整理預設工作佇列。此函式會一直等待,直到佇列中的所有工作都被執行。

5、flush_scheduled_work並不取消任何延遲執行的工作,因此,如果要取消延遲工作,應該呼叫cancel_delayed_work。

Linux中的工作佇列

工作佇列 work queue 是linux kernel中將工作推後執行的一種機制。這種機制和bh或tasklets不同之處在於工作佇列是把推後的工作交由乙個核心執行緒去執行,因此工作佇列的優勢就在於它允許重新排程甚至睡眠。工作佇列是2.6核心開始引入的機制,在2.6.20之後,工作佇列的資料結構...

Linux中的工作佇列

工作佇列 work queue 是linux kernel中將工作推後執行的一種機制。這種機制和bh或tasklets不同之處在於工作佇列是把推後的工作交由乙個核心執行緒去執行,因此工作佇列的優勢就在於它允許重新排程甚至睡眠。工作佇列是2.6核心開始引入的機制,在2.6.20之後,工作佇列的資料結構...

Linux 工作佇列

工作佇列 work queue 是另外一種將工作推後執行的形式,它和tasklet有所不同。工作佇列可以把工作推後,交由乙個核心執行緒去執行,也就是說,這個下半部分可以 在程序上下文中執行。這樣,通過工作佇列執行的 能佔盡程序上下文的所有優勢。最重要的就是工作佇列允許被重新排程甚至是睡眠。那麼,什麼...