我正在Java中实现工作池。
这本质上是一堆对象,它们将拾取数据块、处理数据并存储结果。由于IO等待时间很长,所以工作线程要比处理器核心多得多。
服务器专门用于此任务,我希望从硬件中获得最大的性能(但我不想用C++来实现)。
最简单的实现方法是有一个单独的Java进程创建和监视多个工作线程。另一种方法是为每个工作线程运行Java进程。
假设有一台四核Linux服务器,你预计哪种解决方案更具性能,为什么?
您可以假设工作线程永远不需要相互通信。
我正在Java中实现工作池。
这本质上是一堆对象,它们将拾取数据块、处理数据并存储结果。由于IO等待时间很长,所以工作线程要比处理器核心多得多。
服务器专门用于此任务,我希望从硬件中获得最大的性能(但我不想用C++来实现)。
最简单的实现方法是有一个单独的Java进程创建和监视多个工作线程。另一种方法是为每个工作线程运行Java进程。
假设有一台四核Linux服务器,你预计哪种解决方案更具性能,为什么?
您可以假设工作线程永远不需要相互通信。
一种进程,多个线程 - 几个原因。
在切换任务时,对于某些处理器来说,线程间的切换比进程间更加经济实惠。在这种I/O密集型情况下,工作线程数多于核心数尤其重要。您在受到I/O阻塞之前所做的工作越多,这一点就变得不那么重要了。然而,良好的缓存将为线程 或 进程付出努力。
在同一个JVM中切换线程时,至少一些Linux实现(特别是x86)不需要刷新缓存。请参见Tsun的博客。线程之间的缓存污染将被最小化,因为它们可以共享程序缓存,执行相同的任务,并共享代码的同一副本。我们在每次切换时节约100纳秒到几微秒的时间。如果这对您来说微不足道,请继续阅读...
根据设计,对于一个进程来说,I/O数据路径可能会更短。
线程的启动和预热时间通常更短。操作系统不需要启动进程,Java不需要启动另一个JVM,类加载只进行一次,JIT编译只进行一次,并且HotSpot优化只进行一次,并且更早。