『面试问答』:用户态和内核态的区别是什么?

面试官:请说一下,用户态和内核态的区别是什么?

在 CPU 的所有指令中,有些指令是非常危险的,比如清除内存、设置时钟等,如果错用,将导致系统崩溃,如果允许所有程序都可以使用这些指令,那么系统崩溃的概率将大大增加。所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。

比如 Intel 的 CPU 将特权等级分为 4 个级别:Ring0~Ring3。

对于Linux 系统,只使用了 Ring0 和 Ring3 两个运行级别。当进程运行在 Ring3 级别时被称为运行在用户状态,而运行在 Ring0 级别时被称为运行在内核态。

用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限。当应用程序需要执行某些需要特殊权限的操作,例如读写磁盘、网络通信等,就需要向操作系统发起系统调用请求,进入内核态。

内核态运行的进程拥有非常高的权限,能够执行更底层、更敏感的操作,几乎可以访问计算机的任何资源,包括系统的内存空间、设备、驱动程序等。当操作系统接收到进程的系统调用请求时,就会从用户态切换到内核态,执行相应的系统调用,并将结果返回给进程,最后再从内核态切换回用户态。

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

1 系统调用。系统调用是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用向操作系统申请资源完成工作,比如读取磁盘资源。系统调用的机制核心还是使用了操作系统为用户特别开放的一个中断来实现。

2 中断。当 C P U 在执行用户态的进程时,外围设备完成用户请求的操作后,会向 C P U 发出相应的中断信号,这时 C P U 会暂停执行下一条即将要执行的指令,转到与中断信号对应的处理程序去执行,也就是切换到了内核态。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。

3 异常。当 CPU 在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就转到了内核态,比如缺页异常。在系统的处理上,中断和异常类似,都是通过中断向量表来找到相应的处理程序进行处理。区别在于,中断来自处理器外部,不是由任何一条专门的指令造成,而异常是执行当前指令的结果。

#晒一晒我的offer##软件开发薪资爆料##我的实习求职记录##23届找工作求助阵地#
软件开发面试问答 文章被收录于专栏

分享软件开发岗位面试题及答案

全部评论

相关推荐

3 4 评论
分享
牛客网
牛客企业服务