一、什么是用户态与内核态:
为什么要有用户态和内核态?
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 – 用户态和内核态。
内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
也即,用户态与内核态是对CPU使用的权限划分。目的是防止普通程序错误或者恶意的操作CPU与外设。 像我们写的代码,进行一般的运算就是运行在用户态,当需要进行磁盘读写、网络传输时,会调用内核提供的API,进而进入内核态。
二、什么时候会发生用户态与内核态的转换
- 用户程序主动请求调用系统函数时,即当我们代码要读一个文件时,会从当前的用户态转换到内核态;
- 用户程序发生系统异常时,比如用户程序申请内存,把内存占满了,此时会有用户态到内核态,去处理对应的异常程序;
- 外设中断,当外设处理完任务时,会发生中断,此时会从内核态转换到用户态。比如,文件读到内存完毕后,会返回用户程序,进行后面的处理。