C 为什么线程被称为轻量级进程?

C 为什么线程被称为轻量级进程?,c,multithreading,pthreads,C,Multithreading,Pthreads,线程是“轻量级”的,因为大部分开销已经通过创建其进程来完成 我在其中一个教程中找到了这个 有人能详细说明它的确切含义吗?进程创建是“昂贵的”,因为它必须使用自己的地址空间为进程设置一个全新的虚拟内存空间。“昂贵”意味着需要大量的CPU时间 线程不需要这样做,只需改变一些指针,所以这比创建一个进程要“便宜”得多。线程不需要这样做的原因是它们在父进程的地址空间和虚拟内存中运行 每个进程必须至少有一个线程。所以如果你仔细想想,创建一个进程意味着创建一个进程和一个线程。显然,只创建一个线程将花费更少的时

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

我在其中一个教程中找到了这个

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

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

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

每个进程必须至少有一个线程。所以如果你仔细想想,创建一个进程意味着创建一个进程和一个线程。显然,只创建一个线程将花费更少的时间和计算机的工作量


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

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


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

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

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

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

因为这意味着线程寿命长且数量少,所以最好改用进程。这样,您就可以实现地址空间隔离,并且不会出现资源耗尽的问题

总而言之:对代表threads提出的“营销”主张要谨慎。并行处理很好(越来越重要),但线程只是实现它的一种方式。

进程:

  • 进程id
  • 环境
  • 文件夹
  • 登记册
  • 堆叠
  • 文件描述符
  • 共享库
  • 进程间通信工具(管道、信号量、队列、共享内存等)
  • 特定操作系统源
  • 线程:

  • 堆叠
  • 登记册
  • 属性(用于调度程序,如优先级、策略等)
  • 特定线程数据
  • 特定操作系统源

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

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

    继续“创建进程”还有你的操作系统,你会看到创建一个进程的开销有多大。@不退款不退款:你会发现OSs之间的差异很大。@不退款不退款-多核机器上线程之间缓存同步的开销是多少,或者上下文切换和保存堆栈状态和寄存器集的开销是多少?I我喜欢这个总结。我倾向于使用多个单线程进程,我讨厌多线程fan boyers指责我没有利用简单的多核并行,因为他们不喜欢多进程。谢谢。进程有时比线程更好的原因有很多。让我吃惊的是,你可能会得到免费的性能提升!原因是不同的进程有不同的C内存堆。在线程安全的标准库中,所有的
    malloc
    /
    free
    调用都必须同步,这可能意味着大量锁定,具体取决于内存的使用情况。我见过一个使用线程的应用程序停在4个内核上,但当切换到单独的进程时,它将扩展到8个(可能更多,没有更多的内核可供测试)。共享的内存越少,需要同步的内存就越少。@earwicker-确实如此。我不是通过多线程而是通过启动多个进程(每个进程作用于非依赖数据的子集)来并行化一个数据密集型任务。这个术语被称为“轻量级进程”,而不仅仅是“轻量级进程”。关键是线程的资源使用量比进程轻,而不是线程本身的“重量轻”。我向您保证,在每个支持真正线程的平台上,线程使用的资源将少于进程。每次,因为每个进程至少需要一个线程。因此,1000个线程将比1000个进程使用更少的资源。确切地说,这就是为什么我的答案是,在所有情况下,两者都绝对比另一个更轻