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

本文详细介绍了内核线程、轻量级进程(LWP)和用户线程三种线程类型的特性与区别,包括它们的实现机制、优缺点以及应用场景。

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

内核线程

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

轻量级进程[*]

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

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

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

LWP.JPG

注:

1.   LWP的术语是借自于SVR4/MP和Solaris 2.x。

2.   有些系统将LWP称为虚拟处理器。

3.   将之称为轻量级进程的原因可能是:在内核线程的支持下,LWP是独立的调度单元,就像普通的进程一样。所以LWP的最大特点还是每个LWP都有一个内核线程支持。

 

用户线程

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

Uthread1.JPG

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

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

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

Uthread2.JPG

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

1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用smp,即利用多核cpu。windows线程就是这样的。

 2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的。

线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread),后者又称为内核支持的线程或轻量级进程。在多线程操作系统中,各个系统的实现方式并不相同,在有的系统中实现了用户级线程,有的系统中实现了内核级线程。

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。

内核线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows NT和2000/XP支持内核线程。

用户线程运行在一个中间系统上面。目前中间系统实现的方式有两种,即运行时系统(Runtime System)和内核控制线程。“运行时系统”实质上是用于管理和控制线程的函数集合,包括创建、撤销、线程的同步和通信的函数以及调度的函数。这些函数都驻留在用户空间作为用户线程和内核之间的接口。用户线程不能使用系统调用,而是当线程需要系统资源时,将请求传送给运行时,由后者通过相应的系统调用来获取系统资源。内核控制线程:系统在分给进程几个轻型进程(LWP),LWP可以通过系统调用来获得内核提供的服务,而进程中的用户线程可通过复用来关联到LWP,从而得到内核的服务。

以下是用户级线程和内核级线程的区别:

(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。

(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。

(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。

(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。

(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

内核线程的优点:

(1)当有多个处理机时,一个进程的多个线程可以同时执行。

缺点:

(1)由内核进行调度。

用户进程的优点:

(1) 线程的调度不需要内核直接参与,控制简单。

(2) 可以在不支持线程的操作系统中实现。

(3) 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多。

(4) 允许每个进程定制自己的调度算法,线程管理比较灵活。

(5) 线程能够利用的表空间和堆栈空间比内核级线程多。

(6) 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题。

缺点:

(1)资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用

 

http://www.cnitblog.com/tarius.wu/articles/2277.html

<think>我们正在讨论进程内核线程的异同,以及内核线程轻量级进程(LWP)的关系。用户特别询问了“内核线程是否为轻量级进程”以及“内核进程的定义”。根据引用内容,我们需要整理几个关键点: 1. 引用[1]指出:轻量级进程(LWP)是建立在内核线程之上的用户线程,每个LWP与一个特定的内核线程关联。 2. 引用[2]说明:内核线程内核的分身,由内核管理,使用资源少(仅内核栈和寄存器保存空间)。 3. 引用[3]和[4]补充:轻量级进程(LWP)是内核支持的执行单元,与用户线程绑定,共享进程资源,每个LWP对应一个内核线程。 因此,我们需要明确: - 内核线程(Kernel Thread):由内核直接创建和管理的执行实体,运行在内核态,没有用户空间上下文。 - 轻量级进程(LWP):在用户空间可见,与一个内核线程关联,是用户线程内核的表示(如Linux的pthread实现)。 所以,内核线程轻量级进程不是同一个概念,但存在关联:每个LWP绑定一个内核线程,通过这个内核线程被调度。 关于“内核进程”的定义:在Linux中,通常没有严格意义上的“内核进程”术语。我们所说的“内核线程”就是运行在内核空间、没有用户地址空间的特殊进程(在进程列表中用方括号标注,如[kthreadd])。内核线程内核自身启动(如通过kthread_create()),用于执行内核后台任务。 总结回答结构: 1. 明确内核线程轻量级进程的关系(是否等同?) 2. 解释内核进程(即内核线程)的定义和特点 3. 结合引用内容说明Linux中的实际实现(如/proc/{pid}/task目录) 最后生成相关问题。 </think>### 内核线程轻量级进程的关系及内核进程定义 #### 一、内核线程轻量级进程的关系 1. **内核线程轻量级进程** 内核线程是**纯内核实体**(如 `kswapd`),完全运行在内核态,无用户空间映射[^2][^4]。轻量级进程(LWP)是**用户级线程内核映射**,通过 `clone()` 系统调用创建,每个 LWP 绑定一个内核线程作为调度载体[^1][^3]。 2. **关联机制** $$ \text{用户线程} \xrightarrow{\text{绑定}} \text{LWP} \xrightarrow{\text{1:1映射}} \text{内核线程} $$ 例如 Linux 的 pthread 库创建用户线程时,内核会生成对应的 LWP 及其绑定的内核线程[^3]。 3. **关键差异** | 特性 | 内核线程 | 轻量级进程 (LWP) | |--------------|--------------------------|-------------------------------| | **创建者** | 内核 (kthread_create) | 用户进程 (clone syscall) | | **地址空间** | 仅内核空间 | 共享宿主进程的用户空间[^1] | | **资源开销** | 极小(内核栈+寄存器)[^2] | 较大(需复制部分进程上下文) | | **可见性** | `ps` 显示为 `[kthreadd]` | `ps -eLf` 显示为线程[^4] | --- #### 二、内核进程的定义 1. **本质是内核线程** Linux 中**不存在独立的内核进程概念**,所谓“内核进程”即内核线程: - 由内核通过 `kthreadd` 守护进程创建 - 无用户空间(`task_struct->mm = NULL`) - 命名以方括号标识(如 `[rcu_gp]`)[^2][^4] 2. **核心特征** - **单线程性**:每个内核线程是独立的调度单元,不共享内核栈[^2] - **特权执行**:仅运行在内核态,直接访问硬件资源 - **全局可见**:可通过 `/proc/<pid>/task` 查看所有内核线程[^4] 3. **创建过程示例** ```c // 内核创建 kworker 线程 struct task_struct *kthread = kthread_create(worker_func, NULL, "kworker/%d", cpu); wake_up_process(kthread); // 加入调度队列 ``` --- #### 三、三者的关系模型 ```plaintext 用户进程 ├─ 用户线程1 → LWP1 → 内核线程A [调度单位] ├─ 用户线程2 → LWP2 → 内核线程B └─ ... 独立内核线程 → [kthreadd], [kswapd]... [无用户空间关联] ``` - **轻量级进程 (LWP)**:用户线程内核的代理 - **内核线程**:LWP 的底层载体 or 独立内核任务 - **内核进程**:实际指独立内核线程[^4] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值