阻塞I/O(blocking I/O)
非阻塞I/O(non-blocking I/O)
同步I/O(synchronous I/O)or多路复用I/O(multiplexing I/O)
异步I/O(asynchronous I/O)
信号驱动I/O(signal-driven I/O)
1. 阻塞I/O:
第1阶段:内核准备数据,进程阻塞
第2阶段:拷贝数据(从kernel缓冲区拷贝到用户缓冲区),进程阻塞
2. 非阻塞I/O:
阶段1:进程不阻塞
非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error(EAGAIN *或 *EWOULDBLOCK);
进程在返回之后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform系统调用;这个过程通常被称之为轮询;
阶段2:进程阻塞
轮询检查内核数据,直到kernel数据准备好,再拷贝数据到进程,进行数据处理;
拷贝数据的整个过程,进程仍然是阻塞状态;
3. 多路复用I/O:
阶段1:进程有的阻塞,有的不阻塞,有的可以阻塞又可以不阻塞
- select、poll、epoll
阶段2:进程阻塞
4. 异步I/O:
- 阶段1:进程不阻塞
- 阶段2:进程不阻塞
5. 信号驱动I/O:
- 阶段1:进程不阻塞
- 阶段2:进程阻塞
总结: