Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 什么是cpu松弛?_Multithreading_Performance_Concurrency_Performance Testing_Java.util.concurrent - Fatal编程技术网

Multithreading 什么是cpu松弛?

Multithreading 什么是cpu松弛?,multithreading,performance,concurrency,performance-testing,java.util.concurrent,Multithreading,Performance,Concurrency,Performance Testing,Java.util.concurrent,以下是《Java并发性实践》一书的摘录,第12.2章性能测试,作者在书中讨论了有界缓冲区实现的吞吐量 图12.1显示了使用缓冲区的四向机器上的一些示例结果 容量为1、10、100和1000。我们立即看到一个缓冲区 1的大小导致吞吐量非常低;这是因为每个线程 在阻塞和等待之前只能取得一点点进展 另一条线。将缓冲区大小增加到10有很大帮助,但是 超过十倍的收益会递减 一开始添加更多线程可能有点令人费解 只会略微降低性能。原因很难从表面上看出来 数据,但在CPU性能表(如perfbar)上很容易看到

以下是《Java并发性实践》一书的摘录,第12.2章性能测试,作者在书中讨论了有界缓冲区实现的吞吐量

图12.1显示了使用缓冲区的四向机器上的一些示例结果 容量为1、10、100和1000。我们立即看到一个缓冲区 1的大小导致吞吐量非常低;这是因为每个线程 在阻塞和等待之前只能取得一点点进展 另一条线。将缓冲区大小增加到10有很大帮助,但是 超过十倍的收益会递减

一开始添加更多线程可能有点令人费解 只会略微降低性能。原因很难从表面上看出来 数据,但在CPU性能表(如perfbar)上很容易看到 测试正在运行:即使有许多线程,也不需要太多的计算 继续,大部分时间都花在阻塞和取消阻塞线程上。所以 有足够的CPU空闲时间让更多的线程做同样的事情 不会对性能造成很大影响

然而,要小心从这些数据中得出结论,你可以 始终向使用 有界缓冲区。这个测试在模拟环境方面是相当人工的 应用制作人几乎不做任何工作来生成项目 放置在队列中,消费者几乎不处理该项目 恢复。如果工作线程在真实的生产者-消费者中执行 应用程序执行一些非平凡的工作来生成和使用项目(如 通常情况下是这样),那么这种松弛就会消失,并且 线程过多的影响可能非常明显。这个 此测试的主要目的是测量 通过有界缓冲区的生产者-消费者切换对总体性能产生影响 吞吐量

作者在这里所说的cpu松弛是什么意思?为什么随着线程数量的增加,吞吐量不会越来越低?假设缓冲区大小的界限保持不变,我不会遵循作者给出的关于在添加越来越多线程时性能略有下降的推理


编辑:我可以想到一个原因:因为在这种情况下,线程没有完成任何实际工作,所以共享内存总线上流量增加这一经典问题,随着越来越多的线程被添加,由于线程上下文切换而导致的缓存未命中数没有发挥主要作用。一旦线程开始做更多的工作,情况就会改变。这就是作者在第三段中试图表达的意思吗?

没有CPU松弛这样的正式术语。作者的意思只是说CPU没有被充分利用来做有意义的工作,因为大部分时间都花在等待成功获取互斥锁上。作者正在调用CPU的未使用容量,即CPU松弛

注意:关联的代码测试多生产者/多消费者场景,生产者和消费者的数量相等

编辑:在后面的讨论中,他们讨论了添加更多线程的效果,如果a)线程几乎不做任何工作,b)对于每个生产或消费的项目,线程都会占用大量CPU。我将尝试用一些稍微人为的场景来解释这种差异

假设锁定主动占用1个时间单位,等待被动占用8个时间单位。被动等待不会占用CPU

案例1:生产者消费者成本为1倍单位。

因此,我们目前占CPU时间的2个时间单位 额外8个时间单位的被动等待时间。所以我们有8/10 可用的CPU时间单位

如果我们现在想将线程数量增加一倍,我们需要适应 额外2个时间单位(1个用于生产者-消费者材料,1个用于 主动锁定时间)。这将消耗我们可用CPU的供应 时间——但我们有足够的时间

案例2:生产者消费者成本为11个时间单位。

因此,我们目前考虑了11+1=12个CPU时间单位,外加8个被动等待时间单位。所以我们有8/20可用的CPU时间单位

如果我们现在想将线程的数量增加一倍,我们需要容纳额外的12个时间单位(11个用于生产者-消费者,1个用于活动锁定时间)。这超出了可用的CPU时间单位。必须提供一些东西——因此等待时间将增加,吞吐量将受到影响


因此,在案例2中,实际工作量减少了新线程的可用时间,从而增加了锁定争用对吞吐量的影响。如果他们在书中也包括了这种想象情景的数字,那就太好了。这会使他们的论点更容易理解。

我认为cpu闲置是资源。根据维基百科的说法,它指的是如果一项工作现在就开始,那么该工作结束后剩余的时间。
大量的cpu空闲意味着大量的计算资源。当消费者/生产者做一些不寻常的事情时,cpu松弛会减少并影响吞吐量。

请参阅更新。这个问题还有第二部分。这是否意味着如果生产者-消费者成本和锁定时间大于被动等待时间,吞吐量将受到影响?