linux系统线程调度策略简述
简述
linux系统调度执行的最小单位是线程,线程的调度策略有以下三种:
(1)SCHED_FIFO
其静态优先级必须设置为1~99,这将意味着一旦线程处于就绪态,他就能立即抢占任何静态优先级为0的普通线程。采样SCHED_FIFO调度策略的线程还遵循以下原则:
- 当他处于就绪态时,就会被放入其所在优先级队列的队尾位置
- 当被更高优先级的线程抢占后,他会被放入其所在优先级队列的队头位置,当所有优先级比他高的线程不再运行后,他就恢复运行
- 当它调用sched_yield()后,他会被放入其所在优先级队列的队尾位置
总的来说,一个具有SCHED_FIFO调度策略的线程会一直运行直到发送I/O请求,或被更高优先级线程抢占,或调用sched_yield()主动让出cpu
(2)SCHED_RR
这种策略的情况与SCHED_FIFO类似,区别是:每一个SCHED_RR策略下的线程都会被分配一个时间片,当时间片耗光时,它会被放入其所在优先级队列的队尾位置。
可以用sched_rr_get_interval()来获取时间片的具体数值。
(3)SCHED_OTHER
其静态优先级必须设置为0,该策略是linux系统调度的默认策略,处于0优先级的这些线程按照所谓的动态优先级(nice值)被调度,且每当一个线程已处于就绪态但被调度器调度无视的时候,其动态优先级会自动增加一个单位,这样能保证这些线程竞争cpu的公平性。
如何设置线程的静态优先级和动态优先级,相关的API如下:
非实时线程
静态优先级为0的线程是非实时线程
实时线程
静态优先级为1~99的线程都是实时线程
静态优先级
什么是静态优先级?
线程的静态优先级之所以被称为“静态”,是因为只要不强行使用api函数修改它,它不会随着线程的执行而发生改变,静态优先级决定了实时线程的基本调度次序,如果他们的静态优先级一样,那么调度策略再为调度器提供进一步的调度依据。
动态优先级
什么是动态优先级?
线程的动态优先级是非实时的普通线程独有的概念,之所以被称为“动态”,是因为它会随着线程的运行,根据线程的表现而发生改变。具体来讲,如果一条线程是“CPU消耗型”的,比如视频解码算法,这类线程只要一运行就会“黏住”cpu不放,这类线程的动态优先级会慢慢降低,因为这类线程不需要很高的响应速度,我们只要保证一定的执行时间片就可以了。相反,另一类线程称为“IO消耗型”,比如编辑器,这类线程绝大部分时间都在睡眠,调度器发现每次调度它,他都毅然决然放弃了,将宝贵的cpu让给了其他线程,因此会慢慢地提高它的动态优先级,使得这类线程在同等的非实时普通线程中,有越来越高的响应速度,表现出更好的交互性能,这也正是我们想要的结果;线程的优先级可以动态调整,以上就是动态优先级的概念。
相关API
1、设置线程调度策略
2、设置线程静态优先级
3、设置线程动态优先级
总结
后面我有时间再慢慢补充linux系统线程相关的一些知识点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!