阻塞和非阻塞, 异步和同步IO, IO复用

img

一个IO包括两个阶段:

  1. 所以, 阻塞IO是内核在自己缓存区发现没有数据, 然后尝试去设备上读取数据.这个过程是很慢的, 而且还有可能呢个没有数据, 所以就一直阻塞.

  2. 非阻塞IO是指内核发现缓存区没有数据, 那就立刻返回.然后自己去后台IO设备读取, 如果有数据就复制到内核空间, 没有就算了等下一次. 如果内核缓存区有数据,从内核复制到用户空间其实还是阻塞的.

从图中也可以看到, 这两种方式都是有一点阻塞的(内核阻塞), 只不过非阻塞IO在用户调用时候是不阻塞的.

  1. IO复用是一个特性, 让我们能在一个线程中监控多个fd的内核缓冲区.如果没有一个内核缓冲区可以可用, 就会poll就会阻塞进程.他保证能读的时候内核缓存可以用, 但是要阻塞一会从内核到用户空间.
  2. 信号驱动IO, 就是将上面的IO复用的Poll操作通过回调机制变成了一个不阻塞的.没啥大意思.
  3. 异步IO是完全没有阻塞的IO调用, 内核会把数据复制到用户空间, 然后在告诉你IO可以用了, 这个时候进行IO就一定是不阻塞的.数据就在用户空间中.

上面这五种是书里给出的叫法, 本质上 同步异步是说有没有可能两个东西一起运行, 而阻不阻塞是说调用会不会等待.