linux 工作佇列 補充

2021-05-25 15:10:44 字數 2692 閱讀 8430

走入linux的殿堂已經有一年有餘了,在這裡我想將linux的各種實現機制分析一遍,一方面對自己來說也是溫故而知新,另一方面,促進大家的交流,最好能夠給大家一些拋磚引玉的啟迪。我是硬體出身,搞硬體已經好多年了,從是專門軟體開發也接近兩年了,在這一段時間內我越發認為軟硬體協同設計是未來發展的主流,軟硬體的界限越來越模糊,軟硬體的設計思想是相通的,實現方法是各異的,實現的結果上當然也存在較大差別,因此,很有必要做好軟硬體的協同設計。本著這樣的想法,我想將我所認識的linux分析一遍,特別是一些我認為精華和重要的機制,另外在討論過程中,我會插入一些其他的os實現機制,進行對比分析,我把這一類blog文章劃歸為「linux機制分析」,希望大家支援。

linux中的workqueue機制就是為了簡化核心執行緒的建立。通過呼叫workqueue的介面就能建立核心執行緒。並且可以根據當前系統cpu的個數建立執行緒的數量,使得執行緒處理的事務能夠並行化。

workqueue是核心中實現簡單而有效的機制,他顯然簡化了核心daemon的建立,方便了使用者的程式設計,

workqueue機制中定義了兩個重要的資料結構,分析如下:

1、          cpu_workqueue_struct結構。該結構將cpu和核心執行緒進行了繫結。在建立workqueue的過程中,linux根據當前系統cpu的個數建立cpu_workqueue_struct。在該結構主要維護了乙個任務佇列,以及核心執行緒需要睡眠的等待佇列,另外還維護了乙個任務上下文,即task_struct。

2、          work_struct結構是對任務的抽象。在該結構中需要維護具體的任務方法,需要處理的資料,以及任務處理的時間。該結構定義如下:

struct work_struct {

unsigned long pending;

struct list_head entry;                 

void (*func)(void *);                  

void *data;                                 

void *wq_data;                          

strut timer_list timer;                  

當使用者呼叫workqueue的初始化介面create_workqueue或者create_singlethread_workqueue對workqueue佇列進行初始化時,核心就開始為使用者分配乙個workqueue物件,並且將其鏈到乙個全域性的workqueue佇列中。然後linux根據當前cpu的情況,為workqueue物件分配與cpu個數相同的cpu_workqueue_struct物件,每個cpu_workqueue_struct物件都會存在一條任務佇列。緊接著,linux為每個cpu_workqueue_struct物件分配乙個核心thread,即核心daemon去處理每個佇列中的任務。至此,使用者呼叫初始化介面將workqueue初始化完畢,返回workqueue的指標。

在初始化workqueue過程中,核心需要初始化核心執行緒,註冊的核心執行緒工作比較簡單,就是不斷的掃瞄對應cpu_workqueue_struct中的任務佇列,從中獲取乙個有效任務,然後執行該任務。所以如果任務隊列為空,那麼核心daemon就在cpu_workqueue_struct中的等待佇列上睡眠,直到有人喚醒daemon去處理任務佇列。

workqueue初始化完畢之後,將任務執行的上下文環境構建起來了,但是具體還沒有可執行的任務,所以,需要定義具體的work_struct物件。然後將work_struct加入到任務佇列中,linux會喚醒daemon去處理任務。

上述描述的workqueue核心實現原理可以描述如下:

在workqueue機制中,提供了乙個系統預設的workqueue佇列——keventd_wq,這個佇列是linux系統在初始化的時候就建立的。使用者可以直接初始化乙個work_struct物件,然後在該佇列中進行排程,使用更加方便。

序號介面函式說明1

create_workqueue

用於建立乙個workqueue佇列,為系統中的每個cpu都建立乙個核心執行緒。輸入引數:

@name:workqueue的名稱

2create_singlethread_workqueue

用於建立workqueue,只建立乙個核心執行緒。輸入引數:

@name:workqueue名稱

3destroy_workqueue

釋放workqueue佇列。輸入引數:

@ workqueue_struct:需要釋放的workqueue佇列指標

4schedule_work

排程執行乙個具體的任務,執行的任務將會被掛入linux系統提供的workqueue——keventd_wq輸入引數:

@ work_struct:具體任務物件指標

5schedule_delayed_work

延遲一定時間去執行乙個具體的任務,功能與schedule_work類似,多了乙個延遲時間,輸入引數:

@work_struct:具體任務物件指標

@delay:延遲時間

6queue_work

排程執行乙個指定workqueue中的任務。輸入引數:

@ workqueue_struct:指定的workqueue指標

@work_struct:具體任務物件指標

7queue_delayed_work

延遲排程執行乙個指定workqueue中的任務,功能與queue_work類似,輸入引數多了乙個delay。

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...