38

我对单线程和多线程编程之间的区别有一个误解,所以我想回答下面的问题,以使一切清楚。

假设有 9 个独立的任务,我想用一个单线程程序和一个多线程程序来完成它们。基本上它会是这样的:

单线程:

- Execute task 1
- Execute task 2
- Execute task 3
- Execute task 4
- Execute task 5
- Execute task 6
- Execute task 7
- Execute task 8
- Execute task 9

多线程:

线程1:

- Execute task 1
- Execute task 2
- Execute task 3

线程2:

- Execute task 4
- Execute task 5
- Execute task 6

线程3:

- Execute task 7
- Execute task 8
- Execute task 9

据我了解,一次只会执行一个线程(获取CPU),一旦量子完成,线程调度程序会将CPU时间分配给另一个线程。

那么,哪个节目会更早完成呢?它是多线程程序(逻辑上)吗?还是单线程程序(因为多线程有很多上下文切换需要一些时间)?为什么?我需要一个很好的解释:)

4

6 回答 6

37

这取决于。

你有多少个CPU?您的任务涉及多少 I/O?

  1. 如果您只有 1 个 CPU,并且任务没有阻塞 I/O,那么单线程的完成速度将等于或快于多线程,因为切换线程会产生开销。

  2. 如果您有 1 个 CPU,但任务涉及大量阻塞 I/O,您可能会看到使用线程的加速,假设工作可以在 I/O 进行时完成。

  3. 如果您有多个 CPU,那么您应该会看到多线程实现比单线程加速,因为可以并行执行多个线程。当然,除非任务以 I/O 为主,在这种情况下,限制因素是您的设备速度,而不是 CPU 功率。

于 2012-04-11T17:10:02.017 回答
11

据我了解,一次只会执行一个线程

如果 CPU 只有一个内核,就会出现这种情况。现代 CPU 具有多个内核,并且可以并行运行多个线程。

运行三个线程的程序运行速度几乎快三倍。即使任务是独立的,计算机中仍有一些资源必须在线程之间共享,例如内存访问。

于 2012-04-11T17:10:32.347 回答
3

假设集:单核,无超线程;任务受 CPU 限制;每个任务需要 3 个 quanta 的时间;每个调度程序分配限制为 1 个时间量;FIFO 调度器 非抢占式;所有线程同时命中调度器;所有上下文切换都需要相同的时间;

流程描述如下:

  • 测试1:单进程,单线程(包含所有9个任务)
  • 测试 2:单进程,三个线程(每个包含 3 个任务)
  • 测试 3:三个进程,每个单线程(每个包含 3 个任务)
  • 测试 4:三个进程,每个进程有三个线程(每个包含一个任务)

有了上述假设,它们都同时完成。这是因为为 CPU 安排了相同的时间量,上下文切换是相同的,没有中断处理,没有任何东西在等待 IO。

如需更深入地了解其本质,请参阅这本书

于 2012-04-11T17:28:42.007 回答
2

好吧,这并不完全与语言无关。一些解释型编程语言不支持真正的线程。也就是说,执行线程可以由程序定义,但解释器是单线程的,因此所有执行都在 CPU 的一个核心上。

对于编译语言和支持真正多线程的语言,单个 CPU 可以有多个内核。实际上,现在大多数台式计算机都有 2 或 4 个内核。因此,执行真正独立任务的多线程程序可以根据 CPU 中可用内核的数量快 2-4 倍。

于 2012-04-11T17:12:58.837 回答
1

Java中单线程和多线程的主要区别在于,单线程执行一个进程的任务,而在多线程中,多个线程执行一个进程的任务。

进程是正在执行的程序。进程创建是一项消耗资源的任务。因此,可以将一个进程划分为多个称为线程的单元。线程是一个轻量级进程。可以将单个进程划分为多个线程并为它们分配任务。当一个进程中有一个线程时,它被称为单线程应用程序。当一个进程中有多个线程时,称为多线程应用程序。

于 2019-07-04T09:28:54.737 回答
-1

ruby vs python vs nodejs : web 应用程序中的性能,需要大量的 I/O 非阻塞rest/dbQuery 会影响很多。作为所有 3 个中唯一的多线程,nodejs 是领先差距很大的赢家

于 2019-02-22T02:11:27.567 回答