linux中workqueue的實現機制

2021-06-05 21:44:44 字數 2977 閱讀 8743

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 ;

當使用者呼叫

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

物件,然後在該佇列中進行排程,使用更加方便。

序號 介面函式 說明

1create_workqueue

用於建立乙個

workqueue

佇列,為系統中的每個

cpu都建立乙個核心執行緒。輸入引數:

@name

:workqueue

的名稱 2

create_singlethread_workqueue

用於建立

workqueue

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

@name

:workqueue名稱

3 destroy_workqueue 釋放

workqueue

佇列。輸入引數:

@ workqueue_struct

:需要釋放的

workqueue

佇列指標 4

schedule_work

排程執行乙個具體的任務,執行的任務將會被掛入

linux

系統提供的

workqueue

——keventd_wq

輸入引數:

@ work_struct

:具體任務物件指標 5

schedule_delayed_work

延遲一定時間去執行乙個具體的任務,功能與

schedule_work

類似,多了乙個延遲時間,輸入引數:

@work_struct

:具體任務物件指標

@delay

:延遲時間 6

queue_work

排程執行乙個指定

workqueue

中的任務。輸入引數:

@ workqueue_struct

:指定的

workqueue

指標 @work_struct

:具體任務物件指標 7

queue_delayed_work

延遲排程執行乙個指定

workqueue

中的任務,功能與

queue_work

類似,輸入引數多了乙個

delay。

Linux中Workqueue機制分析

走入linux的殿堂已經有一年有餘了,在這裡我想將linux的各種實現機制分析一遍,一方面對自己來說也是溫故而知新,另一方面,促進大家的交流,最好能夠給大家一些拋磚引玉的啟迪。我是硬體出身,搞硬體已經好多年了,從是專門軟體開發也接近兩年了,在這一段時間內我越發認為軟硬體協同設計是未來發展的主流,軟硬...

Linux中Workqueue機制分析

linux中workqueue機制分析 走入linux的殿堂已經有一年有餘了,在這裡我想將linux的各種實現機制分析一遍,一方面對自己來說也是溫故而知新,另一方面,促進大家的交流,最 好能夠給大家一些拋磚引玉的啟迪。我是硬體出身,搞硬體已經好多年了,從是專門軟體開發也接近兩年了,在這一段時間內我越...

Linux中Workqueue機制分析

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