首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >混乱的Linux内核实时线程优先级

混乱的Linux内核实时线程优先级

作者头像
Linux阅码场
发布2020-06-09 14:16:44
3.5K0
发布2020-06-09 14:16:44
举报
文章被收录于专栏:LINUX阅码场LINUX阅码场

背景

Linux会把进程分为普通进程和实时进程,普通进程采用CFS之类调度算法,而实时进程则是采用SCHED_FIFO或SCHED_RR。

无论优先级高低,实时进程都会优先于SCHED_NORMAL中的所有进程先执行,因为后者里面都是普通的非实时进程。

内核线程的优先级

Linux内核会将大量(并且在不断增加中)工作放置在内核线程中,这些线程是在内核地址空间中运行的特殊进程。大多数内核线程运行在SCHED_NORMAL类中,必须与普通用户空间进程争夺CPU时间。但是有一些内核线程它的开发者们认为它们非常特殊,应该比用户空间进程要有更高优先级。因此也会把这些内核线程放到SCHED_FIFO中去。

那么问题来了,某个内核线程的实时优先级到底该设为多少呢?

要回答这个问题,不仅需要判断这个线程相对于所有其他实时线程是否更加重要,还要跟用户态的实时进程比较谁更重要。这是一个很难回答的问题,更何况在不同的系统和工作模式下这个答案很有可能还会各不相同。

所以一般来说,内核开发人员也就是看心情直接随便选一个实时优先级。

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

最近大神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)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux阅码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档