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 就可以看到是交錯在執行.
--
繼前篇 - 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 就可以看到是交錯在執行.
留言
張貼留言