Erlang内核空间轮询:kqueue、epoll等是否为OS处理套接字默认行为
问题解答
关于kqueue、epoll是否为操作系统处理套接字的默认行为
不属于默认行为,二者的定位是用户态可用的IO多路复用接口,和操作系统内核本身的套接字处理逻辑是两层关系:
- 操作系统内核处理套接字的默认行为是自行维护套接字全生命周期状态,包括三次握手、连接队列管理、收发数据包缓存、状态变更通知等,这部分逻辑不管用户态有没有调用
kqueue/epoll都会正常运行。 kqueue、epoll、select、poll等同类型接口,是内核暴露给用户态的可选事件订阅接口,仅用于用户态程序需要同时监听大量套接字事件、实现高并发非阻塞IO的场景,如果用户态程序用阻塞式的recv/send处理套接字,完全不需要调用这类轮询接口。
关于Erlang网络驱动中未找到对应调用的原因
Erlang的平台相关轮询逻辑没有实现在上层TCP请求处理模块中,而是封装在虚拟机底层的跨平台IO抽象层里:
- Erlang/OTP底层有统一的异步事件抽象框架
erts_poll,编译阶段会自动适配当前操作系统,选择对应最优的轮询接口:Linux下绑定epoll、FreeBSD/macOS下绑定kqueue、Windows下绑定IOCP,上层网络驱动只会调用erts_poll的统一封装接口,不会直接调用平台相关的原生轮询函数,所以你在TCP处理源码中看不到直接调用。 - 如果你需要查看相关实现,可以检索Erlang虚拟机源码
erts/emulator/io/目录下的erts_poll_*.c系列文件,对应平台的底层轮询调用逻辑都在这部分代码中。
内容的提问来源于stack exchange,提问作者Abdelghani
相关产品推荐
相关产品推荐

