NIO多路复用、Reactor模型

NIO多路复用、Reactor模型
阻塞式TCP一次链接的缺陷
TCP三次握手,四次分手,可靠性链接,Socket套接字作为文件描述符在进程中
客户端与服务端相当于管道,客户端输入流与服务段输出流对应,客户端输出流与服务端输入流对应
TCP一次链接有两次阻塞等待,一次是服务端监听阻塞等待,一次等待数据读/写阻塞等待,属于同步阻塞I/O
服务端与多个客户端进行数据交互需要建立多个Socket通道,单进程单线程服务端只能同时监听一个客户端,其他客户端需要等待链接结束后才能进行通信。
解决方法1:
多线程创建多个TCP客户端链接
单进程里开设多线程,每一个客户端建立一条Socket套接字,会产生线程创建和线程频繁切换的时间,消耗CPU的时间片资源。为了缓解该情况,采用线程池,提高线程创建,线程间切换的效率。
解决方法2:
NIO多路复用,一个线程管理客户端链接,使用另一线程或者进程监听读写操作,轮询式处理
NIO多路复用,一个线程管理多个客户端链接,Linux内核使用一个线程或者进程调用系统select,poll,epoll,可以选择阻塞,也可以选择非阻塞,也可以选择事件I/O集合,监听就绪的Socket描述符事件I/O,有链接事件,读写事件就进行处理。监听事件I/O属于轮询,占用一定CPU时间片资源。
解决方法3:
reactor模型,客户端链接跟读写链接分开处理,事件驱动处理
reactor模型,采用事件驱动I/O,回调的方式,Socket链接,读/写操作事件发生就对应立刻处理,也是NIO模式,不采用AIO模式,因为Linux的AIO不成熟,而且并没有提升多高的效率。
分为单进程单线程reactor,客户端链接和读写处理在一个线程中,遇到Soceket链接,读写事件I/O立刻进行处理,读写往往耗费时间比较长,其他客户端链接来了也会等待。
单进程多线程reactor,解决客户端链接跟读写,将客户端和读写链接分开处理。
主从进程reactor,客户端链接都交给主进程处理,读写事件I/O都交给从进程处理,提高多个客户端与服务端的长读写事件I/O效率,提升吞吐量。
典型应用:
高性能Netty网络编程,boost::asio,

你可能感兴趣的:(nio,tcp/ip,信息与通信,java,c++)