BIO NIO 多路复用 epoll select Netty io框架
BIO (阻塞 block io)一个线程对应一个连接(有多少连接需要创建多少对应的线程),缺点:线程太多,cpu调度开销太大,内存资源消耗。
NIO (非阻塞NONBLOCKING,程序在accpet接受连接与recv接受数据时,不管有没有连接进来、已经建立的连接有没有数据,内核直接返回 )一个线程处理N个连接的读写(先检查是否有新的连接,然后遍历所有连接是否有数据进来),缺点:系统调用频繁,用户态内核态切换频繁,中断过多。 连接很多时,read要遍历所有连接耗时很长(假设10万连接,只有1个连接收到数据,其他遍历全部做无用功,算法复杂度O(n),之后再accept新连接(新连接等待时间长),非常耗时。
多路复用器(select、poll、epoll同步IO模型(select与poll区别 ,select有文件描述符数量限制,数据结构不同,poll取消数量限制,select与poll原理本质上一样)),多路复用的字面意思是:通过1次系统调用,查询N个文件描述符(文件描述符代表网络连接)的状态,内核返回有数据的结果集M(M<=N),不再需要程序自身遍历所有连接N。缺点:内核还会遍历所有的连接,每次系统调用都要告诉内核全部的文件描述符(所有连接)
epoll io事件通知,epoll_create (内核会创建一个红黑树)返回文件描述符, epoll_ctl 控制文件描述符,向红黑树添加数据(listen 文件描述符和accept的描述符),epoll_wait (去内核单线链表中查询是否有连接有数据),单线链表数据由网卡收到数据后,网卡中断产生。