IO 系列——UNIX 五种 IO 模型
《UNIX 网络编程:卷一》总结了五种经典的 IO 模型,分别为:阻塞式 IO 模型、非阻塞式 IO 模型、多路复用 IO 模型、信号驱动 IO 模型、异步 IO 模型。
1. 阻塞 IO
阻塞式 IO 模型:进程发起 IO 请求,在整个过程会一直阻塞,直到数据返回到用户空间。
2. 非阻塞 IO
非阻塞式 IO 模型:进程发起 IO 请求后,若内核没有准备好数据,立即给进程返回一个状态,进程会一直轮询内核,直到内核有数据准备好,阻塞等待内核将数据从内核空间复制到用户空间。
3. 多路复用 IO
IO 复用模型:进程发起一个 IO 请求,然后把自己注册到一个 select 的系统进程,select 会监听数据是否准备好,若准备好 select 会通知进程,进程发起系统调用,CPU 会复制内核空间缓冲区数据到用户空间,复制数据过程也是阻塞的。
为什么叫 IO 多路复用呢?因为 select 可以接受多个进程注册,可以监听多个进程的 IO 请求,不像非阻塞式 IO 模型需要进程不断轮询,多路复用模型把询问的任务交给了 select,让多个进程都可以共享 select。
4. 信号驱动 IO
信号驱动 IO 模型:进程通过系统调用注册了一个信号处理程序,信号处理程序会在数据准备好时,发送信号告知进程,进程再发起系统调用,CPU 会把内核空间的数据复制到用户空间返回,复制的过程会阻塞进程。
5. 异步 IO
异步 IO 模型:进程发起系统调用后,直接返回,不需要阻塞,直到数据从内核空间复制用户空间完成后,系统通知进程 IO 完成。
6. 同步 IO 和异步 IO
其中,阻塞 IO、非阻塞 IO、多路复用 IO、信号驱动 IO 属于同步 IO,这四种 IO 模型都需要用户进程自己把数据从内核缓冲区复制到用户缓存区,复制的过程会阻塞线程;只有异步 IO 属于异步 IO,不需要用户进程复制内核缓冲区数据。
IO 相关文章
版权声明: 本文为 InfoQ 作者【Java联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/0ffcd8e4aa544a991f6ca5ac7】。文章转载请联系作者。
评论