从磁盘读取并并行处理

Reading from disk and processing in parallel

这将是最基本的问题,甚至可能是愚蠢的问题。当我们谈论使用多线程来更好地利用资源时。例如,应用程序从本地文件系统读取和处理文件。假设从磁盘读取文件需要 5 秒,处理它需要 2 秒。

在上面的场景中,我们说使用两个线程一个读取另一个处理会节省时间。因为即使一个线程正在处理第一个文件,其他并行线程也可以开始读取第二个文件。

问:这是不是因为CPU的设计方式。因为有不同的处理单元和不同的 read/write 单元所以这两个线程甚至可以在单核机器上并行工作,因为它们实际上是由不同的模块处理的?或者这需要多核。

对不起,我很愚蠢。 :)

理论上是的。单核具有相同的并行度。一个线程等待从文件中读取(I/O 等待),另一个线程正在处理之前已经读取的文件。在 I/O 操作完成之前,第一个线程实际上无法 运行 状态。在此状态下不使用 cpu 资源。第二个线程消耗 CPU 资源并完成任务。确实,多核 CPU 具有更好的性能。

首先,有一个 difference between concurrency and parallelism。理论上,单核机器是不支持并行的。

关于并发(使用线程)导致性能提升的问题,它非常依赖于实现。以 Android 或 Swing 为例。它们都有一个主线程(或 UI 线程)。在主线程上进行大量计算会阻塞 UI 并导致无响应。因此,从外行的角度来看,这将是糟糕的表现。

在你的情况下(我假设没有 UI 线程)你将受益于将处理委托给另一个线程取决于很多因素,特别是线程的实现。例如同步线程不如非同步线程好。 你的问题陈述让我想起了经典的消费者生产者问题。因此,使用线程对于您的工作来说并不是最好的选择,因为您需要同步线程。 IMO 最好在单个线程中完成所有读取和处理。

多线程也会有上下文切换成本。它没有 Process 的上下文切换那么大,但它仍然存在。 See this link.

[编辑] 对于这种生产者消费者场景,您最好使用 BlockingQueue

在单处理器上,多线程是通过时间分片来实现的。一个线程会做一些工作,然后它会切换到另一个线程。

当一个线程正在等待某些 I/O,例如文件读取时,它会过早地放弃它的 CPU 时间片,允许另一个线程使用 CPU.

即使在单核上,与单线程相比,整体吞吐量也有所提高。

以下关键字:

  • = 正在 CPU
  • 上工作
  • - I/O
  • _ 空闲

单线程:

====--====--====--====--

两个线程:

====--__====--__====--__
____====--__====--__====

因此,您可以看到如何在 CPU 保持忙碌的同时完成更多工作,而以前它一直在等待。存储设备的使用也越来越多