调度器(Scheduler):同进程线程与跨进程上下文切换优先级问询
调度器是否优先切换同进程内线程的解答
这个行为取决于具体操作系统的调度器实现,绝大多数主流通用操作系统(Linux、Windows、macOS等)确实会优先考虑同进程内的线程调度,核心原因就是你提到的上下文切换开销差异。
- 首先要明确两种上下文切换的开销差:同进程内线程切换不需要切换地址空间,TLB、CPU缓存的命中率能保留90%以上,切换耗时通常只有跨进程切换的1/3~1/5。跨进程切换必须刷新地址空间相关的缓存,几乎所有TLB条目都会失效,后续指令执行的缓存命中率会暴跌,性能损耗极大。
- Linux的CFS调度器、Windows的多级别反馈队列调度器都实现了缓存亲和性相关的调度逻辑:当一个CPU核心的运行队列里同时存在同进程的就绪线程和其他进程的就绪线程时,会优先调度同进程的线程,除非同进程线程的时间片已经耗尽、或者优先级远低于其他进程的线程。
- 当然这个优先级不是绝对的,以下场景会打破这个规则:
- 其他进程的线程是实时优先级,远高于当前进程的普通优先级线程
- 当前进程已经没有处于就绪状态的线程,所有线程都在等待IO、锁等资源
- 系统整体负载极低,调度器会优先把不同进程的线程调度到不同空闲核心上,反而不会在同一个核心上切换同进程线程
- 补充一个容易混淆的点:用户态的协程切换是完全由用户态runtime控制的,和内核调度器无关,这类切换100%会优先在同进程/同协程调度器内切换,根本不会触发内核态的上下文切换。
以Linux 5.4版本内核的调度逻辑为例,同进程线程的调度优先级权重会比异进程同优先级线程高10%左右,这个权重值可以通过
sched_tunable_scaling相关内核参数调整。
内容的提问来源于stack exchange,提问作者Steve4879
相关产品推荐
相关产品推荐

