用户级线程和内核级线程的区别

本文探讨了用户级线程与内核级线程的区别,包括它们的实现方式、调度机制、资源占用情况及优缺点。并分析了不同场景下线程的选择依据。

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

转载于http://col1.blog.163.com/blog/static/1909775192012719114033352/

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)资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用


### 用户线程内核级线程的主要区别 用户线程内核级线程是操作系统中两种不同的线程实现方式,它们在管理、调度以及性能方面存在显著差异。 #### 主要区别 1. **位置与控制** - 用户线程完全由应用程序库管理,在用户空间运行,不依赖于操作系统的支持[^1]。 - 内核级线程则是在内核空间中创建并由操作系统直接管理调度[^2]。 2. **上下文切换开销** - 用户线程的上下文切换发生在用户态下,因此其开销较小,不需要涉及内核模式转换[^3]。 - 内核级线程由于需要进入内核进行调度,每次切换都会引发较高的系统调用成本[^4]。 3. **多处理器环境下的利用能力** - 单一进程内的多个用户线程无法被分配到不同CPU核心上执行;只有当这些线程映射至至少一个内核线程时才可能实现真正的并发处理[^5]。 - 多个内核线程可以轻松分布在各个可用的核心之上以达到高效并行计算的目的[^6]。 4. **阻塞行为的影响范围** - 如果某个用户线程发生I/O等待或其他形式的操作受阻,则整个进程中所有的其他用户线程也会随之暂停直到该事件完成为止[^7]。 - 对应地,如果某条内核线程陷入睡眠状态或者遭遇延迟情况,仅此单一实体受到影响而不会波及其他关联成员[^8]。 --- ### 各自优缺点分析 #### 用户线程的优点 - 更低的创建销毁代价:因为无需介入复杂的底层机制所以效率更高[^9]。 - 减少了因频繁穿越边界所造成的额外负担从而提升了整体吞吐量表现[^10]。 #### 用户线程的缺点 - 缺乏对硬件资源充分利用的能力——即不能跨多核同时作业[^11]。 - 当任意单一线程遇到长时间耗时任务(比如磁盘读写)就会拖累其余同伴共同停滞下来[^12]。 #### 内核级线程的优点 - 支持真正意义上的平行运作模型以便更好地发挥现代计算机架构优势[^13]。 - 提供更灵活可控的服务质量保障措施来应对各种突发状况的发生概率降低风险水平[^14]。 #### 内核级线程的缺点 - 较高的初始化费用加上持续维护过程中产生的固定支出使得总体经济性相对较差一些[^15]。 - 需求更多内存区域用于保存必要数据结构进而增加了物理存储器的压力程度[^16]。 ```c++ // 创建用户线程的一个简单例子 (伪代码) Thread* t = new Thread(); t->start(); // 创建内核级线程的例子 C++ POSIX API #include <pthread.h> void *thread_function(void *arg); pthread_t thread; int err = pthread_create(&thread, NULL, thread_function, NULL); if(err != 0){ printf("\n Can't create thread [%s]", strerror(err)); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值