歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux work queue工作隊列小結與使用

Linux work queue工作隊列小結與使用

日期:2017/3/1 10:09:18   编辑:Linux編程

1、linux內核中斷處理的工作隊列workqueue機制

工作隊列(workqueue)是另外一種將工作 推後執行的形式。工作隊列可以把工作推後,交由一個內核線程去執行,也就是說,這個下半部分可以在進程上下文中執行。 這樣,通過工作隊列執行的代碼能占盡進程上下文的所有優勢。最重要的就是工作隊列允許被重新調度甚至是睡眠。
那麼,什麼情況下使用工作隊列,什麼情況下使用tasklet。如果推後執行的任務需要睡眠,那麼就選擇工作隊列。如果推後執行的任務不需要睡眠,那麼就選擇tasklet。另外,如果需要用一個可以重新調度的實體來執行你的下半部處理,也應該使用工作隊列。它是唯一能在進程上下文運行的下半部實現的機制,也只有它才可以睡眠。這意味著在需要獲得大量的內存時、在需要獲取信號量時,在需要執行阻塞式的I/O操作時,它都會非常有用。如果不需要用一個內核線程來推後執行工作,那麼就考慮使用tasklet。

2、work queue API

1、create_workqueue用於創建一個workqueue隊列,為系統中的每個CPU都創建一個內核線程。輸入參數:

@name:workqueue的名稱

2create_singlethread_workqueue用於創建workqueue,只創建一個內核線程。輸入參數:

@name:workqueue名稱

3destroy_workqueue釋放workqueue隊列。輸入參數:

@ workqueue_struct:需要釋放的workqueue隊列指針

4schedule_work調度執行一個具體的任務,執行的任務將會被掛入Linux系統提供的workqueue——keventd_wq輸入參數:

@ work_struct:具體任務對象指針

5schedule_delayed_work延遲一定時間去執行一個具體的任務,功能與schedule_work類似,多了一個延遲時間,輸入參數:

@work_struct:具體任務對象指針

@delay:延遲時間

6queue_work調度執行一個指定workqueue中的任務。輸入參數:

@ workqueue_struct:指定的workqueue指針

@work_struct:具體任務對象指針

7queue_delayed_work延遲調度執行一個指定workqueue中的任務,功能與queue_work類似,輸入參數多了一個delay。

3、實例分析 為我所用

//聲明

static struct workqueue_struct *mdp_pipe_ctrl_wq; /* mdp mdp pipe ctrl wq */

static struct delayed_work mdp_pipe_ctrl_worker;

//driver int時創建 工作隊列

mdp_pipe_ctrl_wq = create_singlethread_workqueue("mdp_pipe_ctrl_wq");//創建工作隊列

INIT_DELAYED_WORK(&mdp_pipe_ctrl_worker,mdp_pipe_ctrl_workqueue_handler);/

/delayed_work與task_func綁定。

//處理函數

static void mdp_pipe_ctrl_workqueue_handler(struct work_struct *work)
{
mdp_pipe_ctrl(MDP_MASTER_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
}

//開始調用工作隊列,delay時間到了就執行處理函數。

unsigned long mdp_timer_duration = (HZ/20); /* 50 msecond */

/* send workqueue to turn off mdp power */

queue_delayed_work(mdp_pipe_ctrl_wq,&mdp_pipe_ctrl_worker, mdp_timer_duration);

/* cancel pipe ctrl worker */

cancel_delayed_work(&mdp_pipe_ctrl_worker);

/* for workder can't be cancelled... */

flush_workqueue(mdp_pipe_ctrl_wq);

/* for workder can't be cancelled... */

flush_workqueue(mdp_pipe_ctrl_wq);

在driver 程序中許多很多情況需要設置延後執行的,這樣工作隊列就很好幫助我們實現。

Copyright © Linux教程網 All Rights Reserved