在多核系统 (Ubuntu 11.04 x86-32) 上运行下面的代码(使用 -lpthread 编译),它只是生成一个 SCHED_FIFO 线程并进入睡眠状态,会显示一些奇怪的行为。如果你按下一个键,它就会很好地呼应出来。但是,如果您按住某个键,该进程将挂起,您将需要硬重启(软重启和 kill -9 一样挂起)。通过 telnet 会话做同样的事情就可以了。
#include <sched.h>
#include <pthread.h>
#include <assert.h>
void* schedtest_busy_wait_thread_entry(void *arg)
{
struct sched_param sp;
sp.__sched_priority = sched_get_priority_min(SCHED_FIFO);
assert(sched_setscheduler(0, SCHED_FIFO, &sp) == 0);
while (1);
return NULL;
}
int main(int argc, char **argv)
{
pthread_t thread_id;
assert(pthread_create(&thread_id, NULL, schedtest_busy_wait_thread_entry, NULL) == 0);
while (1) sleep(1);
return 0;
}
显然,这只是一个更大、更复杂的系统的摘录,该系统需要一个繁忙的等待 SCHED_FIFO 线程(具有硬编码的亲和性),但显示出相同的行为。/proc/sys/kernel/sched_rt_runtime_us 默认为 950000。
任何指针?