【问题标题】:Why are threads called lightweight processes?为什么线程被称为轻量级进程?
【发布时间】:2011-01-17 01:48:07
【问题描述】:

线程是“轻量级”的,因为大部分开销已经通过创建它的进程来完成。

我在其中一个教程中发现了这一点。

有人可以详细说明它的确切含义吗?

【问题讨论】:

  • 持续关注“进程创建”和您的操作系统,您会看到创建进程需要多少开销。
  • @No Refunds No Returns:您会发现操作系统之间的差异很大。
  • @No Refunds No Returns - 多核机器上线程之间的缓存同步或上下文切换和保存堆栈状态和寄存器集的开销是什么?

标签: c multithreading pthreads


【解决方案1】:

进程创建是“昂贵的”,因为它必须使用自己的地址空间为进程设置一个全新的虚拟内存空间。 “昂贵”意味着占用大量 CPU 时间。

线程不需要这样做,只需改变几个指针,所以它比创建一个进程“便宜”得多。线程不需要这个的原因是它们运行在地址空间和父进程的虚拟内存中。

每个进程必须至少有一个线程。因此,如果您考虑一下,创建进程意味着创建进程并创建线程。显然,只创建一个线程将花费更少的时间和计算机的工作。

此外,线程是“轻量级的”,因为线程可以交互而不需要进程间通信。在线程之间切换比在进程之间切换“更便宜”(同样,只是移动一些指针)。而且进程间通信需要比线程更昂贵的通信。

【讨论】:

    【解决方案2】:

    进程中的线程共享相同的虚拟内存空间,但每个线程都有一个单独的堆栈,如果实现的话,可能还有“线程本地存储”。它们是轻量级的,因为上下文切换只是切换堆栈指针和程序计数器并恢复其他寄存器的情况,而进程上下文切换也涉及切换 MMU 上下文.

    此外,进程内线程之间的通信轻量级,因为它们共享一个地址空间。

    【讨论】:

    • 如果你有一个多核系统需要在多线程的 L1 缓存之间同步数据,那么它就不是轻量级的——事实上,这绝不是轻量级的
    • @zebrabox:毫无疑问是真的。与以往一样,随着时间的推移,这些术语变得无关紧要。我的大部分工作都是在具有 RTOS 内核的单核嵌入式系统上进行的,因此很少发生这种复杂性 - 一切都是线程 - 即使受到 MMU 的保护(与我之前所说的相矛盾!)。
    • 是的,我知道你来自哪里。在单核机器上,这显然不是什么问题——尤其是如果您可以访问几个硬件线程:)
    【解决方案3】:

    线程“轻量级”的说法 - 取决于平台 - 不一定可靠。

    操作系统线程必须支持本地代码的执行,例如用 C 编写。所以它必须提供一个相当大的堆栈,通常以兆字节为单位。因此,如果您启动了 1000 个线程(可能是为了支持与服务器的 1000 个同时连接),那么在您开始执行任何实际工作之前,您的进程中就需要 1 GB 的内存。

    这在高度可扩展的服务器中是一个真正的问题,因此它们根本不使用线程,就好像它们是轻量级的一样。他们将它们视为重量级资源。相反,他们可能会在池中创建有限数量的线程,并让它们从队列中获取工作项。

    由于这意味着线程寿命长且数量少,因此使用进程可能会更好。这样您就可以获得地址空间隔离,并且不会出现资源耗尽的问题。

    总而言之:警惕代表线程提出的“营销”声明。并行处理很棒(越来越重要),但线程只是实现它的一种方式。

    【讨论】:

    • 我喜欢这个总结。我倾向于使用多个单线程进程,并且当多线程粉丝指责我未能利用简单的多核并行性因为他们不理解这个想法时,我讨厌多个进程。
    • 谢谢。进程有时比线程更好的原因有很多。令我惊讶的是,您可能会获得免费的性能提升!原因是不同的进程有不同的 C 内存堆。在线程安全的标准库中,所有malloc/free 调用都必须同步,这可能意味着大量的锁定,具体取决于您对内存的使用。我见过一个使用线程的应用程序在 4 个内核处停止,但是当切换到单独的进程时,它会扩展到 8 个(可能更多,没有更多的内核可以测试)。您共享的内存越少,您需要同步的内容就越少。
    • @earwicker - 确实如此。我不是通过多线程而是通过启动多个进程来并行化一个数据密集型任务,每个进程都作用于非依赖数据的子集。
    • 该术语称为“轻量级过程”,而不仅仅是“轻量级”。关键是线程在资源使用方面比进程更轻,而不是线程本身是“轻量级”的。我向您保证,在每个支持真正线程的平台上,线程将比进程使用更少的资源。每次,因为每个进程都需要至少一个线程。因此,1000 个线程将比 1000 个进程使用更少的资源。
    • 完全正确 - 这就是为什么我的回答很简单,即在所有情况下,两者都绝对比另一个更轻量级。这取决于。
    【解决方案4】:

    过程:

    1. 进程 ID
    2. 环境
    3. 文件夹
    4. 注册
    5. 堆栈
    6. 文件描述符
    7. 共享库
    8. 进程间通信工具(管道、信号量、队列、共享内存等)
    9. 特定操作系统来源

    线程:

    1. 堆栈
    2. 注册
    3. 属性(用于调度程序,如优先级、策略等)
    4. 特定线程数据
    5. 特定操作系统来源

    【讨论】:

      【解决方案5】:

      一个进程包含一个或多个线程,一个线程可以做任何一个进程可以做的事情。此外,进程内的线程共享相同的地址空间,因为线程之间的通信成本较低,因为它使用相同的代码段、数据段和操作系统资源,因此线程的所有这些特性使其成为“轻量级进程”。

      【讨论】:

        【解决方案6】:

        只是因为线程共享公共内存空间。分配给主线程的内存将由所有其他子线程共享。 而在Process的情况下,子进程需要分配单独的内存空间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-22
          • 2012-05-16
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          • 2018-12-27
          • 1970-01-01
          相关资源
          最近更新 更多