gpt4 book ai didi

multithreading - unix中的线程调度

转载 作者:行者123 更新时间:2023-12-04 18:09:39 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

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

编辑:

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

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

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

有很多关于这个主题的博士论文,而且我不是“如何编写调度程序”的专家 - 我很清楚它是如何工作的,就像我知道我汽车中的引擎如何工作一样 - 但如果有人给了我一堆合适的钢和铝的基本形状,以及所需的工具/工作区,并告诉我 build 一个引擎,我怀疑它会很好用......与调度程序一样 - 我知道这些部件叫什么,但是不是如何建立一个。

关于multithreading - unix中的线程调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17747621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com