1.io请求划分2个阶段
等待数据就绪
从内核缓存区拷贝到进程缓冲区
2.按照请求是否阻塞
同步I/O
异步I/O
3.unix的5种I/O模型
阻塞I/O
非阻塞I/O
I/O复用(select,poll,epoll等支持I/O多路复用)
信号驱动I/O
异步I/O
前4种模型都是同步I/O
1. 阻塞I/O
阻塞I/O模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用程序的缓冲区或者发生错误才返回,在此期间进程 进入睡眠或者挂起状态。(进程挂起了)
2.非阻塞I/O
非阻塞I/O模型:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个ewouldblock错误,用户进程便在成功返回数据之前一直在调用recv操作询问数据可读性,轮询的操作方式。(轮询占用CPU)
以上两种模式好比:一位大伯在一个小区,知道今天有信要到门卫那边的信箱里面,但不知道什么时候。
阻塞I/O->大伯直接在门卫那边等,直到信过来;
非阻塞I/O->大伯没过一段时间去看一下有没有信过来。
3.I/O复用
I/O复用(select,poll,epoll等支持I/O多路复用):进程通过将一个或多个连接传递给select或poll系统调用,I/O复用实现了多个连接或者多种连接(TCP,UDP等)共用了同一种等待机制,select会返回某个连接的可读条件,调用recv/recvfrom把所读的数据报拷贝到应用进程的缓冲区中。(多个连接注册同一个select,nio是基于I/O复用模型实现的)
I/O复用->门卫收到整个小区的信时通知相应的人过来取信。
4.信号驱动I/O
信号驱动I/O:通过sigaction系统调用实现了SIGIO信号的捕获与处理函数,它是非阻塞的。当有数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据。(捕获内核发送过来的信号)
5.异步I/O
异步I/O:告知内核启动某个操作,并让内核在整个操作完成后通知我们,包括将数据从内核拷贝到用户空间。(异步的)
信号驱动I/O->门卫通知相应人过来取信
异步I/O->门卫把信送到相应人手里
前4种模型都是同步I/O,最后一种是异步的
参考: http://blog.csdn.net/moxiaomomo/article/details/6844469