IO
本质上由IO-NIO/多路复用,是为了减少系统调用的阻塞
BIO
socket通信,bio会阻塞等待server输入,可以创建每接收一个输入新建线程执行(传统方式)
jps查看java进程
netstat -natp查看socket
缺点:线程太多,原因:阻塞
NIO
serverSocketChannel.configureBlocking(false) 手动配置非阻塞
原本阻塞的方法不会阻塞,会立刻返回(-1或者null)
- 通道循环轮询内核查看是否有新增任务(service或client)(可阻塞式等待) 弊端,反复遍历内核 (select,poll)
- epoll_create内核开辟空间,红黑树存储,存贮新增的任务,文件描述符表示此表,epoll_ctl,将连接加入表中,1,fd3(9090), 2,fd5(client),epoll_wait(第一次加入server-fd3,后续取空间对应的链表里的连接,处理)
例子 epoll_ctl(5, EPOLL_CTL_ADD, 6,{EPOLLIN,{u32=6, u64=6}}) = 0 ,5是空间,6是server
epoll_wait(5, {}, 10128, 100) = 0,redis单线程,超时100,循环处理,nginx是阻塞式等待连接