TL;DR
单核上的多线程可以通过使用线程和指令级并行性来加速应用程序。
如果单个 CPU 有多个内核,它将在每个内核上运行一个进程。如果没有,则需要在单核上的进程之间切换。
多线程和多处理可以结合使用以获得更好的结果。
完整说明
多处理系统包括多个完整的处理单元,多线程旨在通过使用线程级和指令级并行性来提高单个内核的利用率。由于这两种技术是互补的,因此它们有时会在具有多个多线程 CPU 的系统和具有多个多线程内核的 CPU 中结合使用。 Multithreading | WIkipedia
示例
单个 CPU 以这种方式处理多线程。
假设我们有两个进程A 和B 需要运行一组命令。在每个命令之后,线程需要结果。以下是它们需要运行的线程和命令。
| # | Thread A | Thread B|
|---|----------|---------|
| 1 | 1 | 5 |
| 2 | 3 | 1 |
| 3 | Wait | 3 |
| 4 | 4 | 2 |
现在让我们看看 CPU 将如何执行这些(理论上)
CPU 以线程 A 开始
CPU Pipeline
x x x x x x (1)
1 x x x x x (2) # Thread A, command 1 (1)
5 1 x x x x (3) # Thread B, command 1 (5)
3 5 1 x x x (4) # Thread A, command 2 (3)
1 3 5 1 x x (5) # Thread B, command 2 (1)
3 1 3 5 1 x (6) # Thread B, command 3 (3)... A is waiting for result of command 2
2 3 1 3 5 1 (7) # Thread B, command 4 (2)
x 2 3 1 3 5 (8)
x x 2 3 1 3 (9)
x x x 2 3 1 (10)
4 x x x 2 3 (11) # Thread A, command 4... A now has the result and can continue.
x 4 x x x 2 (12)
x x 4 x x x (13)
x x x 4 x x (14)
x x x x 4 x (15)
x x x x x 4 (16)
x x x x x x (17)
这就是没有多线程的情况。
CPU Pipeline
x x x x x x (1)
1 x x x x x (2) # Thread A, command 1 (1)
3 1 x x x x (3) # Thread A, command 2 (3)... A is waiting for result of command 2
x 3 1 x x x (4)
x x 3 1 x x (5)
x x x 3 1 x (6)
x x x x 3 1 (7)
x x x x x 3 (8)
4 x x x x x (9) # Thread A, command 4 (4)... A now has the result and can continue
x 4 x x x x (10)
x x 4 x x x (11)
x x x 4 x x (12)
x x x x 4 x (13)
x x x x x 4 (14)
5 x x x x x (15) # Thread B, command 1 (5)
1 5 x x x x (16) # Thread B, command 2 (1)
3 1 5 x x x (17) # Thread B, command 3 (3)
2 3 1 5 x x (18) # Thread B, command 4 (2)
x 2 3 1 5 x (19)
x x 2 3 1 5 (20)
x x x 2 3 1 (21)
x x x x 2 3 (22)
x x x x x 2 (23)
x x x x x x (24)
因此,使用多线程,线程将在 17 时间步之后完成,否则将花费 24。
问题?