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

时间:2010-02-15 16:59:17

标签: c multithreading pthreads

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

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

有人可以详细说明它究竟意味着什么吗?

6 个答案:

答案 0 :(得分:26)

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

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

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

因为这意味着线程寿命长且数量少,所以使用进程可能更好。这样你就可以获得地址空间隔离,而且资源耗尽并不存在问题。

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

答案 1 :(得分:17)

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

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

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

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

答案 2 :(得分:9)

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

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

答案 3 :(得分:2)

过程:

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

    1. stack
    2. 寄存器
    3. 属性(对于sheduler,如优先级,策略等)
    4. 特定线程数据
    5. 特定的操作系统来源

答案 4 :(得分:0)

进程中包含一个或多个线程,线程可以执行进程可以执行的任何操作。进程中的线程也共享相同的地址空间,因为线程之间的通信成本很低,因为它使用相同的代码段,数据段和OS资源,所以这些线程的所有功能使它成为一个轻量级的进程和#34 ;.

答案 5 :(得分:0)

仅由于线程共享公共内存空间。分配给主线程的内存将由所有其他子线程共享。   而对于Process,子进程需要分配单独的内存空间。