无限循环任务的优先级抢占式调度
Priority Preemptive Scheduling of infinite loop tasks
在 Google 和 Whosebug 上有很多关于优先级抢占式调度的 material 可用,但我仍然对优先级抢占式调度内核中无限循环任务的调度感到困惑。让我们考虑以下情况:
RTOS 启动两个任务 T1
和 T2
,优先级分别为 50
和 100
。两个任务看起来像:
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().
在 Google 和 Whosebug 上有很多关于优先级抢占式调度的 material 可用,但我仍然对优先级抢占式调度内核中无限循环任务的调度感到困惑。让我们考虑以下情况:
RTOS 启动两个任务 T1
和 T2
,优先级分别为 50
和 100
。两个任务看起来像:
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().