47、Nio(Io模型(多路复用))

Nio(Io模型(多路复用))

多路复用,其中再select的是阻塞的,然后有read事件后才去复制数据(也是阻塞的)

多路复用和阻塞IO对比

  1. 阻塞io

想象一个场景我们有多个channel,channel1和channel2,若我们是单线程在一个循环里去处理多个channel的请求(ch1是read,ch2是accept事件)。Channel1发送数据触发read事件完成后,channel2连接事件,但是此时若是1再来read那么就不行了,前面的2的accept事件还没完成返回,(只有2建立连接返回后)1才能感知到read,再次读。

阻塞io:在一个channel等待事件连接的时候,其他channel就不能做read操作。(一个人在做一件事的时候其他人就不能做东西了)

  1. 多路复用(最开始就是一个单线程加selector)

在select阻塞(等待事件)后,返回的是一堆事件(而不是前面阻塞io一个事件一个事件的返回了),然后就让他再下面循环里全部处理完了。所以他就不用前面的等待连接,等待数据了(select前面是已经等待事件完成了,我们select后只需要马上向下运行即可(不需等待了))。我们在等待事件的时候将所有的等待了。(若是单线程其中,虽然返回的也是一批事件,循环处理,但是其中处理的时候还是一个一个事件处理的,阻塞一个后面也会阻塞,所以我们加多线程去分别处理事件)

!!!这样理解吧,阻塞io是是等待具体的事件才会往下执行(马上执行)(执行需要耗费时间的),而多路复用是将事件往后执行(不是马上执行的)(有一个复制到集合再去集合遍历事件的操作),你去遍历前面复制的集合得到你想要的事件然后处理。(我们复制需要时间这个时候又来事件了了,那他就又去复制一下咯。然后再遍历(迭代器)复制集合执行)

猜你喜欢

转载自blog.csdn.net/logtcm4/article/details/127851413