Tasklets:
- già (khoảng 2,3 Tôi tin)
- có một, API đơn giản dễ hiểu
- được thiết kế cho độ trễ thấp
- không thể ngủ (chạy nguyên tử trong bối cảnh IRQ mềm và được đảm bảo không bao giờ chạy trên nhiều CPU của một bộ xử lý đã cho, cho một tác vụ cụ thể)
hàng đợi công việc:
- là gần đây (giới thiệu trong 2.5)
- có một API linh hoạt (nhiều lựa chọn/cờ được hỗ trợ)
- được thiết kế cho cao độ trễ
- có thể ngủ
Bottom line is: use tasklets cho các mức độ ưu tiên cao, các tác vụ nguyên tử độ trễ thấp vẫn phải thực thi bên ngoài ngữ cảnh IRQ cứng.
Bạn có thể kiểm soát mức độ ưu tiên với các tác vụ bằng cách sử dụng tasklet_hi_enable
/tasklet_hi_schedule
(thay vì các phiên bản không có số _hi
tương ứng). Từ this IBM page:
Tiến độ bình thường có mức ưu tiên được thực hiện thông qua các softirq TASKLET_SOFTIRQ cấp, nơi ưu tiên cao là thông qua việc softirq HI_SOFTIRQ cấp.
...
Các tác vụ từ véc tơ ưu tiên cao được bảo dưỡng trước, theo sau là các vector trên véc tơ thông thường. Lưu ý rằng mỗi CPU duy trì các vectơ softirq thông thường và có mức ưu tiên cao của riêng nó.
Với hàng đợi công việc, khi tạo một, bạn sẽ sử dụng alloc_workqueue
(create_workqueue
bị phản đối) và can pass a flag để xin ưu tiên cao hơn:
WQ_HIGHPRI:
hạng mục công trình của một wq highpri là xếp hàng đợi đến hồ bơi highpri của gcwq mục tiêu.Hồ bơi chủ đề Highpri được phục vụ bởi các chủ đề công nhân với mức độ đẹp cao.
Lưu ý rằng các nhóm chủ đề bình thường và highpri không tương tác với mỗi khác. Mỗi người đều duy trì một nhóm công nhân riêng biệt và thực hiện việc quản lý đồng thời giữa các công nhân của mình.
Tôi không thể trả lời tất cả câu hỏi của bạn, nhưng tôi hy vọng điều này sẽ giúp ích.