前言
用户空间
用户空间指的是操作系统中分配给用户程序运行的独立内存空间。在用户空间中,用户程序可以进行自己的运算、调用操作系统提供的服务、使用设备等操作,而不会直接影响到操作系统或其他用户程序的运行。相对于用户空间,内核空间是操作系统核心部分运行的内存空间,包含了操作系统的各种服务和驱动程序。为了保证操作系统的安全和稳定,用户程序通常只能在用户空间中运行,并且需要通过系统调用等方式与内核空间进行交互。
内核空间
内核空间是操作系统中的一块特殊的内存空间,用于运行操作系统核心部分和驱动程序等重要的系统服务。与用户空间不同,内核空间拥有更高的权限和更广泛的操作权限,可以直接访问系统硬件资源和其他进程的内存空间,并能够进行特权指令的执行。因此,内核空间的安全和稳定对于整个操作系统的运行至关重要。通常情况下,用户程序无法直接访问内核空间,需要通过系统调用等方式向内核发起请求,由内核代表用户程序进行相应的操作。
通俗一点说:内核空间是操作系统中的一块特殊的内存区域,可以理解为是操作系统的"后花园"。在这个区域中,操作系统可以进行一些特殊的操作,比如控制硬件设备,管理内存,处理进程等。 用户程序只能在另外一块内存区域中运行,也就是所谓的"前花园"。用户程序如果需要进行一些需要特殊权限的操作,例如访问硬件设备或者申请更多的内存,就需要通过操作系统提供的接口请求内核空间的帮助。
传统I/O
传统的I/O方式是通过read()和write()两个系统调用来完成的,具体步骤如下:
- 用户进程发起读数据请求,调用read方法,向操作系统请求读取数据,用户进程阻塞
- 操作系统收到读数据请求后,将该I/O操作发送给DMA控制器,由DMA控制器负责数据的读取,CPU可继续执行其他操作
- 当DMA中的缓冲区存储了足够的数据,DMA就会把数据发送到page cache中,这个过程不需要CPU的参与,而当page cache中有了足够的数据后,DMA控制器就会发一个中断给CPU
- CPU收到中断请求后,将数据从page cache拷贝到用户缓冲区中。
- 用户进程发起写数据请求,调用write方法,向操作系统请求写入数据
- 通过socket把数据写入到socket的缓冲区
- socket缓冲区中的数据落入网卡
- 系统调用返回
传统I/O方式可见上图,在该过程中,发生了2次系统调用(read和write),进行了4次内核态和用户态的切换(步骤1,步骤3,步骤4,步骤6),发生了4次数据的复制(步骤2,步骤3,步骤4,步骤5)。每一次内核态和用户态的切换以及数据的拷贝复制都是非常消耗资源的,所以传统的I/O方式效率很低下。要想提高效率,只有减少内核态和用户态切换次数以及减少数据拷贝的次数。