一、同步和异步
同步和异步关注的是消息通信机制。
1.1 同步概念
在发出一个 “调用” 时,在没有得到结果之前,该 “调用” 就不返回,但是一旦调用返回,就得到返回值了。换句话说就是由 “调用者” 主动等待调用结果。
1.2 异步概念
"调用” 发出之后,这个调用就直接返回了,没有返回结果。换句话说,当一个异步过程调用发生后,调用者不会立刻得到结果,而是在 “调用” 发生后,“被调用者” 通过状态通知来通知调用者,或通过回调函数处理这个调用。
1.3 举例
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
二、阻塞和非阻塞
阻塞和非阻塞关注的是程序等待调用结果(消息,返回值)时的状态。
2.1 阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
2.2 非阻塞
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
2.3 举例
1、阻塞:当试图对某个文件进行读写时,发现不能够进行读写操作,程序进入等待状态,直到可以进行读写操作为止(充饭费,人太多也只能在后面排队)
2、非阻塞: 当试图对某个文件进行读写时,发现不能够进行读写操作,马上返回,不在等待(银行里取款办业务时,领取一张小票,领取完后我们自己可以玩玩手机,当轮我们时,银行的喇叭会通知,这时候我们就可以去了。 )
三、总结
3.1 举例
老张想要煮开水泡茶喝。此时有两把水壶,一把普通的水壶,一把会响的响水壶。
3.2 同步阻塞
老张把普通的水壶放到火上,立等水开。
3.3 同步非阻塞
老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有
3.4 异步阻塞
老张把响水壶放到火上,立等水开
3.5 异步非阻塞
老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。
3.6 总结
1、所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己,造成老张效率的低下。
2、所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,阻塞;看电视的老张,非阻塞。3.2 和 3.4 中老张就是阻塞的,媳妇喊他都不知道。虽然 3.4 中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。
四、常用实现
4.1 BIO
Blocking I/O 同步阻塞 I/O,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以用线程池机制改善。做完一件事情再去做另一件事情,一件事情一定要等前一件事情做完,但是在高并发情况下,效率就很低了。
适用于:连接数目比较小且固定的架构,这种方式对服务器资源要求比较高。
4.2 NIO
New I/O 同步非阻塞 I/O,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到有 IO 请求时才启动一个线程进行处理。
适用于:连接数目多且连接比较短(轻操作)的架构,聊天服务器。
4.3 AIO
Asynchronous I/O 异步非阻塞 I/O,服务器实现模式为一个有效请求一个线程,客户端的 IO 请求都是由 OS 先完成了再通知服务器去启动线程进行处理。
适用于:连接数目多且比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作。