BIO & NIO 线程模型&底层的epoll交互
2022-03-27 11:14:31 1 举报
BIO & NIO 线程模型&底层的epoll交互
作者其他创作
大纲/内容
channel注册完后的selectionKey与channel绑定
注册
调用linux系统的内核函数epoll_create来创建实例
创建EPoll实例,用文件描述符epdf表示
SelectorProvider.provider()
buffer
Thread
创建epoll实例
ServerSocketChannel
linux系统下DefaultSelectorProvider的实现
IO代码里read操作是阻塞操作,如果连接不做读写,会导致线程阻塞,浪费资源
就绪事件列表rdlist
DefaultSelectorProvider.create()
EpollSelectorProvider.openSelector()
9000
监听
epoll_waite()
这一步才是真正注册
Selector.open()创建多路复用器
client
Java_sun_nio_ch_EPollArrayWrapper_epollCreate
updateRegistrations()
epollCtl
SocketChannel
Server
调用native的epollWait方法等待
SelectionKey
NIO与linux内核函数的重要三个方法
Java_sun_nio_ch_EPollArrayWrapper_epollCtl
epdf = epollCreate
selector(多路复用器)
pollWrapper.add(fd)
同步阻塞模型,一个客户端连接对应一个处理线程
NIO
BIO
进行事件绑定
epfd = epoll_create(256)
selector.select()堵塞等待事件
SelectorImpl#select
pollWrapper.poll(timeout)
进行事件的绑定
EPollSelectorImpl.doSelect
SelectorImpl#register
EPollSelectorImpl.implRegister
new EPollArrayWrapper()
将fd放入内部集合里
同步非阻塞,服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到多路复用器selector上,多路复用器轮询到连接有IO请求就进行处理,JDK1.4开始引入。
Java_sun_nio_ch_EPollArrayWrapper_epollWait
注册与客户端建立连接
返回selector对象
new EPollSelectorImpl(this)
调用native的epollCreate方法
epoll_ctl
0 条评论
回复 删除
下一页