I/O模型
Unix下共有5中可用I/O模型
- 阻塞式I/O ---------------【同步】
- 非阻塞式I/O ------------【同步】
- I/O复用 ------------------【同步】
- 信号驱动式I/O ---------【同步】
- 异步I/O ------------------【异步】
阻塞式I/O模型
最流行的I/O模型是阻塞式I/O(blocking I/O)模型,默认情况下,所有socket都是阻塞的。就是我发起一个调用,然后进程就投入睡眠,啥也干不了,一直等 直到结果返回,这个睡眠的过程就叫阻塞。
非阻塞式I/O模型
轮询。发起一个调用,不把进程投入睡眠,而是立即返回一个EWORULDBLOCK错误,在这中间用户的I/O操作永远不会被阻塞。但是你不知道它啥时候成功,让CPU不断的去轮询:你好了吗?你好了吗?直到他好了。
I/O复用模型
以调用select、poll、epoll等函数,这些函数本身都是阻塞的,当调用来,不必把整个I/O给阻塞了,而是用函数来等,I/O系统还能正常处理其他调用。而I/O多路复用与多线程相比最大的优势是不必创建新的进程/线程,也不用维护,节省系统开销。
select函数:是实现IO多路复用的一种方式。
信号驱动式I/O模型
开启信号驱动I/O功能,安装信号处理函数。
当调用来了,内核去准备数据,而不会阻塞线程,准备好了之后,内核发出SIGIO信号通知进程来处理,但处理过程依然是阻塞的。
异步I/O模型
发起一个调用,进程通知内核工作,内核立刻返回,不会阻塞进程;当内核真正处理完后,通知进程,真正做到了异步。
总结
除了异步I/O是异步的,其余均为同步。
- 阻塞式I/O:I/O整个被卡住,傻傻的等
- 非阻塞式I/O:虽然没有被卡住,但一直轮询看好了没
- I/O复用:有个函数来帮你卡住,虽然没有卡住整个I/O系统,但每个调用依然是阻塞的
- 信号驱动式I/O:准备数据阶段不需要你参与,但日后处理还是阻塞的跑不了,内核通知你啥时候开始启动I/O操作
- 异步I/O:全程就开始的时候参与一下,结尾参与一下,中间爱干啥干啥。内核通知你I/O操作啥时候完事。