【问题标题】:How is fairness of thread scheduling ensured across processes?如何保证跨进程的线程调度公平?
【发布时间】:2019-05-26 12:46:55
【问题描述】:
每个进程至少有一个执行线程,我在某处读到现代操作系统只调度线程,不进程。
如果系统中有两个进程在运行——P1 有 1 个线程,P2 有 100 个线程,操作系统调度算法如何确保 P1 和 P2 获得大致相同的 CPU 时间?如果操作系统盲目调度线程,P2 将获得比 P1 多 100 倍的 CPU 时间。
它是否还考虑了特定线程属于哪个进程?否则,一个进程通过创建更多线程来占用所有 CPU 似乎太容易了。
【问题讨论】:
标签:
multithreading
operating-system
scheduling
【解决方案1】:
它是否还考虑了特定线程属于哪个进程?否则,一个进程通过创建更多线程来占用所有 CPU 似乎太容易了。
错误的问题。考虑两个工作,它们试图通过做相同的工作来解决完全相同的问题,并且除了一件事之外完全相同——一个使用几十个线程,另一个使用几十个进程。为什么使用几十个进程的 CPU 时间比使用几十个线程的要多?
你的公平观念并不合理。
相反,调度更多地是围绕在单位时间内尽可能多地完成工作而设计的。假设是计算机所做的一切都是有用的,并且有利于竞争的任务让其他与之竞争的任务也尽快完成。
这实际上是你绝大多数时间所需要的。但有时你会遇到特殊情况,这不起作用。一个是超高优先级任务,例如保持视频或音频流畅或保持用户界面响应。另一个是超低优先级任务,您需要完成大量工作,并且您不希望系统在处理它时长时间运行缓慢。为此使用了优先级,通常系统允许较高优先级的线程中断较低优先级的线程以保持响应。
【解决方案2】:
一般来说,“公平线程调度”尝试给每个线程相同的 CPU 时间(不管进程中的所有线程获得多少 CPU 时间);和“公平进程调度”试图给每个进程相同数量的 CPU 时间(例如,通过给属于不同进程的线程不等量的 CPU 时间)。它们是互斥的——你不能同时拥有两者(除非每个进程都有相同数量的线程)。
请注意,无论如何,这都是一个破玩笑。例如,如果一个线程在由于热节流(和/或因为同一内核中的另一个逻辑 CPU 很忙)而运行缓慢的 CPU 上获得 10 ms 的时间,而另一个线程在 CPU 上获得 10 ms 的时间运行速度比正常速度快(例如,由于“涡轮增压”和/或因为核心中的其他逻辑 CPU 没有被使用);那么这些线程获得了等量的 CPU 时间,但没有收到任何可以被认为是“公平”的东西(因为一个线程完成的工作量可能是另一个线程的 20 倍)。
请注意,无论如何这都是不需要的。例如,对于一个好的操作系统线程将被赋予一个优先级以表明它们所做的工作有多重要,并且您不希望高优先级线程(执行非常重要的工作)获得相同的 CPU 时间“公平份额”作为低优先级线程(做不相关/不重要的工作)。对于两个线程具有相同优先级的情况,您可能(理论上)希望它们获得“相等”的 CPU 时间;但在实践中这并不常见,线程阻塞和解除阻塞如此频繁,以至于不值得关心;在实践中,它可能会导致“两份完成一半的工作,而不是一份已完成的工作和一份未开始的工作”的情况,这会增加完成一份工作(例如工作请求)所需的平均时间。
【解决方案3】:
如果线程是调度的基本单元(现在通常是安全的假设),那么进程调度程序就是决定谁分配 CPU 的人。它如何(以及是否)考虑线程使用完全是系统特定的。并且行为 ma 取决于过程的类型。例如,在 VMS(并在 Windoze 中采用)中,实时进程的处理方式与其他类型的进程不同。
在 VMS 类型的调度中,具有更多线程的进程会根据设计获得更多 CPU。更适合应用程序使用更多线程并使用更多进程。
请记住,系统可能会对进程中的线程数施加限制。