我刚遇到优先级继承,它是操作系统中优先级倒置问题的解决方案。任何人都可以建议除此之外的任何其他解决方案吗?
由于
答案 0 :(得分:2)
<强>替代强>
prio上限促销与prio继承有何不同?
优先级继承:当优先级较高的任务开始等待较低优先级任务捕获的互斥锁时,优先级较低的任务的优先级会暂时提升为优先级较高的任务的优先级。这使得优先级较低的任务即使被中优先级任务抢占也可以继续运行。
缺点:
一个。如果低优先级的prio继承基于几个随机事件序列,则无法轻易确定促进低prio任务的中prio任务的等待时间。
湾如果提升的任务等待另一个任务持有的另一个互斥锁,则还必须提升此任务的优先级。这称为优先传播。系统行为变得难以确定。
℃。再次,如果更高优先级的任务现在开始等待这个提升的低prio任务,则必须再次提升提升的低prio任务并再次传播,使得系统行为更加难以确定。
优先级上限提升:创建时为每个互斥锁指定优先级上限。这等于可以使用互斥锁的最高优先级任务的优先级。当一个低prio任务使用这个互斥锁时,它的prio立即被提升到天花板。因此,只要拥有互斥锁,中间prio任务就不能抢占此任务。
缺点:
一个。如果低prio任务经常很少使用互斥锁和高prio任务,那么不必要的中间prio任务将被禁止抢占低prio任务。
答案 1 :(得分:0)
我知道这是一个老问题,但我自己一直在研究这个话题,需要一个地方来得出我的结论。以下是随机提升背后的想法,您在评论中提到了这一点:
当高优先级线程阻塞资源时,选择优先级较低的随机就绪线程。在一定时间内将该线程优先于被阻塞线程的优先级假定为足以释放资源。然后放弃优先级并选择另一个线程。重复此操作,直到资源被释放。
我不知道对该算法的任何正式分析,但显而易见的是,由@ShreyasS覆盖的优先级继承和优先级上限在降低优先级反转时间方面更有效。他们有多高效,我不知道。当然这取决于应用程序,因此无论如何都需要进行测试。
然而,优先级继承和上限的一大缺点是它们只使用拥有者概念(例如互斥体)的资源。换句话说,如果有机会,调度程序知道哪个线程可以释放资源。另一方面,优先级提升更为一般,即使在非自有资源(例如信号量)上也能解决优先级倒置问题。
从概念上讲,如果您愿意投入时间,可以将所有三种算法结合起来。这里有一些快速的想法。拥有的资源只能在为其专门配置时使用继承和天花板。非自有资源可以使用优先级提升。但即使在这种情况下,也可以限制可提升线程集,例如仅限于拥有资源句柄的进程中的那些线程。如果跟踪资源声明和发布之间的时间,则增强持续时间也可以是自适应的。