关于进程、线程和轻量级进程,线程模型

本文深入探讨了进程与线程的概念,解释了多线程为何成为解决并发处理任务的关键技术。它阐述了单线程进程的限制,详细对比了线程、内核线程、轻量级进程和用户线程的特点,以及它们在多线程支持程序中的优缺点。同时,文章还介绍了不同类型的线程模型及其在操作系统中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文出自:http://blog.chinaunix.net/uid-23860671-id-256578.html


线程模型:

线程 : 进程

n : 1 ,多个线程对应一个核心线程(进程)

1:1, 一个线程对应一个进程

m :n : 结合上面两种方式,如某些进程一一对应核内线程,其他线程完全在用户态实现

在现代OS中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。

线程有自己的私有数据:程序计数器,栈空间以及寄存器。

Why Thread?(传统单线程进程的缺点)

1,现实中有很多需要并发处理的任务,如数据库的服务器端、网络服务器、大容量计算等。

2. 传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发;既在一个时刻只能运行在一个处理器上,因此不能充分利用多处理器框架的计算机。

3. 如果采用多进程的方法,则有如下问题:
a. fork一个子进程的消耗是很大的,fork是一个昂贵的系统调用,即使使用现代的写时复制(copy-on-write)技术。
b.各个进程拥有自己独立的地址空间,进程间的协作需要复杂的IPC技术,如消息传递和共享内存等。

多线程的优缺点

多线程的优点和缺点实际上是对立统一的。

支持多线程的程序(进程)可以取得真正的并行(parallelism),且由于共享进程的代码和全局数据,故线程间的通信是方便的。它的缺点也是由于线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多个线程要访问的数据需要一些同步技术。

三种线程——内核线程、轻量级进程、用户线程

内核线程

内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。

轻量级进程[*]

轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。这种模型实际上就是恐龙书上所提到的一对一线程模型。在这种实现的操作系统中,LWP就是用户线程。

由于每个LWP都与一个特定的内核线程关联,因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。

轻量级进程具有局限性。首先,大多数LWP的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在user mode和kernel mode中切换。其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。

LWP.JPG

注: 1: 1模型

    LWP的术语是借自于SVR4/MP和Solaris 2.x。有些系统将LWP称为虚拟处理器。将之称为轻量级进程的原因可能是:在内核线程的支持下,LWP是独立的调度单元,就像普通的进程一样。所以LWP的最大特点还是每个LWP都有一个内核线程支持。

 

用户线程

LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。而这里的用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。

Uthread1.JPG

上图(N:1模型)是最初的一个用户线程模型,从中可以看出,进程中包含线程,用户线程在用户空间中实现,内核并没有直接对用户线程进程调度,内核的调度对象和传统进程一样,还是进程本身,内核并不知道用户线程的存在。用户线程之间的调度由在用户空间实现的线程库实现。

这种模型对应着恐龙书中提到的多对一线程模型,其缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。

加强版的用户线程——用户线程+LWP

这种模型对应着恐龙书中多对多模型。用户线程库还是完全建立在用户空间中,因此用户线程的操作还是很廉价,因此可以建立任意多需要的用户线程。操作系统提供了LWP作为用户线程和内核线程之间的桥梁。LWP还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过LWP,因此进程中某个用户线程的阻塞不会影响整个进程的执行。用户线程库将建立的用户线程关联到LWP上,LWP与用户线程的数量不一定一致。当内核调度到某个LWP上时,此时与该LWP关联的用户线程就被执行。
Uthread2.JPG

小结:

很多文献中都认为轻量级进程就是线程,实际上这种说法并不完全正确,从前面的分析中可以看到,只有在用户线程完全由轻量级进程构成时,才可以说轻量级进程就是线程。

