gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:26:47 24 4
gpt4 key购买 nike

早些时候我询问了处理数据流的问题,有人建议将数据放入队列并在不同的线程上处理这些数据。如果这很慢,我应该使用多个线程。

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

放置优先级的优点和缺点是什么?:)

最佳答案

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

如果您的应用程序有一个 GUI,那么它可以从多线程中受益,因为它不会更快地进行处理(实际上更慢,但如果任务很长可能可以忽略不计),它仍然可以对用户使用react同时输入。

如果您有两个或更多内核,那么您还可以获得 CPU 密集型操作,尽管这样做从微不足道到不可能,具体取决于该操作是什么。这与您的情况无关,但如果您编写的代码以后可以在多核系统上运行,则通常值得考虑。

但是,提高优先级可能是一个坏主意,尤其是当您只有一个内核时(多核系统的一个优点是提高优先级的人不会造成太大的伤害)。

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

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

大多数情况下,大多数线程并没有做太多事情,这可以从以下事实中看出:大多数系统上的大部分时间 CPU 使用率低于 100% 标记(超线程偏向于此,内核内的内部调度意味着超线程系统可以完全饱和,并且似乎只能以低至 70% 的速度运行)。无论如何,通常事情已经完成,一个突然有很多事情要做的线程会以正常的优先级在几乎相同的时间内完成。

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

线程的优先级逐渐降低,最终我们又回到了唯一可以工作的高优先级线程的情况。

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

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

关于multithreading - 如果我可以调高程序的优先级,为什么我必须为一项处理任务使用多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com