代码之家  ›  专栏  ›  技术社区  ›  Buu

关于在几个CPU机器中有多个线程的应用程序的问题

  •  2
  • Buu  · 技术社区  · 16 年前

    给一台有1个CPU和大量RAM的机器。除了其他类型的应用程序(Web服务器等),该计算机上运行的其他2个服务器应用程序执行完全相同的处理,尽管其中一个使用10个线程,其他用户使用1个线程。假设每个请求的处理逻辑是100%CPU绑定的,通常不超过2秒即可完成。问题是,就每分钟处理的事务而言,谁的吞吐量可能更好?为什么?

    注意,上面不是一个真实的环境,我只是整理数据来澄清问题。我目前的想法是,应该没有区别,因为应用程序是100%CPU限制的,因此如果机器能够处理第二个应用程序每分钟30个请求,它也将能够处理每分钟3个请求为第一个应用程序的10个线程。但我很高兴被证明是错误的,因为机器中还有其他应用程序在运行,一个应用程序可能不会总是被给予100%的CPU时间。

    5 回复  |  直到 16 年前
        1
  •  1
  •   teeks99    16 年前

    有趣的问题。

    我编写了一个示例程序,只执行这个操作。它有一个类,将执行一些处理器密集型工作,然后返回。我指定要运行的线程总数,以及要运行工作的总次数。然后,程序将在所有线程之间平均分配工作(如果只有一个线程,那么它只获取所有线程),并启动所有线程。

    我在一个单进程虚拟机上运行这个程序,因为我可以找到一台真正的计算机,里面只有一个处理器。

    独立运行:

    1 Thread    5000 Work Units - 50.4365sec
    10 Threads  5000 Work Units - 49.7762sec
    

    这似乎表明,在一个单进程的PC上,有许多线程在做处理器密集型的工作,Windows足够聪明,不能快速地将它们切换回第四个进程,而且它们所花费的时间差不多相同。

    一起跑(或者尽可能地同时推动回车键):

    1 Thread    5000 Work Units - 99.5112sec
    10 Threads  5000 Work Units - 56.8777sec
    

    这就是问题的症结所在。当您运行10个线程+1个线程时,它们的调度似乎都是一样的。10个线程每个线程花费了1/10的时间(因为有第11个线程在运行),而另一个线程花费了几乎两倍的时间(实际上,它在前56秒完成了1/10的工作,然后在接下来的43秒完成了9/10的工作……这是正确的)。

    结果:window的调度程序在线程级别上是公平的,但在进程级别上是不公平的。如果你制作了大量的线程,那么你就可以把其他不聪明的进程留下来,让大量的线程高高而干。或者只要做对了,我们就有一个线程池:—)

    如果您有兴趣自己尝试,可以找到我的代码: http://teeks99.com/ThreadWorkTest.zip

        2
  •  3
  •   Mark Ransom    16 年前

    任务切换总是会有一些开销,所以如果线程没有阻塞任何东西,那么线程越少越好。此外,如果线程没有执行相同的代码部分,那么每次切换时都会刷新一些缓存。

    另一方面,差异可能无法测量。

        3
  •  1
  •   lothar    16 年前

    调度开销可能会使具有10个线程的应用程序比具有1个线程的应用程序慢。除非创建一个测试,否则您将无法确定。

    有关多线程处理的一些背景,请参见 http://en.wikipedia.org/wiki/Thread_(computer_science)

        4
  •  1
  •   Uri    16 年前

    这很可能取决于操作系统调度程序。例如,在单线程的日子里,调度器只知道进程,并有“niceness”这样的度量来计算分配多少。

    在多线程代码中,如果另一个进程只有一个线程,那么一个拥有100个线程的进程可能无法获得99%的CPU时间。另一方面,如果您只有两个进程,其中一个是多线程的,我会怀疑操作系统可能会给它更多的总体时间。然而,阿法克什么都不能保证。

    同一进程中线程之间的切换成本可能比进程之间的切换成本更低(例如,由于缓存行为)。

        5
  •  0
  •   Joe Phillips    16 年前

    您必须考虑的一件事是事务另一端的等待时间。拥有多个线程将允许您在准备下一个事务时,在一个线程上等待响应。至少我是这样理解的。所以我认为一些线程会比一个更好。

    另一方面,您必须考虑处理多个线程所涉及的开销。申请的细节是这里考虑的重要部分。