前言

传统I/O

传统的I/O方式是通过read()和write()两个系统调用来完成的,具体步骤如下:

  1. 用户进程发起读数据请求,调用read方法,向操作系统请求读取数据,用户进程阻塞
  2. 操作系统收到读数据请求后,将该I/O操作发送给DMA控制器,由DMA控制器负责数据的读取,CPU可继续执行其他操作
  3. 当DMA中的缓冲区存储了足够的数据,DMA就会把数据发送到page cache中,这个过程不需要CPU的参与,而当page cache中有了足够的数据后,DMA控制器就会发一个中断给CPU
  4. CPU收到中断请求后,将数据从page cache拷贝到用户缓冲区中。
  5. 用户进程发起写数据请求,调用write方法,向操作系统请求写入数据
  6. 通过socket把数据写入到socket的缓冲区
  7. socket缓冲区中的数据落入网卡
  8. 系统调用返回

传统IO方式.png 传统I/O方式可见上图,在该过程中,发生了2次系统调用,进行了4次内核态和用户态的切换,发生了4次数据的复制。每一次内核态和用户态的切换以及数据的拷贝复制都是非常消耗资源的,所以传统的I/O方式效率很低下。要想提高效率,只有减少内核态和用户态切换次数以及减少数据拷贝的次数