linux 工作隊列 補充

來源:互聯網
上載者:User

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

 

什麼是workqueue?

Linux中的Workqueue機制就是為了簡化核心線程的建立。通過調用workqueue的介面就能建立核心線程。並且可以根據當前系統CPU的個數建立線程的數量,使得線程處理的事務能夠並行化。

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

 

Workqueue機制的實現

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

<!--[if !supportLists]-->1、          <!--[endif]-->cpu_workqueue_struct結構。該結構將CPU和核心線程進行了綁定。在建立workqueue的過程中,Linux根據當前系統CPU的個數建立cpu_workqueue_struct。在該結構主要維護了一個任務隊列,以及核心線程需要睡眠的等待隊列,另外還維護了一個任務上下文,即task_struct。

<!--[if !supportLists]-->2、          <!--[endif]-->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對象,然後在該隊列中進行調度,使用更加方便。

 

 

 

Workqueue編程介面

序號

介面函數

說明

1

create_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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.