外贸网站建设需要注意什么,html可以做网站分页,wordpress 付费查看,电子商务网站的特点面试官的心思猜不透#xff0c;先把epoll的原理装进脑子里吧。 以下为知识星球 录友分享的徐工研究院一面问题epoll为什么比select/poll高效#xff1f;#xff08;下文知识拓展部分提供了演示图例) 简要回答 epoll高效的核心原因#xff1a; 事件驱动…面试官的心思猜不透先把epoll的原理装进脑子里吧。以下为知识星球 录友分享的徐工研究院一面问题epoll为什么比select/poll高效下文知识拓展部分提供了演示图例)简要回答epoll高效的核心原因事件驱动只返回就绪的文件描述符无需遍历所有fd内核回调通过回调机制通知就绪事件O(1)时间复杂度共享内存避免用户空间和内核空间的数据拷贝水平触发与边缘触发提供更灵活的事件通知模式详细回答三种I/O多路复用机制对比select 的问题线性扫描每次调用需要遍历所有fdO(n)时间复杂度fd_set大小限制通常1024个文件描述符内存拷贝每次调用都需要在用户空间和内核空间拷贝fd_set重复初始化每次调用后需要重新设置监控的fdpoll 的改进链表结构突破1024限制使用pollfd数组但仍有性能问题仍然需要遍历所有fdO(n)时间复杂度内存拷贝同样需要拷贝整个pollfd数组epoll 的高效设计 红黑树存储高效的fd管理插入删除O(log n)就绪链表只返回就绪的fd无需遍历所有fd事件回调内核通过回调机制直接通知就绪事件内存共享epoll_ctl和epoll_wait共享内核数据结构边缘触发避免重复通知提高性能epoll 核心原理epoll_create创建epoll实例返回epoll文件描述符epoll_ctl向epoll实例中添加/修改/删除监控的fdepoll_wait等待I/O事件发生只返回就绪的fd列表代码示例public: bool start(int port) { // 创建服务器socket server_fd socket(AF_INET, SOCK_STREAM, 0); if (server_fd 0) returnfalse; // 设置端口复用 int opt 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt)); // 绑定地址 sockaddr_in addr{}; addr.sin_family AF_INET; addr.sin_port htons(port); addr.sin_addr.s_addr INADDR_ANY; if (bind(server_fd, (sockaddr*)addr, sizeof(addr)) 0) { close(server_fd); returnfalse; } // 监听 if (listen(server_fd, 128) 0) { close(server_fd); returnfalse; } // 创建epoll实例 epoll_fd epoll_create1(0); if (epoll_fd 0) { close(server_fd); returnfalse; } // 添加服务器socket到epoll epoll_event ev{}; ev.events EPOLLIN; // 监听可读事件 ev.data.fd server_fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, ev) 0) { close(epoll_fd); close(server_fd); returnfalse; } returntrue; }知识拓展水平触发 vs 边缘触发水平触发LTfd就绪时持续通知直到数据被处理完 编程更简单不容易遗漏事件 可能产生不必要的重复通知边缘触发ET只在fd状态变化时通知一次 需要一次性处理完所有数据 性能更高但编程更复杂 必须使用非阻塞I/Oepoll 的局限性仅限LinuxWindows不支持文件描述符类型限制不支持普通文件内存占用每个epoll实例需要内核资源小连接数场景可能不如select/poll高效使用场景高并发网络服务器Web服务器、游戏服务器实时通信系统聊天服务器、视频会议代理服务器Nginx、HAProxy数据库连接池管理大量数据库连接文件服务器处理大量文件I/O任何需要处理大量并发连接的场景知识图解面试官很能追问Q1epoll的边缘触发模式为什么要用非阻塞I/OA1 边缘触发只通知一次必须一次性读取所有可用数据如果使用阻塞I/O读取时可能会阻塞导致其他fd饿死非阻塞I/O确保读取到EAGAIN/EWOULDBLOCK时立即返回避免进程阻塞保证所有就绪fd都能及时处理Q2epoll如何避免惊群效应A2惊群效应多个进程/线程等待同一个fd事件发生时全部被唤醒解决方案 EPOLLEXCLUSIVE标志Linux 4.5确保只有一个epoll实例被唤醒SO_REUSEPORT内核级别负载均衡应用层同步使用互斥锁控制只有一个worker处理连接单线程accept 多线程处理Q3epoll和select的文件描述符限制A3 selectFD_SETSIZE限制通常1024编译时确定poll理论上无限制但性能随fd数量线性下降epoll只与系统内存有关通常支持数十万fd 查看限制cat /proc/sys/fs/file-maxhttps://mp.weixin.qq.com/s/AX1oyW_RbQTwWo7uNSOyPA