在RR调度策略中,如果低优先级线程锁定互斥锁并由调度程序删除,因为另一个高优先级线程正在等待,将会发生什么?
它是否还会释放低优先级线程持有的锁?
例如,考虑在RR调度策略中优先级为10,20和30的进程中运行的3个线程。
现在在给定的时间点,低优先级线程1锁定互斥锁并且仍在执行高级优先级线程弹出时执行,并且还等待线程1持有的互斥锁。现在线程2进入图片,这也需要由线程1锁定的相同互斥锁。
据我所知,根据调度算法,线程正在休眠或等待互斥,信号量等被删除,其他的,即使具有低优先级也被允许执行。它是否正确?如果是这样,在上面的例子中,最终高优先级线程等待完成低优先级线程,这没有任何意义。 如果在所有线程的设计都像我上面说的那样,系统是如何工作的那样?
或 线程优先级应该设置为高优先级的一个不依赖于低优先级的互斥量?
也有人可以解释一下如何在流程级别进行调度吗?我们如何为流程设置优先级?
答案 0 :(得分:5)
通常,调度和锁在任何其他方面都是无关的,而“等待线程在完成等待之前不会被调度”。拥有一个“阻止其他线程访问我的数据”的MUTEX会相当糟糕,但只有当另一个线程具有与当前线程相同或更低的优先级时它才有效。
“低优先级保持锁定,高优先级线程'需要'的现象称为优先级倒置,这是计算机理论中众所周知的场景。
有一些方案“临时增加锁定保持线程的优先级,直到它将锁定释放到等待线程的最高优先级”(或者第一个等待线程的优先级,如果它高于当前线程,或者该主题的其他一些变化)。这样做是为了打击优先级倒置 - 但它也有其他缺点,因此它并没有在所有操作系统/调度程序中实现(毕竟,它影响其他线程而不是等待的线程)。
编辑:
互斥锁(或其他类似的锁)的意思是它阻止两个线程一次访问相同的资源。例如,假设我们想要通过一些非常冗长的处理来更新五个不同的变量(复杂的数学运算,从串行端口或网络驱动器中获取数据,或者其他一些),但是如果我们只做两个变量,那么其他一些过程使用这些会得到无效的结果,那么我们显然不能“放手”锁。
高优先级线程只需要等待更新所有五个变量和低优先级锁定。
没有简单的解决方法,应用程序可以做“修复”这个问题 - 当然不要超过必要的锁定[并且可能我们实际上可以解决上述问题,通过执行冗长处理锁定的OUTSIDE,并且仅在锁定时执行最后的“将其存储在5个变量中”。这将减少高优先级线程必须等待的潜在时间,但如果系统真的很忙,它将无法真正解决问题。
关于这个主题有完整的博士论文,我不是“如何编写调度程序”的专家 - 我很清楚如何工作,就像我知道我的汽车中的引擎是如何工作的 - 但是如果有人给了我一堆合适的钢和铝基本形状,以及所需的工具/工作空间并告诉我要建造一个引擎,我怀疑它会很好用......与调度程序相同 - 我知道这些部件是什么叫,但不是如何建立一个。
答案 1 :(得分:2)
如果高优先级线程需要在低优先级线程(互斥信号量等)上等待,则低优先级线程暂时提升到与高优先级线程相同的优先级。
答案 2 :(得分:0)
高优先级线程在低优先级线程解锁之前不会有它所请求的锁。
为避免这种情况,我们可以使用信号量,其他任何线程都可以启动解锁,但在互斥锁中则不可能。