首先是阻塞IO,应用进程想要去读取数据,应用进程就会阻塞,等待内核将数据复制到应用空间,复制成功后,返回成功提示,但是这种阻塞的方式肯定是不太好的。其次是非阻塞IO,应用进程想要去读取数据,数据没准备好,立即就会返回错误码,直到内核将数据拷贝到用户空间,去通知应用程序来读取,读取好后就返回成功的提示。但是在并发的环境下,可能有N个人向一个应用发送消息,这种情况就得创建多个线程去读取数据,这是不太好的,所以就出现一种一个线程可以监控多个网络请求的方法,也就是IO复用模型,就是我们常说的select、poll和epoll,当被监控的某个文件描述符准备就绪了,就返回一个可读的状态,应用程序再去读取数据,但是像select和poll的话,你需要去轮询文件描述符去判断是否有事件发生,而epoll的话虽然比较好,但是它是linux的专用api,所以就有了信号驱动IO模型,就是用一个SIGIO标记,当数据准备好后,内核线程会通过这个SIGIO标记去通知线程去读取数据。最后一种就是异步IO了,我们前面说的几种方法都是需要应用线程先发送询问请求,再去发送一个读取数据的请求两个阶段,而异步IO的话,我们需要把要操作的步骤告诉它,就只需要向内核发送一次请求就行,当数据准备好后,内核会主动把数据拷贝到用户空间中去进行操作。。嗯。。大概就是这样。

    Reference
    100%弄明白5种IO模型 - 知乎 (zhihu.com)