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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

处理:

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

线:

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

进程中包含一个或多个线程,线程可以执行进程可以执行的任何操作。 进程中的线程也共享相同的地址空间,因为线程之间的通信成本较低,因为它使用相同的代码段,数据段和OS资源,因此线程的所有function使其成为“轻量级进程”。

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