同步阻塞 and 同步非阻塞 and 异步非阻塞
什么是BIO ???
BIO:同步阻塞,服务器实现一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,没处理完之前此线程不能做其他操作。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高。
举个栗子:
同步阻塞:小明从网上要下载一个文件,于是来到书房打开电脑开始下载,而且得必须坐在电脑桌前一直等到文件下载完毕。
BIO网络模型
假设左边是客户端,右边是服务器端;
第一步,服务端启动,开始监听客户端的连接请求;
第二步,客户端启动,启动后向服务端发起建立连接请求;
第三步,服务端接收到客户端发起的连接请求,会创建一个新的线程;
第四步,这个新创建的线程会和客户端建立 socket 连接,然后响应客户端的连接成功信息;
第五步,服务端这个线程会一直等待客户端的再次请求。
假设客户端在建立完连接请求后一直没有再发送信息,那么服务器端的线程会一直一直等待,让我们试想一下,如果上千万的客户端都这样,建立完连接之后不发数据,那么........
服务器端就承受不住了 !!!
什么是NIO ???
NIO: 同步非阻塞,服务器实现一个连接一个线程,即客户端发送的连接请求都会注册到多路复用 器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多 且连接比较短(轻操作)的架构,比如聊天服务器。
举个栗子:
同步非阻塞:小明从网上要下载一个文件,于是来到书房打开电脑开始下载,但不需要坐在电脑桌前一直等待,而是可以到客厅看电视,每隔一分钟左右来书房看一下是否下载完毕即可。
NIO网络模型
假设左边是客户端,右边是服务器端;
第一步,Selector 里注册一个建立连接的事件;
第二步,当客户端启动,启动后向服务端发起建立连接请求;
第三步,Selector 会检测到客户端发起的连接请求,然后启动一个建立连接的事件处理器;
第四步,Acceptor 创建于客户端连接,即响应客户端的建立连接请求;
第五步,Acceptor 把新创建的 socket 连接注册到 Selector 上,并且注册这个连接的可读事件;
第六步,客户端发送请求,还是发送到 Selector 上;
第七步,Selector 启动连接读写处理器;
第八步,Read & Write 处理与客户端的读写业务;
第九步,由 Read & Write 响应客户端请求;
第十步,Read & Write 再次将 Socket 可读事件注册到 Selector 上。
什么是AIO ???
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统 先完成了再通知服务器应用去启动线程进行处理,AIO方式使用于连接数目多且连接比较长(重操 作)的架构,比如相册服务器,充分调用操作系统参与并发操作,编程比较复杂,JDK1.7之后开 始支持。
AIO属于NIO包中的类实现,其实IO主要分为BIO和NIO,AIO只是附加品,解决IO不能异步的实现。
在以前很少有Linux系统支持AIO,Windows 的IOCP就是该AIO模型。但是现在的服务器一般都是 支持AIO操作。
举个栗子:
异步非阻塞:小明从网上要下载一个文件,于是来到书房打开电脑开始下载,不需要坐在电脑桌前一直等待,小明可以安心去客厅看电视,中途也无需返回查看下载情况,电脑文件下载完毕后会有提示音通知小明下载完毕。