多路复用

Java NIO(一)select 和 epoll底层实现原理

2019-07-20  本文已影响0人  清雨季

一 内核接受网卡流量的整个流程

预备知识:

网卡接收流量的流程:

上面的流程有一个问题:
revc函数只能监控一个socket,并且会导致进程一直阻塞在这个socket中,直到socket中有数据返回为止。如果有多个socket监控,则需要创建多个进程,非常浪费资源。

而select和epoll就解决了上面的问题,它们让一个进程可以监控多个socket,下面分别说一下两个函数的实现细节。

二 select的实现细节

select一次监控多个socket的原理很简单:

通过上述的方式,select函数实现了在一个进程中监控多个socket的方法。但是这函数的性能并不高,因为它需要重复把进程从所有的socket中加入/移除。因此它监控的socket数量不能太多,底层规定不能超过1024个。

epoll函数针对select的这个缺陷作了改进,接下来说说epoll函数的实现细节。

三 epoll函数的实现细节

当进程调用epoll监控多个socket时,会在底层创建一个eventpoll对象,这个对象中包含一个重要的队列:就绪队列

epoll针对select优化的点:

上一篇下一篇

猜你喜欢

热点阅读