无限循环任务的优先级抢占式调度

Priority Preemptive Scheduling of infinite loop tasks

在 Google 和 Whosebug 上有很多关于优先级抢占式调度的 material 可用,但我仍然对优先级抢占式调度内核中无限循环任务的调度感到困惑。让我们考虑以下情况:

RTOS 启动两个任务 T1T2,优先级分别为 50100。两个任务看起来像:

void T1()
{
    while(1)
    {
        perform_some_task1();
        usleep(100);
    }
}

void T2()
{
    while(1)
    {
        perform_some_task2();
        usleep(100);
    }
}

据我了解,内核会安排 T2 因为它的优先级较高,而挂起 T1 因为它的优先级较低。现在因为 T2 是一个无限循环,它永远不会放弃 CPU 给 T1 直到其他一些高优先级任务抢占 T2.

但是,我的理解似乎不正确,因为我已经在 RTOS 中测试了上述情况,并且两个任务都在控制台上打印了输出。

有人可以评论我对此事的理解以及 RTOS 在上述情况下的实际行为吗?

在这种情况下,一旦 perform_some_taskN(); 执行完毕(释放资源以供其他线程使用),两个任务都会被挂起。根据文档:

The usleep() function will cause the calling thread to be suspended from execution until either the number of real-time microseconds specified by the argument useconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested due to the scheduling of other activity by the system.

顺便说一句,usleep() 已弃用(改为使用 nanosleep()):

POSIX.1-2001 declares this function obsolete; use nanosleep(2) instead. POSIX.1-2008 removes the specification of usleep().