unix系统下常见的五种IO模型
- 阻塞式
- 非阻塞式
- IO复用(select,poll)
- 信号驱动(SIGIO)
- 异步调用(POSIX的aio系列函数)
一个输入操作通常具有两个不同的阶段
- 等待数据准备好
- 从内核将数据复制到进程
对于一个网络套接字上的输入操作:
1)等待数据从网络中到达 。
2)将内核缓冲区的数据复制到进程中
五种IO模型简介
1. 阻塞式
2. 非阻塞式
应用进程反复轮询内核,查看操作是否就绪,这样做往往消耗大量的cpu时间
3. 信号驱动
4. 多路复用
- 阻塞在select操作,监听一组文件描述符,当某个就绪的时候就通知用户,优势在于可以监听多个描述符
- 多线程中也有类似的模型,不过不是使用select监听一组描述符,而是使用多个线程(一个描述符对应一个线程),这样每个线程都可以自由调用recvfrom之类的阻塞式IO操作了。
5. 异步
五种IO模型的对比
-
阻塞与非阻塞的区别在于第二阶段,将数据从内核区域复制到用户空间的时候是否阻塞
可见:前四种模型都是同步IO,因为真正的IO操作(recvfrom)将阻塞进程,只有最后一种才是异步IO