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

Scheduling 无限循环任务的优先级抢占式调度,scheduling,rtos,preemption,Scheduling,Rtos,Preemption,在Google和Stackoverflow上有很多关于优先级抢占式调度的资料,但是我仍然对优先级抢占式调度内核中无限循环任务的调度感到困惑。让我们考虑下面的情况: RTOS分别以优先级50和100启动两个任务T1和T2。这两项任务看起来都像: void T1() { while(1) { perform_some_task1(); usleep(100); } } 及 据我所知,由于优先级较高,内核将调度T2,而由于优先级较低,内核将暂停

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

RTOS分别以优先级
50
100
启动两个任务
T1
T2
。这两项任务看起来都像:

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

据我所知,由于优先级较高,内核将调度
T2
,而由于优先级较低,内核将暂停
T1
。现在,因为
T2
是一个无限循环,它永远不会将CPU让给
T1
,直到其他高优先级任务抢占
T2

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


有人能评论一下我对上述情况的理解和RTO的实际行为吗?

在这种情况下,两个任务都将暂停一次
执行一些任务n()已执行(释放资源供其他线程使用)。根据文件:

usleep()函数将导致调用线程暂停执行,直到参数useconds指定的实时微秒数过去,或者向调用线程发送信号,其操作是调用信号捕获函数或终止进程。由于系统安排了其他活动,暂停时间可能比请求的时间长

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

POSIX.1-2001宣布此功能已过时; 使用纳米睡眠(2)代替。POSIX.1-2008删除了 usleep()


在这种情况下,两个任务都将暂停一次
perform_some_taskN()已执行(释放资源供其他线程使用)。根据文件:

usleep()函数将导致调用线程暂停执行,直到参数useconds指定的实时微秒数过去,或者向调用线程发送信号,其操作是调用信号捕获函数或终止进程。由于系统安排了其他活动,暂停时间可能比请求的时间长

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

POSIX.1-2001宣布此功能已过时; 使用纳米睡眠(2)代替。POSIX.1-2008删除了 usleep()


谢谢@Jose,这是否意味着如果我从这两个任务中删除usleep(),T2将继续运行,不会为T1的调度和执行放弃CPU?是的,它将等待最高优先级的任务完成(请原谅看门狗或任何其他外部因素)。@Arshan-这取决于
执行某些任务2()
的功能。它还可以包括调度/阻塞调用。阻塞的函数(例如同步、IPC、延迟、计时器等待和产量函数)导致调度程序被调用,最高优先级的非阻塞(即就绪)函数运行。POSIX
usleep()
已被弃用-这可能是理论上的RTO不是POSIX-看起来像伪代码。@Clifford我假设了一个旧的POSIX示例。否则,我的答案就毫无意义了,因为
usleep()
可能会调用一个阻塞任务(假设我们不知道
usleep()
的作用),而不会暂停当前最高优先级任务的执行。谢谢@Jose,这是否意味着如果我从两个任务中删除usleep(),T2将继续运行,不会为T1的调度和执行放弃CPU?是的,它将等待最高优先级的任务完成(请原谅看门狗或任何其他外部因素)。@Arshan-这取决于
执行某些任务2()
的功能。它还可以包括调度/阻塞调用。阻塞的函数(例如同步、IPC、延迟、计时器等待和产量函数)导致调度程序被调用,最高优先级的非阻塞(即就绪)函数运行。POSIX
usleep()
已被弃用-这可能是理论上的RTO不是POSIX-看起来像伪代码。@Clifford我假设了一个旧的POSIX示例。否则,我的答案就毫无意义了,因为
usleep()
可能会调用阻塞任务(假设我们不知道
usleep()
做什么),而不会暂停当前最高优先级任务的执行。
void T2()
{
    while(1)
    {
        perform_some_task2();
        usleep(100);
    }
}