鉴于一台具有1个CPU和大量RAM的机器。除了其他类型的应用程序(Web服务器等)之外,在该机器上运行的另外两个服务器应用程序执行完全相同的处理,尽管一个使用10个线程而另一个用户使用1个线程。假设每个请求的处理逻辑都是100%CPU限制的,通常不会超过2秒完成。问题是,就每分钟处理的交易而言,其吞吐量可能更好?为什么呢?
请注意,以上不是真实的环境,我只是编写数据以明确问题。我目前的想法是应该没有区别,因为应用程序是100%CPU限制的,因此如果机器可以为第二个应用程序每分钟处理30个请求,它也将能够每分钟处理3个请求。第一个应用程序的10个主题。但我很高兴被证明是错误的,因为机器中正在运行其他应用程序,并且一个应用程序可能不会总是给予100%的CPU时间。
答案 0 :(得分:3)
任务切换总是涉及一些开销,因此如果线程没有阻塞任何东西,通常更少的线程更好。此外,如果线程没有执行相同的代码部分,每次切换时都会有一些缓存刷新。
另一方面,差异可能无法衡量。
答案 1 :(得分:1)
调度开销可能会使应用程序的10个线程比具有1个线程的应用程序慢。除非您创建测试,否则您无法确定。
有关多线程的一些背景,请参阅http://en.wikipedia.org/wiki/Thread_(computer_science)
答案 2 :(得分:1)
这很可能取决于操作系统调度程序。例如,在单线程时代,调度程序只知道进程,并且有“好看”之类的措施来计算分配的数量。
在多线程代码中,如果有另一个具有单个线程的进程,则可能有一种方法,其中一个具有100个线程的进程不会获得99%的CPU时间。另一方面,如果您只有两个进程,其中一个是多线程的,我会怀疑操作系统可能会给它更多的总时间。但是,AFAIK没有什么可以保证的。
在相同进程中的线程之间切换成本可能比在进程之间切换(例如,由于高速缓存行为)更便宜。
答案 3 :(得分:1)
有趣的问题。
我写了一个示例程序就是这样做的。它有一个类将进行一些处理器密集型工作,然后返回。我指定了我想要运行的线程总数,以及我希望工作运行的总次数。然后程序将平均分配所有线程之间的工作(如果只有一个线程,它只是全部完成)并启动它们。
我在单个proc VM上运行它,因为我可以找到一台只有1个处理器的真正计算机。
独立运行:
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,然后是其他9个/在接下来的43秒中排名第10 ......这是关于右边的。
结果:Window的调度程序在线程级别上是公平的,但在进程级别上却不公平。如果你制作了很多线程,那么你就可以让其他不聪明的进程让很多线程变得高而且干燥。或者只是做正确的我们一个线程池: - )
如果您有兴趣亲自尝试,可以找到我的代码: http://teeks99.com/ThreadWorkTest.zip
答案 4 :(得分:0)
您必须考虑的一件事是在交易的另一端等待时间。拥有多个线程将允许您在准备下一个事务时等待一个响应。至少这是我理解它的方式。所以我认为一些线程会比一个线程更好。
另一方面,您必须考虑处理多个线程所涉及的开销。申请细节是这里考虑的重要部分。