用户态和内核态

声明:本篇文章是我参考了他人文章的基础上增加了个人的一些想法,仅为我个人学习使用,并无抄袭之意。参考链接已在文章最后附上。

一、两者的概念:
1、用户态:内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
2、内核态:当程序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。

二、区别:
处于用户态执行的程序,进程所能访问的内存空间和对象收到限制,其所处于的cpu是可被抢占的;处于内核态的进程,可以访问所有的内存空间和对象,且所占有的cpu是不允许被抢占的。

三、为什么要区别:
用户态和内核态的区别就像电脑的普通用户和管理员,普通用户操作电脑时会限制一些操作,以防普通用户的误操作对电脑系统造成问题,因此,有些操作只有权限更高的用户才能操作。同样,处于用户态的进程如果能访问所有的内存空间、对象,执行所有的命令,那么用户态的进程可能会抢占操作系统的一些资源,导致操作系统不能正常运行,那么这会是非常严重的。区分了用户态和内核态后,就区分了用户态进程和内核态进程,也就区分了特权指令和非特权指令。

四、两者之间如何切换:
1、系统调用:这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用 申请 使用操作系统提供的服务程序完成工作,比如fork() 就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个终端来实现。
## 标题
中断:当外围设备完成用户请求后,会向CPU发出相应的中断信号,这时cpu会暂停下一条即将要执行的指令,转而去执行与中断信号对应的程序。那么这个过程就完成了用户态像内核态的切换。如,硬盘读写操作完成后,系统会切换到硬盘读写的中断处理程序中去执行后续操作。
## 标题
异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

参考文章:https://blog.csdn.net/ludan_xia/article/details/105695961

你可能感兴趣的:(java,内核)