java - 多任务延迟和吞吐量

标签 java multithreading multiprocessing multitasking

我一直在围绕多线程和多任务进行一些实验,但有几个问题。

1) 考虑一台只有一个 CPU 核心/处理器的机器。并行运行多个线程是通过时间切片实现的(每个线程都有几毫秒的时间在 CPU 上运行),如果一个线程在 I/O 上被阻塞,其他线程可以运行,从而给人一种印象同时做多件事。

考虑同一个单处理器 CPU,并假设有两个线程,这两个线程都是 CPU 密集型且不执行 I/O。 每个操作需要 5 秒才能完成。按顺序运行显然需要 10 秒。

Will running it parallely (using executor service) also take 10 seconds since the threads are CPU intensive only? (given that there is only one CPU core)

2) 在一台有四核的机器上,我有一个任务在独立运行时需要 5 秒才能完成。我想使用 Java 的 ProcessBuilder 作为单独的进程并行运行其中几个。 (我不想作为并行线程运行,因为它们共享的对象不是线程安全的,并且同步成本太大)。 我预计它会在 5 秒左右完成。

Starting two parallel process did not yield much improvement as they still took around 9 seconds to complete. Why is that? (the task is both CPU intensive and consumes significant memory). Note: As I start three or four processes, the latency is more and more affected (worse or equivalent to running them in sequence).

编辑

我的意图/问题更多地是关于为什么使用进程时性能没有得到改善,而不是我是否应该使用多个线程/进程来解决我的第二个问题。 对于问题2,(为了讨论)你可以简单地想象这样的任务:(尽管上面问题中提到的数字不是来自下面的代码片段)

String s;
for (int i = 0; i < 50000; i++) {
 s += i; //consumes a lot of memory
}

long result = 0;
for(int j = 0; j < 3; j++) {
  for (double i = 0; i < 500000000; i++) { //Lot of CPU
    result += i;
   }
}

最佳答案

Answer to your 1st question:

进程/线程突发图如下所示

I/O ==> CPU ==> I/O ===> CPU ==>...... I/O..... ==> CPU == > I/o

很明显,它们将以 I/O 突发开始和结束,并且单个处理器上的多处理/线程只能以时间复用方式实现,就像您所说的那样。

回答你的问题: 这里,您的两个作业/线程都是 CPU 绑定(bind)作业,并且不包含任何内部 I/O(请参阅上面提到的流程)操作。因此,它可能需要与顺序设置相同的时间。如果您有很多线程以相同的方式运行,而这些线程没有任何内部 I/O 绑定(bind)操作,则可能会比顺序访问花费更多的时间,因为这样会在上下文切换上花费大量时间。

由于这种情况,长期调度程序被设计和编程为将 I/O 绑定(bind)和 Cpu 绑定(bind)作业的适当组合放入就绪队列中。

关于java - 多任务延迟和吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44341998/

相关文章:

python - 多处理写入python数组的函数循环

Python多处理第二个进程未启动

java - 无法获取线程转储?知道为什么我的应用程序会阻塞吗?

java - Kafka 0.10.2 消费者获得大量重复项

python - 为什么相同的作业在 python 的 multiprocessing.Pool 中以不同的速度运行?

Java VisualVM (jvisualvm) 工具在启动时抛出警告 "could not install some modules"

multithreading - Node.js C++ 插件 : Multiple callbacks from different thread

java - Android 中的 HTTPURL 连接速度慢

java - 当一个字段属于抽象类时,它是否是静态的有什么区别吗?

java - 如何处理: java. lang.ArrayIndexOutOfBoundsException:1