Linux kernel 中的work queue原理

來源:互聯網
上載者:User

 

 

分成兩大部分,第一部分是用來執行work queue中每個節點上掛載的函數的核心線程,第二部分是從驅動程式的角度看work queue的使用。

第一部分 worker_thread核心線程
Linux系統啟動期間會建立一名為worker_thread線程,該線程建立之後就處於sleep狀態。這裡所謂的核心線程,從調度器的角度就是一可以調度的進程,從代碼的表現形式看,就是一函數。系統建立的這個worker_thread線程基於一workqueue_struct結構變數上(該結構體變數的成員name為"events").

第二部分 work queue的使用
1.只考慮使用系統的keventd管理的工作隊列
驅動程式調用schedule_work向工作隊列遞交新的工作節點,schedule_work內部會喚醒worker_thread核心線程(使之進程狀態為可調度)。在下一次進程調度時刻,worker_thread被調度執行,其主要任務便是調用它所管理工作隊列中每個工作節點上掛載的函數,調用完畢該工作節點會從任務隊列中被刪除。當所有節點上的函數調用完畢,worker_thread繼續sleep,直到schedule_work再次被某個驅動程式調用。
與使用驅動程式自己建立的工作對列的區別是:schedule_work內部是調用queue_work(keventd_wq, work),而使用驅動程式自己建立的工作隊列在調用queue_work時的第一個參數是驅動程式自己建立的工作隊列。

2.驅動程式使用自己建立的工作隊列
這種情況驅動程式調用create_workqueue。該函數的原理跟1中基本是一樣的,只不過再會建立一個核心進程,該核心進程的核心功能名字依然為worker_thread,只不過這個worker_thread工作在新的屬於驅動程式自己的工作隊列。
使用方法是:
a. 調用create_workqueue產生屬於驅動程式自己的work queue. struct workqueue_struct *my_workqueue = create_workqueue("my_workqueue");
b.調用queue_work象a中產生的my_workqueue中註冊工作節點, queue_work(my_workqueue, work)

這兩種情況下的核心線程其實都是利用了一個名為kthreadd的核心線程來建立工作隊列的worker_thread,其本質是向全域列表kthread_create_list中加入相應的核心線程函數節點,由kthreadd來負責建立進程架構,然後運行kthread_create_list中加入的節點上的核心線程函數。
向kthread_create_list中每加入一個核心線程函數節點,都會喚醒kthreadd線程。

當等待隊列是空時,worker_thread會睡眠在該等待隊列中。當driver調用queue_work時,再向等待隊列中加入工作節點的同時,會喚醒睡眠在該等待隊列上的worker_thread線程。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.