linux驅動中的工作佇列理解

2022-03-28 08:42:15 字數 1838 閱讀 8604

工作佇列的作用:用來代替任務佇列.

他們允許核心函式(像可延遲的函式)啟用,而且稍後由一種叫做工作者執行緒的特殊核心執行緒來執行.

和可延遲函式的不同:

可延遲函式執行在中斷上下文中,不一定在建立它的程序當中執行.

工作佇列中的函式執行在程序上下文中.(但是由核心執行緒來執行)

執行可阻塞函式的唯一方式是在程序上下文中執行.

相同點:

可延遲函式執行時不可能有任何正在執行的程序,而工作佇列又是由核心執行緒來執行的,所以他們都不能訪問使用者態位址空間.

工作佇列的使用.

1.  建立

2.  提交佇列

3.  刪除

建立:建立分為工作佇列的建立和工作函式(任務)的建立.

(1)  工作佇列的建立需要有其描述符,它的資料結構是 workqueue_struct.該結構定義在中.這裡我們不需要關心它的具體組成,核心已經寫好了兩個兩個函式幫我們建立佇列:

struct workqueue_struct *create_workqueue(const char *name);

struct workqueue_struct * workqueue_singlethread_workqueue(const char *name);

他們的區別在於實際處理器的多少,如果是單核處理器的話,他們毫無區別.

因為每個工作佇列都有乙個或多個(多核處理器)專用的程序(核心執行緒),這些程序執行提交到該工作佇列函式.

create_workqueue核心會在系統中的每個處理器上為該工作佇列建立專用的執行緒.這樣,如果工作佇列足夠多的話,可能對系統的效能有所殺傷,而create_singlethread_workqueue則只會建立乙個專用的執行緒.所以,如果單個工作執行緒足夠使用,推薦使用第二個函式來建立工作佇列.

同樣的,工作任務的建立也需要有其描述符,它的資料結構是work_struct.核心同樣為我們建立好了幾個巨集來方便的建立它.

declare_work(name,void(*function)(void *),void *data);

用於在核心編譯時使用.

init_work(struct work_struct *work,void(*function)(void *),void *data);

用於在系統執行時建立.首次建立時使用它.

prepare_work(struct work_struct *work,void(*function)(void *),void *data);

用於在系統執行時建立.沒有init_work初始化徹底,因為它不會初始化用來將work_struct結構連線到工作佇列的指標.如果結構已經被提交到工作佇列,而只是需要修改該結構,則應該使用prepare_work而不是init_work.

提交:如果要將工作提交到工作佇列,則可使用如下兩個函式之一:

int queue_work(struct workqueue_struct *queue,struct work_struct *work);

int queue_delayed_work(struct workqueue_struct *queue,struct work_struct *work,unsigned long delay);

它們都會將work新增到給定的queue.但是如果使用queue_delayed_work,則實際工作至少會在經過指定的jiffies(由delay指定)之後才會執行.如果工作被成功新增到佇列,則上述函式的返回值為1,返回值為非零意味著給定的work_struct結構已經等待在該佇列中,從而不能兩次加入該佇列.

刪除:結束對工作佇列的使用後,可呼叫下面的函式釋放相關資源.

void destroy_workqueue(struct workqueue_struct *queue);

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