现在的一些内核实时线程如下:

最近大神Peter Zijlstra又看到有内核开发者随便给内核线程设置优先级,终于看不下去了, 指责这种把内核线程放入SCHED_FIFO的做法毫无意义:
"the kernel has no clue what actual priority it should use for various things, so it is useless (or worse, counter productive) to even try"
所以他发了一个系列[PATCH 00/23] sched: Remove FIFO priorities from modules 把设置内核线程优先级的接口干脆都给删了,省得再有人瞎搞。
这个系列Patch(点击阅读原文可直达)主要做了下面几件事情:
删除了原有的sched_setschedule() / sched_setattr() 接口
增加了
sched_set_fifo(p)
sched_set_fifo_low(p)
sched_set_normal(p, nice)
其中调用sched_set_fifo()会将指定进程放到SCHED_FIFO类中,其优先级为50——这只是min和max之间的一半位置。
对于需求不那么迫切的线程,sched_set_fifo_low()将优先级设置为最低值(1)。
而调用sched_set_normal()会将线程返回给定好的值SCHED_NORMAL类。
通过只留下这三个接口可以避免开发者们再不停地去随机选取内核线程优先级,因为这样本来毫无意义,当然如果需要的话系统管理员还是可以按需调整不同进/线程的优先级。
到目前为止,这个系列Patch已经有不少得到Reviewed-by,相信如果合入后,内核线程混乱的优先级状况会得到持续改善。
Reference
https://lwn.net/Articles/818388/
小讨论:
内核线程和workqueue都可以用来把内核工作推迟执行,你知道他们有什么差异吗? 实际开发中你一般选择用哪种更多呢,欢迎留言讨论~
(END)
