一个线程(6.0的多线程是指I/O数据的收发多线程,业务逻辑还是单线程)处理很高并发,十万并发。
通过多路复用
线程模型,类似于NIO
线程源码在(src/e_epoll.c,e_evport.c,e.h,e_kqueue.c,e_select.c)
BIO模型
redis,netty等底层就是IO通信程序
serverscoket就是一个BIO模型,创建BIO类,监听9000端口,
serversocket就是建立一个客户端连接
执行发现客户端没有连接,程序阻塞了
因为BIO程序规定没有客户端连接就阻塞,有客户端连接后才跳出阻塞
BIO提供的api都是阻塞的,阻塞中等待某些操作,无法支持高并发
通过多线程可以处理多个客户端的并发,但在生产环境,同一时刻创建100k或更多线程就会创建100k个线程,占用超多内存空间,导致内存溢出
此时可以设置POOL(500)线程池,但并发跟线程池的数量相关,限制很大
NIO模型
同样建立一个进程监听9000端口,但设置为非阻塞模式
服务器没有在serversocket.acceptz阻塞,socketchannel值为null
一个线程一直循环,只要收发数据时间不要太长导致阻塞,就可以在很短时间处理很多连接。
但会对cpu要求很高,并且如果没有连接也会一直循环,效率不高
每次处理连接要遍历整个建立了连接客户端list
解决方法:建立一个 建立了连接的connectlist 这个list为空的时候就阻塞,让出cpu
调用open方法,创建一个selecter多路复用器,把serversocketchannel服务端注册到selector上
并且让selector传了一个OP_ACCEPT(IO事件,如连接事件,读写时间)
让selector监听服务端的连接事件