linux - 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_OTHER
和SCHED_RR
。
默认情况下,程序使用SCHED_OTHER
. 但是,POSIX 标准似乎没有详细说明要求(尽管我不确定这是否是最新标准,但请参阅此处)。特别是,它甚至没有说它是否是循环。通过阅读Linux sched 手册页和Red Hat 文档,它说静态优先级固定为 0,动态优先级为
基于nice 值,并且每次线程准备好运行时都会增加,但调度程序拒绝运行
对我来说,这似乎是说设置nice 值仍然不能像 what SCHED_RR
does那样控制优先级。
另一个主要问题是除了 Linux 之外的其他 POSIX 系统可能无法为每个线程设置好的值
根据 POSIX.1,nice 值是每个进程的属性;也就是说,进程中的线程应该共享一个不错的值。但是,在 Linux 上,nice 值是每个线程的属性:同一进程中的不同线程可能具有不同的 nice 值。
因此,我在考虑是否可以使用SCHED_RR
(SCHED_FIFO
不在我的考虑范围之内,因为它不是基于时间量子的,因此会大大改变时间表)来模拟SCHED_OTHER
的行为,因为我想检测的大多数程序都使用默认值SCHED_OTHER
政策。我想出了一些幼稚的想法:
- 由于非特权
SCHED_OTHER
程序在 0 到 19 之间有很好的值,我可以确保插桩程序的优先级SCHED_RR
在此范围内;如果这仍然极大地改变了行为,我可以进一步缩小这个范围,例如,0~5。 - 我将确保我想调查的所有
SCHED_RR
线程都具有相同的. - 我可以使
time slice/quantum
等于或类似于所使用的值SCHED_OTHER
(例如,在 Linux 上,通过更改内部的值/proc/sys/kernel/sched_rr_timeslice_ms
,请参阅此 Q&A)(同样,我不知道为设置时间量SCHED_OTHER
)。
所以我可以知道:
- 这个想法对 POSIX 合理吗?
- 或者,如果这对 POSIX 不通用,我可以知道它是否仅适用于 Linux?
- 或者如果在 Linux 上使用
SCHED_RR
仍然会极大地改变默认行为SCHED_OTHER
,那么有哪些可能的方法可以对 Linux 上的多线程调度进行更多干预?
其他相关链接:
- 如何提高 pthreads 中的线程优先级?
- Linux SCHED_OTHER、SCHED_FIFO 和 SCHED_RR - 区别
- 调度策略
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/7/html/reference_guide/sect-using_library_calls_to_set_priority
- http://man7.org/linux/man-pages/man2/sched_rr_get_interval.2.html
- http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html
- http://man7.org/linux/man-pages/man3/pthread_setschedprio.3.html
- http://man7.org/linux/man-pages/man3/pthread_setschedparam.3.html
- http://man7.org/linux/man-pages/man1/chrt.1.html
解决方案
推荐阅读
- sql - 在表格中选择电子邮件链的一部分
- azure - 是否有任何选项可以将 LUIS.ai UI 切换为英语以外的任何其他语言?
- java - 在 mac OS 上切换 java 版本
- javascript - 在 Edge 中完全弃用 window.showModalDialog
- c# - 设置延迟更新日期
- sql-server - 根据另一个字段的最早出现选择一行值
- sql - 每个类别随时间的运行计数
- google-sheets - 如何将 Philips Hue 活动数据发送到 Google 表格
- android - Simple XML Navigation.using a Web App - 如何?
- c - C语言括号