【问题标题】:How does priority ceiling protocol works优先上限协议如何工作
【发布时间】:2016-09-30 07:14:03
【问题描述】:

在下面的场景中,假设 Sem_Take() 和 Sem_Give() 是锁和释放方法,当锁被释放时任务 t1 的优先级将如何变化。

我知道,一旦资源被锁定,使用优先级上限协议会提高任务的优先级,但是当锁定被释放时会发生什么。

    void t1()//Initial priority 2
{
    int a;
    Sem_take(S1); //priority ceiling for S1 is 4
    .
    .
    Sem_take(S2);//priority ceiling for S2 is 6
    .
    .
    Sem_Give(S1);
    .//What is the priority at this line?
    .
    Sem_Give(s2);
    .//What is the priority at this line?
    .
}

同样在上述情况下,信号量锁定和释放不匹配,这是错误的,但程序可能会错误地这样做,那么在这种情况下,PCP 将如何工作。

【问题讨论】:

    标签: real-time semaphore rtos priority-inversion


    【解决方案1】:

    创建优先级上限是为了避免优先级倒置。一个良好实现的算法将始终为每个进程赋予与该进程持有的每个资源(在本例中为信号量)相关联的最高优先级。因此,特别是关于您的代码示例:在获取 S1 之后,进程优先级将提高到 4,然后在获取 S2 之后,它将再次提高到 6。释放 S1 后,优先级仍然是 6(仍然保持 S2)。释放 S2 后,它应该恢复优先级 == 2。

    【讨论】:

    • 明白。但是如果 S1 优先级是 6 并且 S2 优先级是 4 会发生什么,所以在释放 S1 时,优先级将恢复为 2,然后再次提升到 4,因为在此之前它从未提升到 4。如果是这种情况,由于 s2 在释放 S1 之前已被锁定,将如何触发到 4,那么将触发此 rasie。
    • 我完全理解您的担忧,我可以假设某些 RTOS 在某个时间点存在易受攻击的实现。但是我确实相信这可以正确实施。无论您使用什么 RTOS,您都可以获得所有正在运行的进程及其优先级的列表,并亲自查看结果。至于确保您的进程在提升回 4 之前不会降级到 p2,那就更棘手了。您必须编写一些代码来检测这一点。我需要考虑一下。
    • 要检测优先级中的故障,请创建一个优先级为 3 的进程,该进程在循环中执行 I/O 操作。如果您的第一个进程具有优先级 2 瞬态,那么它将允许 I/O 进程调度并执行 I/O。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多