谈谈JAVA AIO

什么是AIO【异步非阻塞】,AIO和NIO,BIO的区别是什么呢,我们知道Netty是著名的AIO框架。

客户端和服务器端之间进行通信,建立连接之后,要通信就要有读写操作,实际上一个完整的读写操作是由两部分组成的,比如服务器读取客户端的消息,前半部分为等待客户端的数据,后半部分为执行真是的写操作,等待客户端输入会造成线程阻塞,可以用多线程和NIO解决,那后半部分的写操作呢?写数据写入内存的时候也会造成阻塞的,这就是AIO要解决的问题,当执行写入操作时,AIO直接发出一个写指令,然后立即返回,不需要等待写入操作的完成,因为IO操作是DMA操作,不需要CPU参与的,当DMA操作完成之后会发出一个信号通知给主线程。


举个例子吧, 客户去银行办理业务,客户代表客户端,银行代表服务器端。

阻塞非阻塞            客户A取号要办理存款业务,紧接着客户B也想取号也要办理存款业务,这就好比客服端A和服务器端建立连接,

                                客户端B也企图和服务器端建立连接,注意,如果服务器端是单线程,那么B是不能和服务器端建立连接的也

                                就是说B取不到号的,因为A已经和服务器端建立连接了,在A办理好业务之前B是没有机会办理业务的,如果

                                A一直坐在大堂不去窗口办理业务,那么B也只有干等着的份(被阻塞),不但B要干等着,窗口的柜员S1(服务器)

                                也要傻等着大爷A去办理,窗口的柜员S1(服务器端)等A 的这段时间【从A取号到A到达柜台的这段时间】就是

                               BIO中所说的阻塞的时间,这段时间越长,客户B等待的时间就越长。银行为了解决这 种问题就增加一个柜员S2

                               来处理客户B的业务(这就是相当于服务器新起一个线程),这样A就阻塞不到B了,但是这样太浪费人力物力了。

                               那么非阻塞是怎么做的呢,客户A取了号之后B也可以取号,不必等待A办理完了业务,B不会因为A一直不去办理而

                               被阻塞,如果A取了号之后还是做在大堂不去柜 台,那么B就会去,柜员处理谁的业务取决于谁先到达柜台,不取决

                              于谁先取号,这样的话银行的办事效率是不是就提高很多了呢。

                    

同步异步:          在非阻塞单线程的情况下,A取号之后立刻去柜台办理业务,B取号也即刻去柜台办理业务,那B的业务就不能被办理,

                             因为柜员S只有一个(单线程),A的业务没有办理完之后才能办理B的呢,这样B也被A阻塞了,那这种情况下再怎么

                             提高效率呢,柜员S接到A的业务后立即丢给助理M1去做,然后马上 就可以接受B的业务了然后把B的业务又立即丢给

                             M2去做,M1和M2做好之后通知一下柜员S就可以了,这样B就不用等A的业务处理完再处理了。这时读者心里可能会问

                            把业务丢给助理M1和M2去处理不也是新建两个线程去处理吗?和叫两个柜员去处理不是差不多嘛,哪里能提高效率

                           (提高服 务器的并发 能力),因为IO操作是DMA操作,不涉及CPU的,不需要新建线程去处理,只要发送了IO命令

                            就不需要线程的参与,同步的情况下,线程会等待IO的结束再继续往下处理,那异步就不需要等待IO的结束,发送IO

                           命令之后马上进行之后的处理,那IO结束之后会发出一个信号标识IO完成【失败或者成功】,这就相当于M1,M2办理

                           完业务之后通知柜员S。


好了,写完了,纯手打,累。

                           

                      

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值