优秀的编程知识分享平台

网站首页 > 技术文章 正文

Java面试八股文Netty网络编程,select

nanyue 2024-11-03 14:06:37 技术文章 6 ℃

Java面试八股文Netty网络编程,select、poll、epoll的区别select?(windows)

**poll **(linux)本质上和select没有区别,查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。

**epoll **支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

Epoll空轮询漏洞在 JDK 中, Epoll 的实现是存在漏洞的,即使 Selector 轮询的事件列表为空,NIO 线程一样可以被唤醒,导致 CPU 100% 占用。

实际上 Netty 并没有从根源上解决该问题,而是巧妙地规避了这个问题。long time = System.nanoTime()

;if (

//*事件轮询的持续时间

//大于等于 timeoutMillis*/) {

selectCnt = 1;

} else if (

//不正常的次数 selectCnt

//达到阈值 512*/) {

//重建Select并且SelectionKey

// 重新注册到新Selector上

selector = selectRebuildSelector(selectCnt);

}

NioEventLoop 线程的可靠性至关重要,一旦 NioEventLoop 发生阻塞或者陷入空轮询,就会导致整个系统不可用。

最近发表
标签列表