左边是应用程序。同步阻塞IO:效率不高、编程简单。

应用进程(线程)通过调用来读数据,当数据没有准备好时,就处于阻塞模式,等待数据;当数据准备好时,将数据从内核空间拷贝到用户空间(自定义的buff中),完成数据的拷贝。这个过程中进程一直阻塞在read上。这是同步IO,效率不高、编程简单。

把sockfd设置成非阻塞状态。通过返回值来判断read处于非阻塞状态。

select、poll、epoll可以设置超时时间,如果没有设置的话,就默认在阻塞状态,设置了之后,也可以工作在非阻塞模式下。
同样检查返回值等于-1和errno==EAGAIN(正常的非阻塞返回)。同步的过程。
当数据就绪之后,根据返回的fd是连接的fd还是通信的fd分别处理,如果是通信的fd,则读数据。
一个IO复用可以监听多个套接字fd。

linux系统特有的。
内核在第一个阶段是异步,在第二个阶段是同步;与非阻塞IO的区别在于它提供了消息通知机制,不需要用户进程不断的轮询检查,减少了系统API的调用次数,提高了效率。

- struct aiocb {
- int aio_fildes
- off_t aio_offset
- volatile void *aio_buf
- size_t aio_nbytes
- int aio_reqprio
- struct sigevent aio_sigevent
- int aio_lio_opcode
- };
典型的异步非阻塞状态,Node.js采用的网络IO模型。