同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO

IO分两阶段:

  1. 数据准备阶段(等水来)
  2. 内核空间复制回用户进程缓冲区阶段(打满水)

    阻塞IO

    A去打水,一直等水来并打满,才能离开。
    阶段1,阶段2都阻塞。
    Alt text

    非阻塞IO模型

    A去打水,如果水没来,离开反复轮询,水来接满水走。
    Alt text
    即为阶段1非阻塞,阶段2阻塞。

    IO复用模型(同步非阻塞IO)

    A去打水,发现有一排水龙头(多个fd),阿姨告诉他都没水,水来了通知他(一直等),阿姨通知他后去打水,但是不知道哪个水龙头有水,所以一个个打开。
    Alt text
    Epoll,阿姨会告诉A哪几个水龙头有水,不需要一个个打开。

    信号驱动IO模型

    通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)。
    Alt text

    异步IO模型

    调用aio_read,让内核等数据准备好,并且复制到用户进程空间后执行事先指定好的函数。E同学让舍管阿姨将杯子装满水后通知他。整个过程E同学都可以做别的事情(没有recv),这才是真正的异步IO。
    Alt text