I/O模型中的同步&异步-阻塞&非阻塞
I/O模型中:
-
同步&异步:同步和异步关注的是消息通信机制。
-
阻塞&非阻塞:阻塞和非阻塞关注的是程序在等待调用结果时的状态。
张三爱喝茶,烧水泡茶。
- 张三把水壶放火上,立等水开。(同步阻塞)
- 张三把水壶放火上,去客厅看电视,时不时去厨房看水开没有。(同步非阻塞)
张三买了个智能水壶,烧开后铃声提示。
- 张三把智能水壶放火上,立等水开。(异步阻塞)
- 张三把智能水壶放火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
同步&异步,只是对水壶(被调用)而言。普通水壶——同步。智能水壶——异步。智能水壶能自己干完活后提示张三水开了,普通水壶智能让张三去轮询查看(造成张三效率低下)。
阻塞&非阻塞,仅仅对于老张(调用者)而言。 立等的张三——阻塞;看电视的张三——非阻塞。
一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
从理论上说,阻塞I/O、I/O复用以及信号驱动I/O都是同步I/O模型。
异步I/O的读写操作总是立即返回,而不论I/O是否是阻塞的,因为真正读写操作已经由内核接管。
同步I/O模型要求用户代码自行执行I/O操作,而异步I/O机制由内核来执行I/O操作。即,同步I/O向应用程序通知的是I/O就绪事件,异步I/O向应用程序通知的是I/O完成事件。
I/O模型 | 读写操作和阻塞阶段 |
---|---|
阻塞I/O | 程序阻塞与读写函数 |
I/O复用 | 程序阻塞于I/O复用系统调用,但可以同时监听多个I/O事件,对于I/O本身的读写操作是非阻塞的。 |
SIGIO信号 | 信号触发I/O就绪事件,用户程序执行读写操作。程序没有阻塞阶段。 |
异步I/O | 内核执行读写操作并触发I/O完成事件。程序没有阻塞阶段。 |