我的最终目标是对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;进行另一次调整后,它可能会执行轨迹A1-> B1-> A2-> B2-> C2-> C1或A1-> B1-> C1-> A2-> B2-> C2或其他更有可能的轨迹。从这个意义上讲,我们增加了测试范围。
目前,我正在考虑插入一些代码以根据不同的调度策略和优先级进行调整。我碰到了SCHED_OTHER
和SCHED_RR
。
默认情况下,程序以SCHED_OTHER
运行。但是,似乎POSIX标准没有详细说明要求(尽管我不确定这是否是最新标准,请参见here)。特别地,它甚至不说它是否是循环式的。通过读取Linux sched man page和Red Hat documentation,它表示静态优先级固定为0,而动态优先级为
基于的值,并且每次线程准备运行但被调度程序拒绝运行时,增加
对我来说,这似乎说设置好的值仍然无法像SCHED_RR
那样控制优先级。
另一个主要问题是,除Linux以外的其他POSIX系统,不可能每个线程设置好的值
根据POSIX.1,nice值为每个进程属性;那 是,进程中的线程应该共享一个不错的值。但是,在 在Linux中,nice的值是每个线程的属性: 同一过程可能具有不同的美观值。
因此,我在考虑是否有可能使用SCHED_RR
(SCHED_FIFO
不在我的考虑范围内,因为它不是基于时间量子的,因此将大大改变时间表)来模拟{{1} }的行为,因为我要测试的大多数程序都使用默认的SCHED_OTHER
策略。我提出了一些幼稚的想法:
SCHED_OTHER
程序的值在0到19之间,因此,我可以确保SCHED_OTHER
检测到的程序的优先级在此范围内;如果这仍然大大改变了行为,我可以进一步缩小此范围,例如0〜5。SCHED_RR
。SCHED_RR
等于或类似于time slice/quantum
使用的值(例如,在Linux上,通过更改SCHED_OTHER
内部的值,请参见{{3} })(再次,我不知道设置 /proc/sys/kernel/sched_rr_timeslice_ms
的时间量)。我想知道吗
SCHED_OTHER
与默认SCHED_RR
相比仍能大大改变行为,那么在Linux上对多线程调度进行更多干预的可能方法是什么?其他相关链接: