随着学习的不断深入,用户态、内核态知识的缺失,也就暴露出来。不过好在,知道反省自己。于是今天将操作系统用户态、内核台研究透!

我们线程是程序运行的最小单位。我们Java进程使用线程操作的时候,本质还是底层原生操作系统级别的线程操作。比如Java调用阻塞、唤醒一个线程的时候,我们就需要在用户态、内核态之间切换线程的状态。

用户态、内核台都是CPU的状态,且有自己的专用内存空间

CPU从用户态切换内核态需要传递许多变量、参数给到内核。内核态会存储用户态的信息,当内核态在切换用户态的时候,才能使得用户态正常工作。

为什么区分用户态、内核态

操作系统需要限制不同程序之间的内存的访问能力,防止他们从别的程序获取内存数据。比如QQ使用了系统变量A,微信也用了这个变量,微信修改了A的值为B,QQ使用的时候,就会出现问题了。CPU就划分出两个权限等级:用户态、内核态

用户态

访问内存受限不允许访问外置设备无占用CPU的能力,也就是说用户态的线程会被别的程序占用。

内核态

访问内存所有数据。包括外置设备(硬盘、声卡、网卡),具备占用CPU的能力,也就是说能将自己从一个程序切换到另一个程序。

用户态、内核态的切换

我们的用户程序都是运行在用户态的。有些时候我们可能需要访问外置设备的内存数据,我们就需要从用户态切换到内核态了。

注意,既然用户态受限,我干脆直接使用内核态不就完了么?事实是,用户应用程序的内核态只能由用户态切换过来。

如何让触发用户态到内核态的切换?

1、系统调用

应用程序主动切换,比如:我们调用write文件,我们程序就会从用户态,切换到内核态对外置设备进行操作。

2、异常

我们代码出现了异常,就会触发内核的异常处理的相关程序

3、外围设备的中断(操作完毕)

我们都知道切换内核态的是为了访问外置设备,如果外置设备访问完毕,会向CPU发送中断信号。CPU识别后,就会从用户态切换到内核态去处理外置设备中断。

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