进程,轻量级进程,内核线程,用户线程的区别关系
在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。
线程有自己的私有数据:程序计数器,栈空间以及寄存器。
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的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在usermode和kernel mode中切换。其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。
注:
1 LWP的术语是借自于SVR4/MP和Solaris 2.x。
2 有些系统将LWP称为虚拟处理器。
3 将之称为轻量级进程的原因可能是:在内核线程的支持下,LWP是独立的调度单元,就像普通的进程一样。所以LWP的最大特点还是每个LWP都有一个内核线程支持。
用户线程
LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。而这里的用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。
上图是最初的一个用户线程模型,从中可以看出,进程中包含线程,用户线程在用户空间中实现,内核并没有直接对用户线程进行调度,内核的调度对象和传统进程一样,还是进程本身,内核并不知道用户线程的存在。用户线程之间的调度由在用户空间实现的线程库实现。
这种模型对应着恐龙书中提到的多对一线程模型,其缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。
加强版的用户线程——用户线程+LWP
这种模型对应着恐龙书中多对多模型。用户线程库还是完全建立在用户空间中,因此用户线程的操作还是很廉价,因此可以建立任意多需要的用户线程。操作系统提供了LWP作为用户线程和内核线程之间的桥梁。LWP还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过LWP,因此进程中某个用户线程的阻塞不会影响整个进程的执行。用户线程库将建立的用户线程关联到LWP上,LWP与用户线程的数量不一定一致。当内核调度到某个LWP上时,此时与该LWP关联的用户线程就被执行。
小结:
很多文献中都认为轻量级进程就是线程,实际上这种说法并不完全正确,从前面的分析中可以看到,只有在用户线程完全由轻量级进程构成时,才可以说轻量级进程就是线程。
分享到:
相关推荐
本文主要讲解了Linux下的LWP(轻量级进程)、进程、线程、用户级线程、内核线程的概念、区别与联系、优缺点、发展等相关内容。本文来自于CSDN,由火龙果软件Linda编辑、推荐。再看正文之前我要先强调一下几点:1....
- 定义:轻量级进程是一种特殊的线程实现方式,由操作系统内核直接支持,旨在提高线程级别的并发性同时减少开销。 - 优点: - 更高效的线程调度和上下文切换。 - 直接由操作系统管理,无需复杂的用户空间调度。 ...
首先需要理解的是,在Linux系统中,线程被抽象为一种特殊的进程,称为轻量级进程(Lightweight Process, LWP)。这种机制与传统的线程模型不同,传统的模型中线程是系统级资源管理的基本单位,而Linux将线程视作和...
然而,这也带来了一些问题,比如当一个轻量级线程被阻塞(例如等待I/O操作完成)时,整个进程的其他线程也会被阻塞,因为它们都在同一个内核线程上运行。为了解决这个问题,轻量级线程包通常会限制异步I/O操作,避免...
总结来说,用户级线程更适合于轻量级的并发需求,而内核级线程则更适用于需要高效并发和资源管理的环境。有些操作系统支持混合模型,结合了用户级线程和内核级线程的优势,比如在一个进程中,一部分线程由内核管理,...
线程被设计成轻量级的进程,它们共享同一进程的资源,包括内存空间,使得线程间的通信更为高效。与进程相比,线程的创建和销毁开销较小,能够更快速地进行上下文切换,提高了系统的并发性能。 线程和进程的主要区别...
Linux内核最初并不支持线程的概念,直到2.4版本以后,通过将线程视为轻量级进程(Lightweight Process, LWP),从而实现了对内核级线程的支持。在Linux中,每个内核级线程都由一个task_struct结构表示,这个结构包含...
- **轻量级**:线程的创建和销毁成本远低于进程,这是因为线程共享同一进程的资源。 - **快速切换**:线程切换只需更新少量的寄存器信息,无需保存和恢复复杂的进程上下文。 - **高并发性**:同一进程中多个线程可以...
在哈工大的这个实验中,作者选择了不采用轻量级线程,而是模仿Windows和Solaris的操作系统风格。这意味着实验可能涉及更复杂的数据结构和更底层的系统调用,例如`kernel_thread()`函数的使用,以及与硬件交互的细节...
Quasar是一款针对Java虚拟机(JVM)设计的开源库,它引入了轻量级线程,也称为纤程(fibers),以及一种名为“角色”的并发模型。这个技术主要解决的是Java在处理高并发场景时,由于操作系统线程创建和销毁的开销大...
5. **线程与轻量级进程**:在某些系统中,如Linux,线程是进程内的执行流,共享同一内存空间。驱动也可能需要创建线程而不是完整的进程,这通常比创建新进程更高效。线程的创建通常通过`pthread_create()`等函数完成...
Linux 线程机制可以分为用户级线程、轻量级进程和内核线程三个方面。用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,不需要特定的内核支持。在这里,操作系统往往会提供一...
2. **联系**:线程是轻量级进程,是进程内的执行流;同一进程内的线程可以共享资源,方便协作;多线程可以提高程序并发性能。 **四、线程与进程的选择** 根据应用场景选择使用进程还是线程。如果需要独立的资源和...
内核线程,在有的系统上称为LWP(Light Weight Process,轻量级线程),运行在内核空间,由内核调度;用户线程运行在用户空间,由线程库来调度。当进程的一个内核线程获得CPU的使用权时,它就加载并运行一个用户线程。...
Linux下的线程实际上是通过轻量级进程(LWP)来实现的,多个线程可以共享进程的地址空间和文件描述符等资源。多线程编程中常用的API包括pthread_create、pthread_join等函数。此外,线程之间需要进行同步和互斥控制...
轻量级进程是内核支持的用户线程,每个轻量级线程与一个内核线程关联。内核线程则允许跨进程的线程调度,更好地利用多处理器系统。 多线程编程涉及到的关键点包括: 1. **线程创建**:通常使用`pthread_create()`...
协程是用户态的轻量级线程,可以在用户态下实现线程的调度和切换,避免了内核态的切换开销。 四、进程、线程、协程之间的关系 进程、线程、协程都是操作系统中重要的组成部分,它们之间存在着紧密的联系。进程是一...