2020-02-19 阻塞IO和非阻塞IO

unix系统下常见的五种IO模型

  1. 阻塞式
  2. 非阻塞式
  3. IO复用(select,poll)
  4. 信号驱动(SIGIO)
  5. 异步调用(POSIX的aio系列函数)

一个输入操作通常具有两个不同的阶段

  1. 等待数据准备好
  2. 从内核将数据复制到进程

对于一个网络套接字上的输入操作:
1)等待数据从网络中到达 。
2)将内核缓冲区的数据复制到进程中

五种IO模型简介

1. 阻塞式

2020-02-19 阻塞IO和非阻塞IO_第1张图片
阻塞式(截取UNIX网络编程卷1)

2. 非阻塞式

2020-02-19 阻塞IO和非阻塞IO_第2张图片
非阻塞式(截取UNIX网络编程卷1)

应用进程反复轮询内核,查看操作是否就绪,这样做往往消耗大量的cpu时间

3. 信号驱动

2020-02-19 阻塞IO和非阻塞IO_第3张图片
信号驱动(截取UNIX网络编程卷1)

4. 多路复用

2020-02-19 阻塞IO和非阻塞IO_第4张图片
多路复用(截取UNIX网络编程卷1)
  • 阻塞在select操作,监听一组文件描述符,当某个就绪的时候就通知用户,优势在于可以监听多个描述符
  • 多线程中也有类似的模型,不过不是使用select监听一组描述符,而是使用多个线程(一个描述符对应一个线程),这样每个线程都可以自由调用recvfrom之类的阻塞式IO操作了。

5. 异步

2020-02-19 阻塞IO和非阻塞IO_第5张图片
异步(截取UNIX网络编程卷1)

五种IO模型的对比

  • 阻塞与非阻塞的区别在于第二阶段,将数据从内核区域复制到用户空间的时候是否阻塞


    2020-02-19 阻塞IO和非阻塞IO_第6张图片
    五种IO模型的比较(截取UNIX网络编程卷1)

可见:前四种模型都是同步IO,因为真正的IO操作(recvfrom)将阻塞进程,只有最后一种才是异步IO

你可能感兴趣的:(2020-02-19 阻塞IO和非阻塞IO)