【问题标题】:How does a single CPU handle Multi-threaded and multi-process applications?单CPU如何处理多线程、多进程的应用?
【发布时间】:2014-08-22 05:12:29
【问题描述】:

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

【问题讨论】:

标签: multithreading cpu


【解决方案1】:

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

问题?

【讨论】:

  • @screenmutt:bw 线程和进程存在差异。线程是进程内的执行路径。此外,一个进程可以包含多个线程。
  • @ShirgillAnsari 我从来没有说过它们是同一回事,我只是描述了它们的运行方式。
  • 迄今为止的最佳答案。
  • 假设我们有多核 CPU 和多线程程序。该程序是仅使用 1 个核心 还是使用 许多核心 就像多处理一样?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    您的核心问题是:“[W]如果 CPU 一次可以处理一件事,那么多线程应用程序与多进程应用程序的优势是什么?

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

    多进程的优势在于这种相同的差异可以反过来争论。因为进程不会自动共享内存和文件描述符,所以当您不想共享它们时,将它们隔离起来会更容易。

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

    【讨论】:

    • 另外(除了单地址空间操作系统),进程不会自动共享虚拟内存映射,因此通过指针进行通信更加复杂。另一方面,进程为内存访问提供了更大的特权隔离。进程提供的隔离还可以使清理失败的进程更容易,并且使用并行的进程模型还可以鼓励对通信的思考(一个可能有助于正确性甚至性能的学科)。
    • @PaulA.Clayton 我同意。确实需要构建一套强大的工具来开发使用进程池的进程池应用程序,就像典型的多线程应用程序使用线程池一样。你不能只传递一个指针,所以它不能提供相同的 API。
    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多