单个CPU如何处理多线程和多进程应用程序?

时间:2014-07-01 15:13:06

标签: multithreading cpu

正如我已经读到的那样,对于多进程应用程序,单个CPU一次只能处理一个任务,在两个进程之间切换上下文。在多线程应用程序中,单个CPU可以处理多个线程。我不明白。如果只有一个CPU,CPU是否一次处理一个线程?如果是,如果CPU可以一次处理一件事,那么多线程应用程序与多进程应用程序的优势在哪里。

3 个答案:

答案 0 :(得分:14)

<强> TL; DR

单核上的多线程可以通过使用线程和指令级并行来加速应用程序。

如果单个CPU有多个内核,它将在每个内核上运行一个进程。如果没有,则需要在单核上的进程之间切换。

可以组合多线程和多处理以获得更好的结果。

完整说明

  

在多处理系统包括多个完整处理单元的情况下,多线程旨在通过使用线程级和指令级并行来提高单个核的利用率。由于这两种技术是互补的,因此有时将它们组合在具有多个多线程CPU的系统中以及具有多个多线程核心的CPU中。 Multithreading | WIkipedia

示例

单个CPU以这种方式处理多线程。

假设我们有两个进程AB需要运行一组命令。在每个命令之后,线程需要结果。以下是运行所需的线程和命令。

| # | 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

有问题吗?

答案 1 :(得分:1)

你的核心问题是:“ [W]这里有多线程应用程序与多进程应用程序的优势,如果CPU一次可以处理一件事情吗?

简单的答案就是这样 - 线程自动共享所有内存和文件描述符。如果使用多进程应用程序,则必须手动安排共享内存或在需要时切换文件描述符。无论内核数量多少,多线程与多进程并行的相对优势和缺点几乎相同。

多流程的优势是相同的差异反过来说。由于进程不会自动共享内存和文件描述符,因此当您不希望它们共享时,更容易隔离事物。

从实际角度来看,答案通常是有效创建多进程应用程序所需的软件尚不存在。而创建多线程应用程序所需的软件确实如此。现在没有好的库允许您拥有一个进程池并将任务分派给第一个可用进程。没有很好的方法可以获得跨进程共享的各种类型的内存中集合。相比之下,这些工具可广泛用于线程。

答案 2 :(得分:0)

是的,一个CPU可以处理许多进程或线程。它可以通过停止一个线程,暂停它并启动另一个线程来实现。您可能有几个原因需要这样做。首先,许多进程在等待外部事件(例如磁盘或数据库)时会花费一些时间,然后CPU可以处理其他事情。

同样在计算机价格昂贵的日子里,它允许许多人分享使用一台计算机。当我开始我的CS学位时,该部门有一个人人使用的HP Unix服务器。所以我可以编辑和编译代码,而另一个用户正在检查他的电子邮件,另外20个人正在处理这个或那个。

自60年代以来,这种形式一直在使用。