阻塞,同步,非阻塞,异步
- 同步和异步
同步和异步关注点是消息通信机制,同步模型下消息的处理者主动去等待消息的提供者,异步模型下由消息提供者来通知消息处理者。
- 阻塞和非阻塞
阻塞和非阻塞关注的是消息处理者在等待调用结果消息结果时的状态。
引用一个知乎上的回答。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻。 2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。 3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大。 4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。 所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,阻塞;看电视的老张,非阻塞。情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
在处理IO时,大部分用到的IO都是同步IO,包括这部分所讲的IO多路复用。只有使用了特殊的API时才可能使用异步IO。在BSD和System V派生的独有系统中提供了某种形式的异步IO。
IO多路复用
IO多路复用即如上文老张的第二种同步非阻塞的方法,不过此时不是一个水壶而是好几个水壶。 IO多路复用有三种机制,select, poll, epoll。这里仅考虑第一种比较简单的select机制。 对于Java语言,NIO(New IO)中的selector就是专门为select准备的。 懒得写了,要理解selector必须知道channel和buffer,这里推荐一个系统学习java Nio的网站。