BIO、NIO、AIO
同步与异步,阻塞与非阻塞
这四个概念两两组合,可以形成下面 4 个新的概念,如下:
1. 同步阻塞:客户端发送请求给服务端,此时服务端处理任务时间很久,客户端则被服务端堵塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其它任何事情,服务端也不会接受其它客户端的请求。这种通信机制比较简单粗暴,但是效率不高。
2.同步非阻塞:客户端发送请求到服务端,此时服务端处理任务很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会回来处理原先的。这种方式很高效,一个服务端可以处理很多请求,不会再因为任务没有处理完而堵着,所以这是非阻塞。
3.异步阻塞:客户端发送请求到服务端,此时服务端处理时间很久,但是客户端不会等待服务端响应,它可以做其它的任务,等服务端处理完毕后在把结果响应给客户端,客户端得到回调后在处理服务端的响应。这种方式可以避免客户端一直处于等待的状态,优化了用户体验,其实就是类似于网页里发起的 ajax 异步请求。
4.异步分阻塞:客户端发送请求到服务端,此时服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其它的任务,因为他是异步的,可以在回调函数里处理响应;同时服务端是非阻塞的,所以服务端可以去处理其它的任务,如此,这个模式就显得非常的高效了。
以上四点,除了第三点,其余的分别是BIO/NIO/AIO,那么如何简述一下BIO/NIO/AIO的概念与区别,可以通过下面的生活实例进行说明:
1.BIO: 小A去上厕所,这个时候坑位满了,他必须等待坑位释放了,才能上吧!此时他什么都不干,站在厕所等着,过了一会有人出来了,就赶紧蹲进去。
2.BIO: 小A去上厕所,这个时候坑位满了, 但是没关系,他先出去抽根烟,过会回来看下有没有空位,如果有就蹲,如通过没有就再出去抽烟或者玩下手机。
3.异步阻塞:小A去上厕所,这个时候坑位满了,没事他等着,等有了新的空位,让出来的人通知他,他就蹲上去。
4.AIO:小A去上厕所,这个时候坑位满了,他一点也不急,出去抽根烟玩玩手机,等有新的位置了,出来的那个人会去通知他,通知他了,就可以蹲了。
从这实例中可以看得出来:
1. 同步,就是需要自己每隔一段时间,以轮询的方式去看看有没有空的坑位;
2. 异步,则是有人会通知他,通知他以后再回去蹲;
3. 阻塞,就是在等待的过程中,不会做其它任何的事情,就干等着;
4. 非阻塞,就是在等待的过程中你可以去做其它任何事情,比如抽烟、喝酒、烫头、玩手机。
总结:异步的优势显而易见,大大优化了用户体验,非阻塞使得系统资源开销远远小于阻塞模式,因为系统不需要创建新的进程(或线程),大大地节省了系统的资源,如此多出来的系统资源可以给其它的中间件服务。