java - 为什么像这样与 I/O 或访问共享数据有关的计算问题需要的不仅仅是 Ncpu 线程产生的最佳吞吐量?
问题描述
Java并发实践:
对于此类不进行 I/O 且不访问共享数据的计算问题,N cpu或 N cpu + 1 个线程会产生最佳吞吐量;更多线程无济于事,实际上可能会因为线程竞争 CPU 和内存资源而降低性能。
为什么像这样与 I/O 或访问共享数据有关的计算问题需要的不仅仅是 Ncpu 线程产生的最佳吞吐量?
我的理解:
I/O操作会被阻塞。共享数据会被锁同步,其他线程也会被阻塞等待共享数据锁。如果只有N个cpu线程,线程会被阻塞,cpu会保持空闲,导致cpu闲置。
我的理解正确吗?
解决方案
为什么像这样与 I/O 或访问共享数据有关的计算问题需要的不仅仅是 Ncpu 线程产生的最佳吞吐量?
他们不一定需要 更多线程。
引用的意思是,具有显着 I/O 或显着锁争用的问题可能2 受益于比 CPU 更多的线程。添加更多线程可能会增加吞吐量。如果一个线程在 I/O 或锁上阻塞,调度程序将尝试将 CPU 重新分配给另一个线程。因此,如果线程数多于 CPU,则更有可能有线程等待运行。
1 - 例如,如果没有任何实际工作要做,添加线程没有任何区别。此外,您可能不希望应用程序使用所有可用资源。“最佳吞吐量”可能需要在比单个 Java 应用程序更大的范围内考虑。
2 - 我们不能说它会受益。例如,如果系统已经 I/O 饱和,那么添加一个只会产生更多 I/O 流量的额外线程将无济于事。类似的论点可能适用于锁争用。
推荐阅读
- python - Maya 返回 TypeError:“NoneType”对象不可迭代
- python - Spacy 从训练模型中提取命名实体关系
- rest - 将大文件上传到 OneDrive 共享文件夹问题(createUploadSession 错误)
- python - 如何在熊猫中测试字符串包含列表中的一个子字符串?
- spring-boot - 用于 Jhipster 应用程序的报告工具(Crystal Reports、Infomaker...)?
- android - 在地图mapbox上绘制geoJson
- python - 访问被拒绝。; 尝试训练张量流模型时出现输入/输出错误
- java - 在 Lombok 的构建器中使用自定义设置器和超类
- ansible - 如何在ansible playbook中动态更改主机
- python - TypeError:在尝试将输入放入 Web 浏览器时,需要一个类似字节的对象,而不是“元组”