原标题:混乱的Linux内核实时线程优先级

背景

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

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

具体可以参看Linux阅码场早期文章:

宋宝华:关于Linux进程优先级数字混乱的彻底澄清

内核线程的优先级

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 把设置内核线程优先级的接口干脆都给删了,省得再有人瞎搞。

删除了原有的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

宋宝华:关于Linux进程优先级数字混乱的彻底澄清

小讨论:

内核线程和workqueue都可以用来把内核工作推迟执行,你知道他们有什么差异吗? 实际开发中你一般选择用哪种更多呢,欢迎留言讨论~

(END)

您的鼓励是我们前行的动力返回搜狐,查看更多

责任编辑:

linux 线程优先级的高低和执行顺序的关系,混乱的Linux内核实时线程优先级相关推荐

  1. linux系统用户登陆时脚本执行顺序

    在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的 /etc/profile.d/file /etc/profile /etc/bashrc /root/.bashrc /root/.b ...

  2. 线程池的参数及执行顺序

    线程池的优点 降低系统资源消耗,通过复用已存在的线程,降低线程创建和销毁造成的开销: 提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程创建便立即能够执行. 方便线程并发数的管控, ...

  3. 关于线程执行顺序的问题

    R君今天曾问我:假设现在有三个线程T1.T2.T3.那么他希望T1.T2.T3这三个线程按照顺序去执行,该怎么去完成.我本能的反应是这个好办,使用thread.jon()方法完全可以实现.接着他又问, ...

  4. Gateway网关-过滤器链执行顺序

    过滤器执行顺序 请求进入网关会碰到三类过滤器:当前路由的过滤器.DefaultFilter.GlobalFilter 请求路由后,会将当前路由过滤器和DefaultFilter.GlobalFilte ...

  5. JavaScript的预编译及执行顺序

    从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序. 如果说,JavaScript引擎的工作机制比较深奥是 ...

  6. 应用退出前不让线程切换_用户级线程和内核级线程,你分清楚了吗?

    前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课. 班上不少学生学的还是很不错的.拿班上小白和小明的例子吧(艺名哈).小明接受能力很强,小白则稍差些. 关 ...

  7. jmeter 线程执行顺序_面试官让我说出8种线程顺序执行的方法!我懵了

    https://www.cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止 ...

  8. 【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )

    文章目录 一.RCU 模式下更新链表项 list_replace_rcu 函数 二.链表操作时使用 smp_wmb() 函数保证代码执行顺序 一.RCU 模式下更新链表项 list_replace_r ...

  9. 如何改变 Python 中线程的执行顺序

    一.主线程会等待所有的子线程结束后才结束 首先我看下最普通情况下,主线程和子线程的情况. import threading from time import sleep, ctimedef sing( ...

最新文章

  1. python制作词云时出现figure1 figure2_用Python生成词云
  2. HDU1531(差分约束+Bellman_ford)
  3. python 实现ftp服务 简介
  4. winform 异步弹窗窗体_玩转控件:重写/重绘Dev中MessageBox弹窗控件
  5. sap 供应商表_SAP系统玩阴的?
  6. 他演绎了真正的“寒门逆袭”:从贫苦农村到顶级科学家,如今站在世界之巅,为祖国争光!...
  7. ZZULIOJ 1107: 回文数猜想(函数专题)
  8. 水晶报表如何查看sql_amazon自动广告如何查看报表?怎么知道亚马逊的自然流量和广告流量分别是多少?...
  9. python 编码 —— codecs 库
  10. 二维数组按指定的键值排序
  11. css改火狐滚动条样式_自定义滚动条,可解决火狐滚动条默认样式修改不了问题...
  12. 通过银行卡号,识别相应的银行信息
  13. 【考研数学】张宇1000题,汤家凤1800,李永乐660,应该怎么选择?
  14. 如何在Win10安装“Siemens TIA Openness”
  15. 人工智能发展历史概述
  16. 计算机考研英语大纲,考研计算机大纲
  17. 华为2288H V5服务器RAID配置
  18. ST32/GD32嵌入式硬件开发总目录
  19. 澎湖渔船捕获多尾超大野生虱目鱼 比养殖鱼大10倍
  20. 做实验的顺序【重要】

热门文章

  1. Qt5 使用 #pragma 加载 lib 文件的注意事项
  2. 来自微博html5怎么设置,来自微博的面试题解决方案
  3. linux进程网络均衡,linux多CPU进程负载均衡解析
  4. java注解定义时间格式_SpringBoot基础教程2-1-8 数据验证-自定义日期格式验证
  5. js 实现2的n次方计算函数_「计算机组成原理」:一文快速了解计算机原理知识点-附思维导图...
  6. 3 左右_3万左右电动迷你小汽车,3万左右电动迷你小汽车车型推荐
  7. 百度工程师手把手教你实现代码规范检测工具
  8. Vue3.0 组合式 API 分析与实践
  9. mysql中的逻辑类型如何定义_MYSQL存储过程即常用逻辑知识点总结
  10. 交大c语言作业答案,西安交大c语言作业及答案详解.docx