本页目录
- 用户态、内核台都是CPU的状态,且有自己的专用内存空间
- 为什么区分用户态、内核态
- 用户态
- 内核态
- 用户态、内核态的切换
- 如何让触发用户态到内核态的切换?
随着学习的不断深入,用户态、内核态知识的缺失,也就暴露出来。不过好在,知道反省自己。于是今天将操作系统用户态、内核台研究透!
我们线程是程序运行的最小单位。我们Java进程使用线程操作的时候,本质还是底层原生操作系统级别的线程操作。比如Java调用阻塞、唤醒一个线程的时候,我们就需要在用户态、内核态之间切换线程的状态。
用户态、内核台都是CPU的状态,且有自己的专用内存空间
CPU从用户态切换内核态需要传递许多变量、参数给到内核。内核态会存储用户态的信息,当内核态在切换用户态的时候,才能使得用户态正常工作。
为什么区分用户态、内核态
操作系统需要限制不同程序之间的内存的访问能力,防止他们从别的程序获取内存数据。比如QQ使用了系统变量A,微信也用了这个变量,微信修改了A的值为B,QQ使用的时候,就会出现问题了。CPU就划分出两个权限等级:用户态、内核态
用户态
访问内存受限。不允许访问外置设备,无占用CPU的能力,也就是说用户态的线程会被别的程序占用。
内核态
访问内存所有数据。包括外置设备(硬盘、声卡、网卡),具备占用CPU的能力,也就是说能将自己从一个程序切换到另一个程序。
用户态、内核态的切换
我们的用户程序都是运行在用户态的。有些时候我们可能需要访问外置设备的内存数据,我们就需要从用户态切换到内核态了。
注意,既然用户态受限,我干脆直接使用内核态不就完了么?事实是,用户应用程序的内核态只能由用户态切换过来。
如何让触发用户态到内核态的切换?
1、系统调用
应用程序主动切换,比如:我们调用write文件,我们程序就会从用户态,切换到内核态对外置设备进行操作。
2、异常
我们代码出现了异常,就会触发内核的异常处理的相关程序
3、外围设备的中断(操作完毕)
我们都知道切换内核态的是为了访问外置设备,如果外置设备访问完毕,会向CPU发送中断信号。CPU识别后,就会从用户态切换到内核态去处理外置设备中断。