当前位置:   article > 正文

用户态与内核态_用户态线程和内核态线程的关系

用户态线程和内核态线程的关系

用户态与内核态

内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。

注:对操作系统来说,用户态线程具有不可见性,也称透明性。

  1. 用户态线程调度完全由进程负责,通常就是由进程的主线程负责(用户可以为应用程序定制调度算法),相当于进程主线程的延展,使用的是操作系统分配给进程主线程的时间片段;内核线程由内核维护,由操作系统调度。

  2. 用户态线程无法跨核心,一个进程的多个用户态线程不能并发,阻塞一个用户态线程会导致进程的主线程阻塞,直接交出执行权限。这些都是用户态线程的劣势。内核线程可以独立执行,操作系统会分配时间片段。

当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在3级特权级下时,就可以称之为运行在内核态。

虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。

当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。

为什么需要区分用户态和内核态

在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。

所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。

比如Intel的CPU将特权等级分为4个级别:Ring0~Ring3;Linux 系统只使用了Ring0和Ring3两个运行级别。

当进程运行在Ring3级别时被称为运行在用户态,而运行在 Ring0 级别时被称为运行在内核态。

用户态切换到内核态的3种方式

  1. 系统调用:这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
  2. 异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
  3. 外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

用户线程与内核线程的映射关系

用户线程一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Light Weight Process,LWP)。因此对于用户线程来说,用户程序必须让它的调度器采用用户线程,然后在内核线程上运行它。

用户线程与内核线程的映射关系有三种模型:一对一模型、多对一模型、多对多模型。

参考链接:

一文理解JVM线程属于用户态还是内核态 - 开发者头条

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/793833
推荐阅读
相关标签
  

闽ICP备14008679号