网络IO实现方式

同步与异步

同步与异步的概念, 关注的是 消息通信机制

  • 同步是指发出一个请求, 在没有得到结果之前该请求就不返回结果, 请求返回时, 也就得到结果了.

比如洗衣服, 把衣服放在洗衣机里, 没有洗好之前我们一直看着, 直到洗好了才拿出来晾晒.

  • 异步是指发出一个请求后, 立刻得到了回应, 但没有返回结果. 这时我们可以再处理别的事情(发送其他请求), 所以这种方式需要我们通过状态主动查看是否有了结果, 或者可以设置一个回调来通知调用者.

比如洗衣服时, 把衣服放到洗衣机里, 我们就可以去做别的事情, 过会儿来看看有没有洗好(通过状态查询);
或者我们设置洗衣机洗完后响铃来通知我们洗好了(回调通知)

阻塞与非阻塞

阻塞与非阻塞关注的是 程序在等待调用结果时的状态

  • 阻塞是指请求结果返回之前, 当前线程会被挂起(被阻塞), 这时线程什么也做不了
  • 非阻塞是指请求结果返回之前, 当前线程没有被阻塞, 仍然可以做其他事情.

参考来源http://www.cnblogs.com/wxd0108/p/7575697.html

BIO

BIO即Blocking IO,采用阻塞的方式实现。也就是一个Socket套接字需要使用一个线程来进行处理。发生建立连接,读数据,写数据操作时,都可能发生阻塞。这种方式实现比较简单,但是这样做带来的问题是使得一个线程只能处理一个Socket,如果是服务端,那么在支持并发连接的时,就需要更多的线程来完成工作。

NIO

NIO即Nonblocking IO,基于事件驱动思想,采用的是Reactor模式。相对于BIO,NIO的一个明显的好处是不需要为每个Socket套接字分配一个线程,而是可以在一个线程中处理多个Socket套接字相关的工作。

Reactor模式

Reactor,即反应堆。Reactor 的一般工作过程是首先在 Reactor 中注册(Reactor)感兴趣事件,并在注册时候指定某个已定义的回调函数(callback);当客户端发送请求时,在 Reactor 中会触发刚才注册的事件,并调用对应的处理函数。在这一个处理回调函数中,一般会有数据接收、处理、回复请求等操作。其 Reactor 的中心思想是众所周知的 I/O 多路复用:select,poll,epoll,kqueue 等。

参考来源http://www.cnblogs.com/daoluanxiaozi/p/3274925.html

在NIO的方式下不是用单个线程去应对单个Socket套接字,而是统一通过Reactor对所有客户端的Socket套接字的事件做处理,然后派发到不同的线程中。这样可以解决BIO中为了支持更多的连接而需要更多的线程。

书籍《大型网站系统与Java中间件实践》

AIO

AIO即AsynchronousIO,就是异步IO。整个过程中, 用户线程发起一个系统调用之后无须等待, 可以处理别的事情. 由操作系统等待接收内容, 接收后把数据拷贝到用户进程中, 最后通知用户程序已经可以使用数据了, 两个阶段都是非阻塞的。AIO采用Proactor模式。

Proactor模式

时序图:

Proactor 的实现主要有三个部分:异步操作处理器,Proactor 和 事件处理函数。其中:

  • 异步操作处理器,很依赖操作系统的异步处理机制,如若操作系统没有实现,我们可以自行模拟,即开专门的数据读写线程,数据读写完毕触发相应的时间(如果有注册的话);

  • - Proactor,会接收异步操作的提醒,调用相应的事件处理函数,它有自己的 event loop;

  • - 事件处理函数,事件触发,执行操作;

各自适用场景

BIO适用场景

适用于连接数目比较小,并且一次发送大量数据的场景,这种方式对服务器资源要求比较高,并发局限于应用中。

NIO适用场景

服务器需要支持超大量的长时间连接。比如10000个连接以上,并且每个客户端并不会频繁地发送太多数据。例如总公司的一个中心服务器需要收集全国便利店各个收银机的交易信息,只需要少量线程按需处理维护的大量长期连接。

Jetty、Mina、Netty、ZooKeeper等都是基于NIO方式实现。

AIO适用场景

当我们要拿数据花费时间太长的时候,我们可以考虑使用异步的IO。异步就是可以理解为,让IO先处理者,我线程先去干别的事情了,你IO处理完了通知我一下。

参考书籍《大型网站系统与Java中间件实践》

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值