工作佇列的作用:用來代替任務佇列.
他們允許核心函式(像可延遲的函式)啟用,而且稍後由一種叫做工作者執行緒的特殊核心執行緒來執行.
和可延遲函式的不同:
可延遲函式執行在中斷上下文中,不一定在建立它的程序當中執行.
工作佇列中的函式執行在程序上下文中.(但是由核心執行緒來執行)
執行可阻塞函式的唯一方式是在程序上下文中執行.
相同點:
可延遲函式執行時不可能有任何正在執行的程序,而工作佇列又是由核心執行緒來執行的,所以他們都不能訪問使用者態位址空間.
工作佇列的使用.
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之後,工作佇列的資料結構...