1

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

一个 RTOS 启动两个任务T1,并分别T2具有优先级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 的实际行为吗?

4

1 回答 1

4

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

usleep() 函数将导致调用线程暂停执行,直到参数 useconds 指定的实时微秒数已经过去,或者将信号传递给调用线程并且其操作是调用信号捕获函数或终止进程。由于系统对其他活动的调度,暂停时间可能比请求的时间长。

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

POSIX.1-2001 声明此函数已过时;请改用 nanosleep(2)。POSIX.1-2008 删除了 usleep() 的规范。

于 2018-07-03T09:21:09.733 回答