BIO(Blocking IO) 又称同步阻塞IO,一个客户端由一个线程来进行处理

当客户端建立连接后,服务端会开辟线程用来与客户端进行连接。以下两种情况会造成IO阻塞:
基于BIO,当连接时,每有一个客户端,服务就开启线程处理,这样对资源的占用时非常大的;如果使用线城市来做优化,当大量连接时,服务端也会面临无空闲线程处理的问题。那么怎么设计才能让单个线程能够处理更多请求,而不是一个。所以NIO就被提出。
NIO(Non Blocking IO)又称同步非阻塞IO。服务器实现模式为把多个连接(请求)放入集合中,只用一个线程可以处理多个请求(连接),也就是多路复用。
NIO有3大核心组件:

这样就大大提升了连接的数量,用于接收请求。
NIO目前有三个函数(模型)
Select 是Linux提供的一个函数,可以将一批fd一次性传递给内核,然后由内核去遍历,来确定哪个fd符合,并提供给用户空间

Select 函数处理过程
fd数组拷贝到内核空间fd数组,查看是否有数据到达
fd,将当前进程挂到每个fd的等待队列中当前进程就会被唤醒fd的数量,并对用户空间的fd做标记当前进程进入睡眠,当有某个fd有I/O事件或当前进程睡眠超时后,当前进程重新唤醒再次遍历所有fd文件fd 不处理,只有标记的fd才会去处理Select存在的问题
fd数量有限制:单个进程所打开的fd是有限制的,通过 FD_SETSIZE 设置,默认1024fd拷贝耗时:每次调用 select,需要将fd数组从用户空间拷贝到内核空间fd是否有数据到达,这是一个同步的过程fd后,返回的是数量,而不是fd本身:select返回的是fd的数量,具体是哪个还需要用户自己遍历Poll 也是Linux提供的内核函数,poll 和 select 基本是一致,唯一的区别在于它们支持的fd的数量不一致
fdpoll解决了select函数的fd数量问题,而epoll解决了select、poll函数其余问题:
fd数量有限制:poll已经解决此问题fd拷贝耗时:内核空间种保存一份fd数组,无需用户每次都重新传入,只需要告诉内核修改的部分即可fd,而是通过异步 IO 事件唤醒fd后,返回的是数量,而不是fd本身:内核空间会通过异步 IO 事件,将fd返回给用户,用户无需在遍历整个fd数组
因此,epoll提供3 个函数,来处理上述改进的方案:
epoll_create:创建 epoll 句柄epoll_ctl:向内核空间添加,修改,删除需要监控的fdepoll_wait、epoll_pwait:类似 select 函数Netty是一个异步基于事件驱动的高性能网络通信框架,可以看做是对NIO和BIO的封装,并提供了简单易用的API、Handler和工具类等,用以快速开发高性能、高可靠性的网络服务端和客户端程序。