5

在 RR 调度策略中,如果一个低优先级线程锁定一个互斥体并因为另一个高优先级线程正在等待而被调度程序移除,会发生什么?

它还会释放低优先级线程持有的锁吗?

例如,考虑 3 个线程在 RR 调度策略中优先级为 10,20 和 30 的进程中运行。

现在在给定的时间点,低优先级线程 1 锁定互斥锁,并且仍在执行平均,而高优先级线程弹出并等待线程 1 持有的互斥锁。现在线程 2 进入图片,它也需要锁定相同的互斥锁通过线程 1。

据我所知,根据调度算法,睡眠或等待互斥锁、信号量等的线程被删除,而其他线程,即使是低优先级也被允许执行。这个对吗?如果是这样,在上面的示例中,最终高优先级线程等待低优先级线程完成,这没有任何意义。如果所有线程都像我上面所说的那样设计,这就是系统的工作方式吗?

或者线程优先级应该以这样一种方式设置,即高优先级的不会依赖于低优先级的互斥锁?

也有人可以解释一下调度在进程级别是如何工作的吗?我们如何为流程设置优先级?

4

3 回答 3

5

通常,调度和锁在任何其他方面都是无关的,除了“等待线程在完成等待之前不会被调度”。拥有一个“阻止其他线程访问我的数据”的 MUTEX 是相当愚蠢的,但它仅在其他线程具有与当前线程相同或更低的优先级时才有效。

“低优先级持有高优先级线程'需要'的锁”的现象称为优先级反转,这是计算机理论中众所周知的场景。

有一些方案“暂时增加一个锁持有线程的优先级,直到它释放锁到等待线程的最高优先级”(或者第一个等待线程的优先级,如果它高于当前线程,或者其他一些变体关于那个主题)。这样做是为了对抗优先级反转——但它也有其他缺点,所以它并没有在所有操作系统/调度程序中实现(毕竟,它会影响其他线程而不是等待的线程)。

编辑:

互斥锁(或其他类似锁)的要点是它可以防止两个线程同时访问相同的资源。例如,假设我们想通过一些相当冗长的处理(复杂的数学运算、从串行端口或网络驱动器获取数据等)更新五个不同的变量,但如果我们只处理其中两个变量,则其他一些过程使用这些会得到一个无效的结果,那么我们显然不能“放开”锁。

高优先级线程只需等待所有五个变量都被更新和低优先级锁定。

应用程序没有简单的解决方法来“修复”这个问题 - 当然,不要持有过多的锁 [而且我们可能实际上可以通过在外部执行冗长的处理来解决上述问题锁,并且只在锁打开的情况下执行最后的“将其存储在 5 个变量中”。这将减少高优先级线程必须等待的潜在时间,但如果系统真的很忙,它不会真正解决问题。

关于这个主题写了整篇博士论文,我不是“如何编写调度程序”的专家——我很清楚一个人是如何工作的,就像我知道我车里的发动机是如何工作的一样——但是如果有人给了我一堆合适的钢和铝的基本形状,以及所需的工具/工作空间,并告诉我建造一个引擎,我怀疑它会很好用......调度程序也是如此 - 我知道这些部件的名称,但是不是如何建造一个。

于 2013-07-19T13:53:11.470 回答
2

如果高优先级线程需要在低优先级线程(互斥信号量等)上等待,则低优先级线程暂时提升到与高优先级线程相同的优先级。

于 2013-07-19T13:51:55.433 回答
0

在低优先级线程解锁之前,高优先级线程不会拥有它请求的锁。

为了避免这种情况,我们可以使用信号量,任何其他线程都可以启动解锁,但在互斥锁中这是不可能的。

于 2013-07-19T13:58:38.763 回答