![](/img/trans.png)
[英]Why does spin_unlock_bh function enables preemption without calling the scheduler
[英]Why preemption does not solve priority inversion?
我想知道为什么抢占不解决优先级倒置问题 ?
如果我们有抢先内核。 那么为什么优先级倒置问题无法解决?
好吧,假设我们有两个流程。 我们还假设具有较低优先级的进程获得锁定。 当优先级较高的进程准备就绪时,它会抢占其他进程。 如果优先级较高的进程需要该锁定,则由于具有较低优先级的其他进程而无法获取该锁定。 这意味着,优先级较低的进程会阻止优先级较高的进程。 它可以防止更高优先级的进程运行。 这称为“优先级倒置”。
显然,抢占不是优先级倒置的解决方案。 解决方案是“优先级继承”。 这意味着我们应该在获取优先级较高的进程所需的锁时临时增加进程的优先级。 它应该是可能需要相同锁定的其他进程中的最高优先级进程。
设3个线程A , B , C各自的优先级为High , Medium , Low 。
C获取处理器并锁定L。 然后B被某些事件唤醒并抢占C。 现在A被唤醒并通过抢占B来获得处理器。 A想要锁L ,但是因为L已经由C拥有而失败。 A因锁定不可用而被抢占,并将处理器返回给B. 我们必须等待B完成,最终将处理器返回给C。 C将完成并释放锁定,最终将唤醒A。
这是一个优先级倒置,因为B运行,而我们在系统中有一个具有更高优先级的线程A ,等待完成较低优先级的线程(在本例中为C )。
顺便说一下,解决方案是优先级继承 。
抢占意味着取消处理器以使任务不再运行。
这还不够,因为低优先级任务包含高优先级任务所需的资源。
现在,如果资源可以被带走(一种不同的“先发制人”),那么这确实可以解决优先级倒置问题。 但这通常是不可能的,因为低优先级任务的半完成动作会导致不一致。
假设您有3个进程:
并且A和C都使用相同的文件(可以是任何共享资源),其使用必须同步。
现在假设A和B都没有准备好运行,并且C运行并获得锁以使用该文件。 当C持有文件锁时, A准备好运行,操作系统抢占C ,然后运行A. A执行到它也需要该文件的点,并且当它试图获得锁时,它被阻止,因为C持有锁。 如果在平均时间B准备好运行,它将被执行而不是A,因为A尚未准备好运行。 为了使A准备就绪,文件锁必须由C释放,并且C将不会运行并释放锁,因为更高优先级的进程B正在运行。 因此A正在等待C ,而C又在等待B。 在这种情况下抢占B会没有好处,因为A没有准备好,除非C运行,否则不会运行,并且C无法运行,因为刚刚抢占的更高优先级B已准备好运行。
来自维基
考虑,
L - >低优先级任务
H - >高优先级任务
M - >中优先级任务
R - >资源
步骤1:L获得R.
步骤2:H请求R(当前与L一起使用,所以H将等待L放弃R.)
步骤3:M到达(M是非阻塞任务。即它不需要R)
步骤4:L被M.抢占(因此L不能放弃R.因此,H无法运行。)
在M完成它的执行之后,L将放弃R.然后只有H可以继续。 在上面的场景中,具有中优先级(M)的任务在具有高优先级(H)的任务之前运行。
这是抢占式内核中的实际优先级倒置场景。
当优先级较高的任务被较低优先级的任务有效地“反转”两个任务的相对优先级时,优先级倒置是一种有问题的调度方案。
考虑有一个任务L,优先级低。 此任务需要资源R.考虑L正在运行并且它获取资源R.现在,还有另一个具有高优先级的任务H. 此任务还需要资源R.考虑H在L获取资源R之后开始。现在H必须等到L放弃资源R.一切都按预期工作到此为止,但是当新任务M(不使用)时出现问题R)在此期间以中等优先级开始。 由于R仍然在使用(由L),H无法运行。 由于M是优先级最高的未阻塞任务,因此它将在L之前进行调度。由于L已被M抢占,L不能放弃R.因此M将一直运行直到它完成,然后L将运行 - 至少到达一个点它可以放弃R - 然后H会运行。 因此,在上面的场景中,具有中等优先级的任务在具有高优先级的任务之前运行,从而有效地为我们提供优先级倒置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.