用户态、内核态

| 背景

  java的线程是映射到操作系统原生线程之上的

  阻塞或唤醒一个线程需要操作系统介入,需在用户态与内核态之间切换,会消耗大量的系统资源

因为用户态与内核态都有各自专用的内存空间,专用的寄存器等

——> 用户态切换至内核态需传递给许多变量、参数给内核,内核也需保护好用户态在切换时 的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。

| 概念

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级:用户态 和 内核态

内核态

CPU可访问内存所有数据, 包括外围设备, 例硬盘、网卡, 也能将自己从一个程序切换到另一个程序

内核态

受限的访问内存, 不允许访问外围设备;占用CPU的能力被剥夺, CPU资源可以被其他程序获取

| 用户态与内核态的切换

用户程序都是运行在用户态的, 但如果从硬盘读取数据, 或从键盘获取输入等,这些内核态的行为则需操作系统来做 (比如java的I/O操作底层都是通过native方法来调用操作系统)

用户态切换到内核态, 但不能控制在内核态中执行的指令。这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

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

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

系统调用

是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,

比如print()实际上就是执行了一个输出的系统调用。

而系统调用的机制其核心是使用操作系统为用户特别开放的一个中断来实现

——> 例如Linux的int 80h中断。

异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态

比如缺页异常

外围设备的中断

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到 内核态的切换。

比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值