为什么线程被称为轻量级进程?
为什么线程被称为轻量级进程?
在操作系统中,创建进程是一项"昂贵"的任务,因为它需要为进程设置一个完整的新虚拟内存空间,拥有自己的地址空间。"昂贵"意味着需要大量的CPU时间。
而线程则不需要这样做,只需要改变一些指针的指向,因此它比创建进程要"廉价"得多。线程之所以不需要这样做,是因为它们在父进程的地址空间和虚拟内存中运行。
每个进程都必须至少有一个线程。因此,如果你仔细思考一下,创建一个进程意味着创建进程和创建一个线程。很显然,只创建一个线程将会花费更少的时间和计算机的工作量。
此外,线程之所以被称为"轻量级",是因为线程可以在不需要进程间通信的情况下进行交互。在线程之间进行切换比在进程之间进行切换更"廉价"(再次,只需要移动一些指针)。而进程间通信需要比线程更昂贵的通信方式。
因此,由于线程不需要创建新的虚拟内存空间和进行进程间通信,它们被称为轻量级进程。这样的设计使得线程比进程更高效,更适合并发执行任务。
为什么线程被称为轻量级进程?
线程被称为轻量级进程的原因是因为相比于进程,线程在资源使用上更加轻量级。在某些情况下,线程的轻量级性质可能并不可靠,这取决于所使用的平台。操作系统线程需要支持执行本地代码,比如用C语言编写的代码。因此,它需要提供一个相当大的堆栈空间,通常以兆字节计算。如果你启动了1000个线程(可能是为了支持服务器上的1000个同时连接),那么在实际工作之前,你的进程会需要1GB的内存。这在高度可扩展的服务器中是一个真正的问题,因此它们不会将线程视为轻量级资源。它们将线程视为重量级资源。它们可能会创建一个有限数量的线程池,并让它们从一个队列中获取工作项。
因为线程的寿命长且数量少,所以使用进程可能会更好。这样就可以获得地址空间隔离,而且不会出现资源耗尽的问题。
总结一下:对于线程的“营销”宣传要保持警惕。并行处理非常好(越来越重要),但线程只是实现并行处理的一种方式。
有很多原因说明为什么进程有时比线程更好。一个令我惊讶的原因是,使用进程可能会带来免费的性能提升!原因是独立的进程拥有独立的C内存堆。在线程安全的标准库中,所有的malloc/free调用都必须进行同步,这可能意味着大量的锁定,这取决于内存的使用情况。我曾经见过一个使用线程的应用在4个核心上停滞不前,但当切换到独立的进程时,它可以扩展到8个核心(可能还可以更多,因为没有更多的核心进行测试)。你所分享的内存越少,你就需要同步的次数就越少。
确实,我通过启动多个进程来并行处理一个非常数据密集型的任务,而不是使用多线程。每个进程都处理一个独立的非依赖数据子集。
术语被称为“轻量级进程”,而不仅仅是“轻量级”。关键在于线程在资源使用上比进程更轻量级,而不是线程本身的“轻量级”。我保证,在支持真正线程的每个平台上,线程使用的资源都比进程少。每次都是这样,因为每个进程至少需要一个线程。因此,1000个线程使用的资源会比1000个进程少。
没错,N个线程使用的内存和资源都会比N个进程少,但是还有其他类型的资源,比如墙(实际)时间。一个多进程设计可能会花费更少的时间等待锁来使用C堆,因此可能会运行得更快。
也许,但是进程之间的进程间通信也会消耗更多的资源。这完全取决于要解决的问题。
确实如此,这就是为什么我的答案是在所有情况下都没有绝对更轻量级的答案。这取决于具体的问题。
为什么线程被称为轻量级进程?
线程在一个进程内共享相同的虚拟内存空间,但每个线程都有自己的堆栈,以及可能的“线程本地存储”(如果被实现)。它们被称为“轻量级”是因为上下文切换只涉及切换堆栈指针和程序计数器以及恢复其他寄存器,而进程的上下文切换还涉及切换MMU上下文。
此外,进程内的线程之间的通信也是“轻量级”的,因为它们共享一个地址空间。
如果在多核系统中需要在多个线程的L1缓存之间同步数据,那么它就不是轻量级的,实际上相反,这是相当重量级的。
毫无疑问,随着时间的推移,这些术语变得不再相关。我大部分的工作都是在单核嵌入式系统上进行的,使用实时操作系统内核,所以很少遇到这样的复杂情况 - 即使在受MMU保护的情况下,一切都是一个线程(这与我之前说的相矛盾!)。
是的,我知道你在说什么。在单核机器上,这显然不是一个大问题 - 尤其是如果你可以访问几个硬件线程:)