我对设置线程的策略以及在执行该策略时如何遵循该策略有一些疑问。 Pthread 允许设置线程的调度策略SCHED_FIFO/SCHED_RR/SCHED_OTHER
。我试图了解这个用户设置策略是如何工作的,因为 Linux 内核用作CFS
默认调度程序策略。用户设置策略CFS
在执行时会被覆盖吗?如果是这样,pthread调度策略有什么用?
答案1
A/ 基本理论3:CFS 不是默认值“调度策略”在Linux下。 CFS是linux下默认的调度器。
调度程序从所有现有线程中选择应授予 CPU 时间的线程。
这种选择受到各种参数的控制,这些参数根据不同的情况而被不同地考虑。调度策略的线程。
所有线程都会得到一个调度策略。
默认调度策略CFS 下称为:SCHED_OTHER有时也标记为 SCHED_NORMAL。
该策略实际上指示调度程序采取物有所值考虑并确保在此策略下运行的所有线程之间的公平性。
B/运行时间: 1每个打钩(或任何专用中断)调度程序维护(重新排序)一个列表(一个队列)可运行线程根据其关联的调度策略和取决于该策略的其他参数。当重新排序结束后,队列顶部的线程将被选中。
属于“的主题”即时的“策略(SCHED_RR / SCHED_FIFO)(如果在可运行情况下有的话)将始终位于列表的顶部。其中的顺序由实时优先级设置控制。
C:您的问题:如果在这些情况下,您更改了某个给定线程的调度策略(更准确地说:如果某个正在运行的线程发出系统调用,请求更改其调度策略2),那么,只要它获得这样做的权利,调度程序就会相应地重新排序其队列。
例如,如果某个 SCHED_OTHER 线程更改为 SCHED_RR,它将进入列表的顶部,调度程序将忽略它的好值并根据其给定的实时优先级将其与其他 SCHED_RR 线程一起排序。
顺便说一句,如果这是你提问的一部分:
- 调度程序从不决定/强制线程的调度策略。
- 调度程序永远不会根据调度策略而改变。如果在启动时选择了 CFS,则 CFS 将始终是调度程序。人们总是可以选择其他调度程序,一些包含在 CFS 补丁中,另一些则从头开始编写,每个调度程序都声称开销更少/更好地处理好值/更有效地处理 SCHED_RR 调度策略/当 MAX_CORES <= 4 时更高效,等等但无论您使用什么调度程序启动,都将保留为唯一的程序调度线程,直到关闭。
- 在任何情况下,调度程序都会根据(大多数情况下)其父线程(很少是由它们自己)向线程提供的调度策略来调整其行为。
1:这应在单核环境中考虑。
它可以扩展到任何 SMP / SMP + HT 环境,但代价是理解起来更加复杂,因为可以在内核之间共享(或不共享)队列,并允许线程在所有/某些特定的可用内核集上运行。
2 :要使用的系统调用系列取决于所使用的 API。
sched_setscheduler()作为标准方式,pthread_setschedparam()使用 POSIX API 时。 (函数名称不同,但结果(对 CFS 的影响)相同)
3:有关各个可用调度策略的详细说明,请参阅sched(7) Linux 手册页(男人 sched.7),我毫不怀疑,这是您正在寻找的最值得信赖/最有信誉的来源。