当进程运行在内核空间时,它就处于内核态;当进程运行在用户空间时,它就处于用户态
内核态 & 用户态【OS】
参考链接
现代计算机是由硬件、操作系统组成,操作系统通过内核与硬件交互
当需要 进行IO操作 时,如读写硬盘文件、读写网卡数据等,进程需要 切换到内核态,否则无法进行这样的操作
无论是从内核态切换到用户态,还是从用户态切换到内核态,都需要进行一次 上下文的切换
一般情况下,应用不能直接 操作 内核空间的数据,需要把内核态的数据拷贝到用户空间才能操作
内核态
- 内核提供进程管理、内存管理、网络等底层功能,封装了与硬件交互的接口,通过系统调用提供给上层应用使用
- 内核是一种特殊的软件程序:控制计算机的硬件资源
- 例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行
用户态
- 提供应用程序运行的空间,为了使应用程序访问到内核管理的资源 例如CPU,内存,I/O
内核空间 & 用户空间【内存】
参考链接
- 为了确保操作系统的安全稳定运行,操作系统启动后,将会开启保护模式:将内存分为内核空间(内核对应进程所在内存空间)和用户空间,进行内存隔离
- 构建的 程序将运行在用户空间,用户空间无法操作内核空间,也就意味着用户空间的程序不能直接访问由内核管理的I/O,比如:硬盘、网卡等
- 操作系统向外提供API,其由各种类型的 系统调用 (System Call)组成,以提供安全的访问控制
- 应用程序要想访问内核管理的I/O,必须通过调用内核提供的系统调用(system call)进行间接访问
I/O之于应用程序来说,强调的通过向内核发起系统调用完成对I/O的间接访问。换句话说应用程序发起的一次IO操作实际包含两个阶段:
IO调用阶段:应用程序进程向内核发起系统调用
IO执行阶段:内核执行IO操作并返回
- 准备数据阶段:内核等待I/O设备准备好数据
- 拷贝数据阶段:将数据从内核缓冲区拷贝到用户空间缓冲区
sum
由于CPU某些指令比较危险,如果错用会导致系统崩溃,为了保护系统,操作系统将内存空间划分为了两部分:
- 用户空间:正常用户进程运行的一组位置(即除内核之外的所有内容)
- 在用户空间下运行的进程 只能访问内存的有限部分
- 用户空间进程 只能通过内核公开的接口(系统调用)访问内核的一小部分
- 内核空间:存储内核代码并在其下执行的位置
- 内核可以 访问所有内存
- 作用:管理用户空间 中运行的应用程序,避免彼此和机器混乱
IO示例
假如有一个网络请求想访问服务器上的某个静态文件,具体IO流程:
整个过程如下:
进程发起一个系统调用sys_read,读取磁盘的文件;
DMA将磁盘文件数据拷贝到内核空间的read缓冲区;
CPU把内核空间read缓冲区数据拷贝到用户空间的缓冲区;
进程发起一个系统调用socket_write,向网卡写数据;
CPU把用户空间缓冲区的数据拷贝到内核空间的socket缓冲区;
最后DMA把内核空间的socket缓冲区数据拷贝到网卡;