无论优先级高低,实时进程都会优先于SCHED_NORMAL中的所有进程先执行,因为后者里面都是普通的非实时进程。
内核线程的优先级 Linux内核会将大量(并且在不断增加中)工作放置在内核线程中,这些线程是在内核地址空间中运行的特殊进程。大多数内核线程运行在SCHED_NORMAL类中,必须与普通用户空间进程争夺CPU时间。但是有一些内核线程它的开发者们认为它们非常特殊,应该比用户空间进程要有更高优先级。因此也会把这些内核线程放到SCHED_FIFO中去。
那么问题来了,某个内核线程的实时优先级到底该设为多少呢?
要回答这个问题,不仅需要判断这个线程相对于所有其他实时线程是否更加重要,还要跟用户态的实时进程比较谁更重要。这是一个很难回答的问题,更何况在不同的系统和工作模式下这个答案很有可能还会各不相同。
所以一般来说,内核开发人员也就是看心情直接随便选一个实时优先级。
现在的一些内核实时线程如下:
Linux内核实时线程优先级简介Linux内核实时线程优先级简介
最近大神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() 接口https://www.linuxprobe.com/linux-process-priority.html