如果我可以提高程序的优先级,为什么我必须对一个处理任务使用多个线程?

Jas*_*per 5 multithreading operating-system

早些时候,我问过有关处理数据流的问题,有人建议将数据放入队列中,然后在另一个主题上处理这些数据。如果这很慢,我应该使用多个线程。

但是,我使用的系统只有一个核心。所以我的问题是:为什么不提高我的应用程序的优先级,以便从操作系统获得更多的CPU时间?我正在写一个基于服务器的应用程序,它将是唯一在此运行的大事。

摆好prio的利弊是什么?:)

Jon*_*nna 2

如果你只有一个核心,那么多线程可以帮助你的唯一方法是,如果该工作的大部分依赖于 CPU 以外的其他东西,那么一个线程可以完成一些工作,而另一个线程正在等待来自磁盘或网络的数据联系。

如果您的应用程序有 GUI,那么它可以从多线程中受益,因为虽然处理速度不会更快(实际上更慢,但如果任务很长,则可能可以忽略不计),但它仍然可以对用户做出反应同时输入。

如果您有两个或更多核心,那么您还可以进行 CPU 密集型操作,尽管根据操作的具体内容,这样做可能微不足道,也可能根本不可能。这与您的情况无关,但如果您编写的代码稍后可以在多核系统上运行,则通常值得考虑。

不过,提高优先级可能是一个坏主意,特别是如果您只有一个核心(多核系统的一个优点是提高优先级的人不会造成那么大的损害)。

所有线程都有优先级,这是它们的进程优先级和进程内优先级的一个因素。高优先级进程中的低优先级线程优先于低优先级进程中的高优先级线程。

调度程序以循环方式将 CPU 切片分配给有工作要做的最高优先级线程。如果还有剩余的 CPU(在您的情况下,这意味着该优先级上有零个线程需要运行),那么它会将切片分配给下一个最低优先级,依此类推。

大多数时候,大多数线程并没有做太多事情,这可以从大多数系统上的大多数时间 CPU 使用率低于 100% 的事实看出(超线程扭曲了这一点,核心内的内部调度意味着超线程系统可能会完全饱和,并且似乎只以低至 70% 的速度运行)。不管怎样,通常事情都会完成,突然有很多事情要做的线程会以正常优先级完成,几乎同时以更高的优先级完成。

然而,虽然对较高优先级的繁忙线程的好处通常很小或没有,但减少量却很大。由于它是唯一获得 CPU 时间的线程,因此所有其他线程都会被卡住。因此,所有其他进程都会挂起一段时间。最终,调度程序注意到它们都已经等待了大约 3 秒,并通过将它们全部提升到最高优先级并给予它们比正常情况更大的切片来解决此问题。现在,我们的活动激增,因为没有时间的线程突然变成了所有需要 CPU 时间的最高优先级线程。除了高优先级线程外,每个线程都会出现突发情况,并且系统不会崩溃,尽管可能仍然有很多应用程序在标题栏中显示“未响应”。这远非理想,但它是处理比平常优先级更高的线程长时间占用核心的有效方法。

线程的优先级逐渐下降,最终我们回到这样一种情况:单个较高优先级的线程是唯一可以工作的线程。

为了额外的乐趣,如果我们的高优先级线程以任何方式依赖于较低优先级线程提供的服务,它最终会陷入等待它们的境地。希望以某种方式使其阻止并阻止自己造成任何损害,但可能不会。

总而言之,处理线程优先级时应非常谨慎,进程优先级更是如此。它们只有在快速产生并且对于其他线程的工作至关重要时才真正有效(例如,某些操作系统进程将以更高的优先级完成,.NET 中的终结器线程将高于进程的其余部分,等)或者亚毫秒级的延迟可能会搞砸(一些密集的媒体工作需要这样做)。