【问题标题】:Why would I have to use multiple threads for one processing task if i can turn up the priority of the program?如果我可以提高程序的优先级,为什么我必须为一个处理任务使用多个线程?
【发布时间】:2012-01-17 22:22:08
【问题描述】:

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

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

放置prio的利弊是什么?:)

【问题讨论】:

    标签: multithreading operating-system


    【解决方案1】:

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

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

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

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

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

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

    大多数时候,无论如何,大多数线程都没有做太多事情,这可以从大多数系统上的大多数时间 CPU 使用率低于 100% 标记的事实中看出(超线程扭曲了这一点,内部调度cores 意味着超线程系统可以完全饱和,并且似乎仅以低至 70% 运行)。无论如何,通常事情都会完成,突然有很多事情要做的线程会以正常优先级在几乎相同的时间以更高的优先级执行。

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

    线程的优先级逐渐下降,最终我们又回到了只有一个更高优先级的线程才能工作的情况。

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

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

    【讨论】:

      【解决方案2】:

      如果您的系统中有多个内核/处理器,则提高单线程程序的优先级不会大大提高您的性能,因为其他内核仍将未被使用。

      利用多个处理单元的唯一方法是使用多个线程/进程编写程序。

      话虽如此,将您的多线程应用程序设置为非常高的优先级可能会带来一些性能改进,但我真的从来没有看到它有什么意义,至少在我自己的测试中是这样。

      编辑:我现在看到您只使用一个核心。基本上,您的程序将能够比其他优先级较低的进程更频繁地在 CPU 上运行。这可能会给你带来微小的改善,但不会带来戏剧性的改善。由于我们无法知道您的系统上同时运行了哪些其他应用程序,因此这里的黄金法则是自己尝试使用不同的优先级,看看会发生什么。这是判断事情是否会更快的唯一有效方法。

      【讨论】:

      • 对不起,我没有指定足够好,我实际上是在谈论单核系统,我会相应地编辑我的消息
      【解决方案3】:

      这完全取决于数据处理速度慢的原因。

      如果数据处理速度很慢,因为它是真正的 cpu 密集型操作,那么将其拆分为单个核心系统上的多个线程不会给您带来任何好处。在这种情况下,假设其他进程正在使用(用户)cpu 时间,那么提高任务优先级会带来一些好处。

      但是,如果由于某些非 cpu 限制(例如,如果它是 I/O 绑定,或依赖于另一个进程),数据处理操作很慢,那么:

      1. 提高任务优先级的影响可以忽略不计。任务优先级不会影响 I/O 时间,如果依赖于系统上的另一个进程,您实际上可能会损害性能。

      2. 将数据处理拆分为多个线程可以允许 CPU 密集型区域继续处理,同时等待非 CPU 密集型(例如 I/O)区域完成。

      【讨论】:

      • 我认为他的模型是我所读到的生产者-消费者模型,由一个生产者处理 I/O。我认为我们可以假设工作人员受 CPU 限制。
      【解决方案4】:

      提高单线程进程的优先级只会在运行该进程的一个内核上为您提供更多(或更大)的时间片。核心仍然一次只能做一件事。

      如果你分离一个线程来处理数据,它可以在不同的处理器内核上运行(假设是多核系统),它和你的主线程实际上是同时执行的。效率更高。

      【讨论】:

        【解决方案5】:

        如果您只使用一个线程,您的服务器应用程序一次只能处理一个请求,无论其优先级如何。如果您使用多个线程,您可以同时为多个线程提供服务。

        【讨论】:

        • 话虽如此,那里有很多很棒的单线程服务器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多