如何跨进程确保线程调度的公平性?

时间:2018-12-28 18:27:03

标签: multithreading operating-system scheduling

每个进程都有至少一个执行线程,而我读到某个地方,现代操作系统仅调度线程,而 则不调度。

因此,如果系统中有两个进程正在运行-具有1个线程的P1和具有100个线程的P2,那么OS调度算法将如何确保P1和P2都获得大致相同的CPU时间?如果OS盲目地调度线程,则P2将获得比P1多100倍的CPU时间。

是否也考虑到特定线程属于哪个进程?否则,对于一个进程来说,通过创建更多线程来占用所有CPU似乎太容易了。

3 个答案:

答案 0 :(得分:1)

通常,“公平线程调度”会尝试为每个线程分配相等的CPU时间(与进程中所有线程获得多少CPU时间无关); “公平进程调度”和“公平进程调度”试图赋予每个进程相同的CPU时间(例如,通过使属于不同进程的线程获得不相等的CPU时间)。它们是互斥的-您不能同时拥有(除非每个进程具有相同数量的线程)。

请注意,无论如何这都是一个残酷的笑话。例如,如果一个线程由于热节流(和/或因为同一内核中的另一个逻辑CPU繁忙)而在运行缓慢的CPU上获得10毫秒的时间,而另一个线程在一个CPU上获得10毫秒的时间。比正常运行速度更快(例如,由于“涡轮增压”和/或由于未使用内核中的另一个逻辑CPU);那么这些线程获得了相等数量的CPU时间,但是没有收到任何被认为“公平”的信息(因为一个线程可能完成的工作量是另一个线程的20倍)。

请注意,无论如何这都是不需要的。例如,对于一个好的OS,线程将被赋予优先级以指示其工作的重要性,而您不希望高优先级的线程(执行非常重要的工作)获得相同的CPU时间“公平份额”作为低优先级线程(执行无关/不重要的工作)。对于两个线程具有相同优先级的情况,您可能(理论上)希望它们获得“相等”的CPU时间。但是在实践中这并不常见,线程阻塞和解除阻塞的频率很高,因此不值得关注。并且在实践中会导致“两份完成的工作而不是一份完成的工作和一份未开始的工作”的情况,从而增加了完成一项工作(例如工作要求)所需的平均时间。

答案 1 :(得分:1)

  

是否也考虑到特定线程属于哪个进程?否则,对于一个进程来说,通过创建更多线程来占用所有CPU似乎太容易了。

错误的问题。考虑两个工作,它们试图通过完成相同的工作来解决完全相同的问题,并且除了一件事情外,它们完全相同-一个工作使用多个线程,另一个工作使用多个进程。为什么使用数十个进程的处理器比使用数十个线程的处理器要获得更多的CPU时间?

您的公平概念并不是一个明智的选择。

相反,调度是围绕尝试在单位时间内完成尽可能多的工作而设计的。假定计算机正在执行的所有操作都是有用的,并且使其他竞争任务也能尽快完成,这将有利于竞争任务。

实际上,这是绝大多数时间所需的全部。但是有时您会遇到一些特殊情况,这是行不通的。一种是超高优先级任务,例如保持视频或音频流或保持用户界面响应能力。另一个是超低优先级的任务,您需要完成大量的工作,并且您不希望系统在长时间工作时变慢。优先级用于此目的,通常系统会允许较高优先级的线程中断较低优先级的线程,以保持响应速度。

答案 2 :(得分:0)

如果线程是调度的基本单位(近来通常是安全的假设),则进程调度程序将决定由谁分配CPU。如何(以及是否)将线程使用考虑在内完全取决于系统。 AND行为可能取决于过程的类型。例如,在VMS(并在Windoze中采用)中,对实时流程的处理方式与其他类型的流程不同。

在VMS类型的调度中,具有更多线程的进程在设计上会获得更多CPU。对于一个应用程序使用更多的线程,并使其使用更多的进程更好。

请记住,系统可能会对进程中的线程数施加限制。