把控制权交给优先级总是较低的线程



这是一个一般性问题。考虑这样一个场景,其中我们有一些具有不同优先级的线程。现在,在这种情况下,具有最低优先级的线程永远不会获得资源的控制权,因为共享将始终转到具有最高优先级的线程。无论如何,我们可以绕过具有较高优先级的线程,并为具有较低优先级的线程提供资源?

这个的内置机制是线程的优先级。通过在线程上设置低优先级,您告诉操作系统它的活动"不太重要",因此如果需要运行更重要(具有更高优先级)的线程,那么这些线程将具有优先级。

如果你不希望一个线程获得潜在的没有CPU时间,那么它不应该是一个低优先级的线程。

如果您考虑这在操作系统中是如何实现的,您将看到低优先级线程确实运行,区别在于它们被给予较少的执行总时间片。低优先级线程将始终执行,即使系统资源匮乏。您可能看到的唯一一件事是,只要高优先级线程运行,它就不会运行。如果你想了解更多,我建议你查找操作系统用来调度进程和线程的不同方法。

如果你想在编程语言中这样做,那么简单地改变线程优先级,这样它每次运行时都可以取得更多的进展。通常你有低优先级的线程来处理后台事件,这些事件对时间不是很关键,或者你不希望这个线程占用和一个更重要的线程一样多的时间。

显然有。等待。如果高优先级的线程正在等待某些东西(可能是任何东西—锁,来自文件,用户或网络的数据,计时器…),它是不可运行的,所以下一个高优先级的线程可以运行。

非实时优先级通常是一个可变的数字。调度进程的优先级降低,而所有进程的优先级缓慢增加(由或至多由另一个可调因素增加)。这样,如果您有几个不等待任何事情的线程,每次调度器都会选择一个最长时间不在CPU上的线程。同样,当资源可用时,等待的线程将被及时调度,因为它在等待期间收集了高优先级(这使用户界面响应后台进程,否则会耗尽所有CPU)。

并不一定是这样——这取决于优先级的实现。你描述它的方式假设高优先级线程将继续运行,直到它们完成,并剥夺低优先级线程的执行时间。

这可能是实现它的一种方法,但我认为更公平的策略是使用时间片共享。因此,优先级决定了每个线程获得多少CPU时间,而不一定是它们执行的顺序。

这是调度程序的责任-维基百科:调度

最新更新