unix中的线程调度

sur*_*esh 5 unix multithreading

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

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

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

现在在给定的时间点,低优先级线程1锁定互斥锁并且仍然执行执行意味着高优先级线程弹出并且还等待线程1持有的互斥锁.现在线程2进入图片,其中还需要锁定相同的互斥锁通过线程1.

据我所知,根据调度算法,线程正在休眠或等待互斥,信号量等被删除,其他的,即使具有低优先级也被允许执行.它是否正确?如果是这样,在上面的例子中,最终高优先级线程等待完成低优先级线程,这没有任何意义.如果在所有线程的设计都像我上面说的那样,系统是如何工作的?

或者线程优先级应该设置为高优先级不依赖于低优先级的互斥量?

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

Mat*_*son 5

通常,调度和锁在任何其他方面都是无关的,而"等待线程在完成等待之前不会被调度".这将是相当愚蠢的,以具有互斥,"从访问我的数据停止其他线程",但如果其他线程具有比当前线程的优先级相同或更低的它才会起作用.

"低优先级保持锁定,高优先级线程'需要'的现象称为优先级倒置,这是计算机理论中众所周知的场景.

有一些方案"临时增加锁定线程的优先级,直到它将锁定释放到等待线程的最高优先级"(或者第一个等待线程的优先级,如果它高于当前线程,或其他一些变体)在那个主题上).这样做是为了打击优先级倒置 - 但它也有其他缺点,因此它并没有在所有操作系统/调度程序中实现(毕竟,它影响其他线程而不是等待的线程).

编辑:

互斥锁(或其他类似的锁)的意义在于它阻止两个线程一次访问相同的资源.例如,假设我们想要通过一些非常冗长的处理来更新五个不同的变量(复杂的数学运算,从串行端口或网络驱动器中获取数据,或者其他一些),但是如果我们只做两个变量,那么其他一些过程使用这些会得到无效的结果,那么我们显然不能"放手"锁.

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

没有简单的解决方法,应用程序可以做"修复"这个问题 - 当然不要超过必要的锁定[并且可能我们实际上可以通过执行冗长的处理OUTSIDE来解决上述问题锁定,只有在锁定时才进行最后的"将其存储在5个变量中".这将减少高优先级线程必须等待的潜在时间,但如果系统真的很忙,它将无法真正解决问题.

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