(精华)JAVA NIO_流程图_架构图_系统图_数据库
2024-11-03 14:20:51 30 举报
JAVA NIO详细图解
作者其他创作
大纲/内容
client1
第2步
当红黑树的中channel有对应的事件发生时,会将该channel复制到rdlist。这一步是由操作系统来完成的
EPollSelectorImpl:调用implRegister将channel添加到数组pollWrapper中(pollWrapper.add(fd))
EPollArrayWrapper:EPollArrayWrapper()在创建channel数组时,构造方法里面还会调用epollCreate(),来触发C层面创建epoll实例。
updateRegistrations();
buffer
JAVA应用层
8080端口
epoll_ctl方法
监控
监听
第1步
rdlist
存放所有channel的集合
客户端
红黑树
pollWrapper.poll(timeout)
epfd = epollCreate();
selector.select()
EPollSelectorImpl:JAVA底层创建channel数组
SocketChannel1
epoll_wait采用阻塞的方式来监控rdlist有没有数据,有数据就将该数据拷贝到用户空间,程序继续往下运行
epoll_create,创建了一个epoll实例(epoll包含了一个红黑树和一个rdlist双向链表)
客户端连接
注册
SocketChannel2
Thread
1、Selector.open():在JAVA层面创建了一个存储所有channel的数组,底层(C语言)调用了epoll_create,创建了一个epoll实例(epoll包含了一个红黑树和一个rdlistspan style=\
epoll_create方法
JAVA NIO
Selector.open()
注册绑定:将channel添加到红黑树,并且与对应事件绑定起来(连接,读,写事件)
1、NIO SERVER启动时,会调用Selector.open()方法,创建一个Selector对象,并且调用register方法,将ServerSocketChannel注册到Selector上面(此时Selector上面只有一个ServerSocketChannel,ServerSocketChannel只负责连接事件)2、调用selector.select()方法,采用阻塞方式监听所有channel的事件(连接,读,写),一旦有事件产生,就将这些事件以集合形式返回,由程序来处理3、如3个客户端发起了连接,此时,ServerSocketChannel会有3个连接事件返回,程序会拿到这3个SocketChannel并注册到Selector上(此时Selector上面有1个ServerSocketChannel和3个SocketChannel,SocketChannel负责读写事件)4、client1和client2有数据过来,Selector会感知到,将这2个SocketChannel以集合形式返回,由程序来处理
服务端
epoll_wait方法
就绪事件列表rdlist
pollWrapper = new EPollArrayWrapper();
SocketChannel3
Selector多路复用器
C层面
这里的socketChannel代表SocketChannel和ServerSocketChannel。
注册绑定
client2
client3
EPollSelectorImpl:调用poll开始注册绑定(第1步)及监控(第2步)注册绑定:将channel添加到红黑树,并且与对应事件绑定起来(连接,读,写事件)监控:监控rdlist列表有没有数据
当集合里的channel有事件发生时,操作系统会将其复制到rdlist中
ServerSocketChannel
implRegister()
socketChannel.register()
span style=\
服务端ServerSocketChannel是在服务启动时注册的,只关注连接事件客户端SocketChannel是在事件(连接,读,写)发生后注册的,只关注读或者写事件
channel与selectionkey绑定
JAVA底层
注意:span style=\
SelectionKey
0 条评论
下一页
为你推荐
查看更多