首页 > 解决方案 > SCHED_RR 策略来控制调度(POSIX 或 Linux)

问题描述

我的最终目标是在 POSIX 系统(不仅仅是Linux)上对多线程程序进行一些测试;我希望通过干预时间表来使交织多样化。


更新:一个解释我的目标的例子

例如,假设程序最终会运行两个线程,T1,T2。在功能级别(或其他级别,如指令级别、基本块级别),假设它们具有以下跟踪:

T1:A1 -> B1 -> C1
T2:A2 -> B2 -> C2

在一台机器上实际执行期间,可能只有少数交错。例如,在极端情况下,无论程序执行多少次,一台机器上只有一个交织的 A1 -> B1 -> A2 -> B2 -> C2 -> C1;但可能另一个交错 A1 -> A2 -> B1 -> B2 -> C2 -> C1 发生在另一台机器上,而这种交错引入了一个错误。因此我希望通过添加一些调度控制 POSIX 函数调用来多样化交织(我们有一种自动的方式来动态调整调度策略和优先级),这样在运行多个版本的这些调度调整的程序之后,它至少会提供更多的交织(但我不关心确切的交错)。例如,通过一次调整,它可能以更高的机会执行跟踪 A1 -> A2 -> B1 -> B2 -> C2 -> C1;再调整一次,它可能会执行trace A1 -> B1 -> A2 -> B2 -> C2 -> C1 或A1 -> B1 -> C1 -> A2 -> B2 -> C2 或其他更有机会的trace。从这个意义上说,我们增加了测试覆盖率。


目前我正在考虑使用一些代码来调整不同的调度策略和优先级。我遇到了SCHED_OTHERSCHED_RR

默认情况下,程序使用SCHED_OTHER. 但是,POSIX 标准似乎没有详细说明要求(尽管我不确定这是否是最新标准,但请参阅此处)。特别是,它甚至没有说它是否是循环。通过阅读Linux sched 手册页Red Hat 文档,它说静态优先级固定为 0,动态优先级

基于nice 值,并且每次线程准备好运行时都会增加,但调度程序拒绝运行

对我来说,这似乎是说设置nice 值仍然不能像 what SCHED_RRdoes那样控制优先级。
另一个主要问题是除了 Linux 之外的其他 POSIX 系统可能无法为每个线程设置好的值

根据 POSIX.1,nice 值是每个进程的属性;也就是说,进程中的线程应该共享一个不错的值。但是,在 Linux 上,nice 值是每个线程的属性:同一进程中的不同线程可能具有不同的 nice 值。

因此,我在考虑是否可以使用SCHED_RRSCHED_FIFO不在我的考虑范围之内,因为它不是基于时间量子的,因此会大大改变时间表)来模拟SCHED_OTHER的行为,因为我想检测的大多数程序都使用默认值SCHED_OTHER政策。我想出了一些幼稚的想法:

  1. 由于非特权SCHED_OTHER程序在 0 到 19 之间有很好的值,我可以确保插桩程序的优先级SCHED_RR在此范围内;如果这仍然极大地改变了行为,我可以进一步缩小这个范围,例如,0~5。
  2. 我将确保我想调查的所有SCHED_RR线程都具有相同的.
  3. 我可以使time slice/quantum等于或类似于所使用的值SCHED_OTHER(例如,在 Linux 上,通过更改内部的值/proc/sys/kernel/sched_rr_timeslice_ms,请参阅此 Q&A)(同样,我不知道为设置时间量SCHED_OTHER)。

所以我可以知道:

  1. 这个想法对 POSIX 合理吗?
  2. 或者,如果这对 POSIX 不通用,我可以知道它是否仅适用于 Linux?
  3. 或者如果在 Linux 上使用SCHED_RR仍然会极大地改变默认行为SCHED_OTHER,那么有哪些可能的方法可以对 Linux 上的多线程调度进行更多干预?

其他相关链接:

标签: linuxmultithreadingposix

解决方案


推荐阅读