new linux device driver - 再談 work queue

收錄在 Ameba 的 100 篇

--
繼前篇 - work queue 2

work queue 其實就是用 thread 方式實作,
所以 Linux kernel 建議 device driver 盡量用 work queue 的方式來做. 

假如我們有兩個 work task , 放到同一個 work queue, 會是甚麼情況呢?

我們做一個簡單的範例 - github

做兩個 work task.
1. 每 100ms 計數顯示一次, 總共 30 次 (3 秒)
2. 每 1s 計數顯示一次, 總共 3 次 (3 秒)



兩個放到同一個 work queue 中


執行可以發現:

hello_init: pid=8235
work_handler1: pid=7838
work_handler1: i=0
work_handler1: i=1
...
work_handler1: i=29
work_handler2: pid=7838
work_handler2: i=0
work_handler2: i=1
work_handler2: i=2

這兩個 work task 因為用同一個 work queue, (work thread, pid 相同)
要整個 work1 做完, 才會做 work2

我們用 smp_processor_id() 看看, 可以發現像 work_handler1 執行時, 並不一定都在同一個 cpu,
如果要指定 cpu, 可以用 queue_work_on(),

但因為是同一個 work_queue, 要第一個 task 做完才會到下一個.
所以如果要兩個 work task 同時跑的話, 就用兩個 work queue.




這樣從 kernel log 就可以看到是交錯在執行.


留言

熱門文章