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

2021-07-25 11:47:42 字數 2297 閱讀 9580



**

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)

//開始呼叫工作佇列,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 程式中許多很多情況需要設定延後執行的,這樣工作佇列就很好幫助我們實現。

飯工和碗工

飯工和碗工 飯工和碗工 一看這兩個名詞,你一定費解。聽過鉗工電工清潔工搬運工,或是張工王工,那聽過這個稱謂呀。甭急,這是我的發明,你聽我慢慢道來。我兒子兒媳都在天津工作,住的地方到工作單位較遠。早晨六點半出發,晚上七點後回家。若遇見堵車,回到家就八點多了。他們倆既辛苦又繁忙。我和老伴住在陝西老家,身...

飯工和碗工

飯工和碗工 飯工和碗工 一看這兩個名詞,你一定費解。聽過鉗工電工清潔工搬運工,或是張工王工,那聽過這個稱謂呀。甭急,這是我的發明,你聽我慢慢道來。我兒子兒媳都在天津工作,住的地方到工作單位較遠。早晨六點半出發,晚上七點後回家。若遇見堵車,回到家就八點多了。他們倆既辛苦又繁忙。我和老伴住在陝西老家,身...

飯工和碗工

飯工和碗工 飯工和碗工 一看這兩個名詞,你一定費解。聽過鉗工電工清潔工搬運工,或是張工王工,那聽過這個稱謂呀。甭急,這是我的發明,你聽我慢慢道來。我兒子兒媳都在天津工作,住的地方到工作單位較遠。早晨六點半出發,晚上七點後回家。若遇見堵車,回到家就八點多了。他們倆既辛苦又繁忙。我和老伴住在陝西老家,身...