<think>嗯,用户问的是轻量级进程线程的关系及区别。首先,我需要回顾一下操作系统的基本概念,尤其是进程线程的区别。根据引用[2],线程被设计成进程的一个执行路径,共享进程资源,调度成本比进程低。而轻量级进程(LWP)可能线程有关联,但具体是怎样的呢? 引用[3]提到,Linux中的线程实际上是通过轻量级进程实现的,每个线程对应一个LWP。这说明在Linux系统里,线程LWP可能是一一对应的关系。而引用[4]则区分了用户线程内核线程轻量级进程,指出LWP是内核线程的用户态抽象,充当用户线程内核线程之间的桥梁。 所以,可能需要整理以下几点:首先,轻量级进程是什么,它内核线程的关系;其次,用户线程轻量级进程的联系;然后,在Linux中线程的具体实现方式。还要比较它们的资源开销、调度方式以及管理层面的区别。 用户可能混淆了线程轻量级进程,尤其是在不同操作系统中的实现差异。需要明确在Linux下,线程作为LWP存在,而其他系统可能有不同实现。同时,要指出LWP相比普通进程轻量,但相比用户线程可能仍有更多开销。此外,用户可能想知道为什么需要LWP,这涉及到用户线程内核线程之间的映射模型,比如一对一模型中使用LWP作为中介。 需要确保回答覆盖定义、关系、区别,以及具体在Linux中的情况。还要考虑用户可能的后续问题,比如如何选择使用线程还是LWP,或者性能上的考量。最后,生成的相关问题要引导用户深入理解,比如实现机制、优缺点比较应用场景。</think>### 轻量级进程(LWP)与线程的关系及区别 #### 1. **定义与本质** - **轻量级进程(LWP)** 轻量级进程内核支持的用户态线程抽象,由内核直接调度,拥有独立的进程标识符(PID),但与其他LWP共享进程资源(如内存、文件描述符)[^3][^4]。 例如,在Linux中,线程的实现基于LWP,每个线程对应一个LWP,并通过`clone()`系统调用创建,共享地址空间[^3]。 - **线程** 线程进程内的执行单元,共享进程的所有资源(如堆、全局变量),仅保留独立的栈寄存器状态。线程可分为: - **用户线程**:完全由用户态库(如pthread)管理,内核不可见。 - **内核线程**:由内核直接调度,与LWP一一绑定[^4]。 #### 2. **关系** - **LWP是线程内核之间的桥梁** 在Linux中,用户线程通过LWP与内核线程关联,形成“一对一模型”(1个用户线程绑定1个LWP,再绑定1个内核线程)[^4]。 例如,调用`pthread_create()`创建线程时,实际会生成一个LWP[^3]。 - **LWP实现多线程并行** 多个LWP共享同一进程资源,但可被独立调度到不同CPU核心,实现真正的并行[^3]。 #### 3. **核心区别** | **维度** | **轻量级进程(LWP)** | **线程** | |----------------|-----------------------------------|----------------------------------| | **资源开销** | 介于进程线程之间,需内核维护PID | 更轻量,仅需独立栈寄存器(用户线程无需内核介入)[^2] | | **调度主体** | 由内核调度 | 用户线程由用户调度,内核线程内核调度[^4] | | **可见性** | 内核可见,占用PID资源 | 用户线程内核透明,内核线程可见[^3] | | **独立性** | 可独立运行在不同CPU核心 | 用户线程无法跨核心,依赖进程调度[^4] | #### 4. **Linux中的特殊设计** Linux未严格区分进程线程,而是统一抽象为“任务”(task)。线程通过LWP实现,其特点包括: - **共享地址空间**:所有LWP共享同一进程的页表,虚拟地址映射相同物理内存[^3]。 - **独立调度单元**:每个LWP在内核中为一个`task_struct`,但标记为共享资源。 - **系统调用影响**:若一个LWP调用阻塞式系统调用(如`read()`),其他LWP仍可运行[^4]。 #### 5. **应用场景** - **LWP适用场景** 需内核级并行(如CPU密集型任务),且需细粒度控制线程调度(如实时系统)。 - **用户线程适用场景** 高并发I/O密集型任务,需避免内核切换开销(如协程)[^4]。 --- ### 相关问题 1. 为什么Linux选择用轻量级进程实现线程? 2. 用户线程内核线程的映射模型有哪些?各有什么优缺点? 3. 轻量级进程与普通进程在资源管理上有何不同? 4. 在多线程编程中,如何避免因LWP过多导致的性能问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值