当前位置: 首页 > 知识库问答 >
问题:

多线程实际上是并行处理还是只是一种错觉?

傅振濂
2023-03-14

因为一次只能运行一条指令,并且假设CPU只运行这个进程。多线程难道不是线程之间快速的上下文切换,给人一种并行处理的错觉,但实际上并不是在处理吗?

那么,既然CPU要执行的指令数是一样的,不管是单线程还是多线程,完成的时间不应该是一样的吗?如果是,说明多线程是并行处理的一种方式不是错的吗?

共有1个答案

上官波鸿
2023-03-14

Java多线程通常提供真正的并行性...而不仅仅是并行性的假象。

假设有10个不相交且独立的任务。如果单线程执行需要10分钟,每个任务需要1分钟,那么10个线程,每个任务一个线程会在1分钟内完成执行吗?

可能是,也可能不是。这取决于几件事:

是否有(至少)10个物理核心可用于运行这10个线程?

对于10个线程来说,它们是否有足够的内存带宽来执行对RAM的读/写瓶颈?

因为一次只能运行一条指令······

但是我们可以说,在传统机器上给定的核心或超线程通常一次只执行一个指令流。

...假设CPU只运行这个进程。

我想您指的不是GPU1,以及只有一个内核且没有超线程的CPU。

这些都不是一个有效的假设,即使是在低端笔记本电脑/台式机现在。

多线程难道不是线程之间快速的上下文切换,给人一种并行处理的错觉,但实际上并不是在处理吗?

实际上,如果在一个内核上运行多个线程,那么线程之间的上下文切换需要很长时间(数百个H/W指令)。而且很少发生。

那么,既然CPU要执行的指令数是一样的,不管是单线程还是多线程,完成的时间不应该是一样的吗?如果是,说明多线程是并行处理的一种方式不是错的吗?

如果您假设只有一个可用的核心/超线程,那么您的结论是正确的。然而,这种假设在现代计算机上通常是不正确的。

例如,我3岁的戴尔笔记本电脑有一个CPU有2个核心,每个核心有2个超线程,这可以给理论上的加速(由于硬件并行性!!)上升了4倍。(这还不是考虑使用GPU的可能性...)

 类似资料:
  • 到目前为止,我的印象是,在同一时间启动的两个线程也是并行执行的(两个线程都在同一时间运行它们的代码段),但我最近阅读了一些文档,我了解到它们实际上轮流执行它们的代码,因此第一个线程的代码段与第二个线程的代码段在同一时间执行是不存在的。我的理解正确吗? 如果是,那么多线程执行比单线程执行快多少?我这么问是因为唯一的区别是单线程顺序执行代码,而多线程可以轮流执行,但仍然需要相同的时间,因为它不是并行执

  • 问题内容: Scrapy中很少有并发设置,例如CONCURRENT_REQUESTS。这意味着Scrapy搜寻器是多线程的吗?因此,如果我运行它,将在字面上并行触发多个同时请求?我问是因为,我读过Scrapy是单线程的。 问题答案: Scrapy是单线程的,除了交互式外壳程序和一些测试之外,请参见source。 它建立在Twisted的基础上,Twisted也是单线程的,并且利用了它自己的异步并发

  • 问题内容: 到目前为止,据我了解:Javascript是单线程的。如果您推迟执行某些过程,则只需将其安排(排队)在线程空闲时下次运行。但是Async.js定义了两种方法:和,我引用: 并行(任务,[回调]) 并行运行一系列功能,而无需等到上一个功能完成。如果任何函数将错误传递给其回调… parallelLimit(任务,限制,[回调]) 与并行执行相同,仅并行执行任务,任何时候最多执行“限制”任务

  • 问题内容: 我想澄清这一点,因为文档对此不太清楚。 问题1: 是按顺序还是并行处理所有承诺?或者,更具体地说,它相当于运行像 或者是一些其他类型的算法的所有,,,,,等是被称为在同一时间(并行)和结果尽快返回所有的决心(或一个不合格品)? 问题2: 如果并行运行,是否有方便的方法可以依次运行可迭代程序? 注意 :我不想使用Q或Bluebird,而是要使用所有本机ES6规范。 问题答案: 正在执行的

  • 我们有一个基于quartz的调度程序应用程序,每分钟运行大约1000个作业,这些作业平均分布在每分钟的几秒钟内,即每秒大约16-17个作业。理想情况下,这16-17个作业应该同时触发,但是我们的第一条语句,它只是记录执行的时间,任务的execute方法调用得很晚。假设从05:00到05:04,我们每分钟安排1000个工作。因此,理想情况下,计划在05:03:50的作业应该在05:03:50记录ex

  • 在Flink中,像“平面地图”、“地图”等运算符称为任务,如果我将平面地图的并行度设置为30,那么这个任务有30个子任务。 现在,如果我只有一个插槽,它会在一个插槽中产生多个线程吗?还是每个插槽只有一个线程? Flink会在该插槽中简单地创建30个线程,还是使用类似线程池的东西? 以上不是一个恰当的例子。 假设在作业中我有操作符flatMap和map,它们都有并行度1,我只有一个插槽,这个插槽会创