Multithreading 将控制权授予优先级始终较低的线程

Multithreading 将控制权授予优先级始终较低的线程,multithreading,operating-system,Multithreading,Operating System,这是一个一般性问题。 考虑一个场景,我们有一些线程具有不同程度的优先级。 现在在这种情况下,具有最低优先级的线程将永远无法控制资源,因为共享将始终转到具有最高优先级的线程。 我们是否可以绕过优先级较高的线程,将资源分配给优先级较低的线程?这种机制的内置机制是线程的优先级。通过设置线程的低优先级,您告诉操作系统其活动“不太重要”,因此,如果更重要(优先级更高)的线程需要运行,则这些线程优先 如果您不希望线程可能没有CPU时间,那么它不应该是低优先级线程。这不一定是这种情况-它取决于优先级实现。您描

这是一个一般性问题。 考虑一个场景,我们有一些线程具有不同程度的优先级。 现在在这种情况下,具有最低优先级的线程将永远无法控制资源,因为共享将始终转到具有最高优先级的线程。
我们是否可以绕过优先级较高的线程,将资源分配给优先级较低的线程?

这种机制的内置机制是线程的优先级。通过设置线程的低优先级,您告诉操作系统其活动“不太重要”,因此,如果更重要(优先级更高)的线程需要运行,则这些线程优先


如果您不希望线程可能没有CPU时间,那么它不应该是低优先级线程。

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

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


这是调度程序的责任-

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


如果您正考虑在编程语言中执行此操作,那么只需更改线程优先级,以便每次运行时都能取得更大的进展。通常,您有低优先级线程来执行时间不太关键的后台事件,或者您不希望该线程占用与更重要线程相同的时间。

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


此外,非实时优先级通常是一个可变数字。计划进程的优先级会降低,而所有进程的优先级都会缓慢增加(通过或达到另一个可调因子)。这样,如果您有几个线程不等待任何东西,那么每次调度程序都会选择一个不在CPU上等待时间最长的线程。同样,当资源变得可用时,等待的线程将被及时调度,因为它在等待时收集了高优先级(这会让用户界面在后台进程耗尽所有CPU的情况下保持响应)。

不。你说的是“好”。“实时优先级”的行为就像OP所说的。这取决于他所说的调度程序。如果系统陷入困境,一些调度程序将永远不会给低优先级线程时间。公平进程调度确保所有线程都会获得一定的时间,但时间长短取决于优先级。让我们假设我的线程必须是低优先级的(它执行同步任务,比如说在后台,并且必须是低优先级的)。为什么它必须是低优先级的?因为它与用户输入(按键、接听电话等)相比不需要时间限制。如果它不需要时间限制,那么它是否可能长时间不运行也没关系(因为有一个优先级更高的线程正在运行)。如果不是这样的话,只需让它保持相同的优先级,让它长时间不做任何事情,只做Sleep()。这就像我有几个线程,而我的线程是唯一优先级最低的线程。所有线程永远不会同时进入等待状态。即使我有一个公平的共享策略,我的线程也会得到更少的时间share@Yogi:是,线程将获得较少的时间共享。使用动态优先级(“公平调度程序”),它将得到适当较低的分数。有了硬“实时”优先级,它将一无所获。这些系统就是这样定义的。不同的操作系统都有一个或另一个,或者两者都有,“公平”在每个操作系统中的工作方式不同,或多或少都是公平的。