IO多路复用:Reactor模式与epoll原理

引言 Redis单线程却能处理10000+并发连接,秘密就在于IO多路复用(I/O Multiplexing)。今天我们深入理解这个高并发的核心机制。 一、什么是IO多路复用? 核心思想: 一个线程监听多个文件描述符(socket连接),哪个准备好就处理哪个 传统阻塞I/O: 线程1 → 监听客户端1 → 阻塞等待 线程2 → 监听客户端2 → 阻塞等待 ... 线程N → 监听客户端N → 阻塞等待 IO多路复用: 线程1 → 监听所有客户端 → 有事件就处理,没事件就等待 二、三种实现:select、poll、epoll 2.1 select(最古老,1983年) fd_set readfds; FD_ZERO(&readfds); FD_SET(fd1, &readfds); FD_SET(fd2, &readfds); select(max_fd + 1, &readfds, NULL, NULL, NULL); // 缺点: // 1. fd数量限制(默认1024) // 2. 需要遍历所有fd检查哪个就绪(O(n)) // 3. 每次调用需要拷贝fd_set到内核 2.2 poll(1997年) struct pollfd fds[N]; fds[0].fd = fd1; fds[0].events = POLLIN; poll(fds, N, -1); // 改进:无fd数量限制 // 缺点:仍需遍历所有fd(O(n)) 2.3 epoll(Linux 2.6,2002年) // 1. 创建epoll实例 int epfd = epoll_create(1); // 2. 添加监听的fd struct epoll_event ev; ev.events = EPOLLIN; ev.data.fd = fd1; epoll_ctl(epfd, EPOLL_CTL_ADD, fd1, &ev); // 3. 等待事件 struct epoll_event events[MAX_EVENTS]; int n = epoll_wait(epfd, events, MAX_EVENTS, -1); // 优势: // ✅ O(1)时间复杂度(只返回就绪的fd) // ✅ 无fd数量限制 // ✅ 无需每次拷贝fd列表 性能对比: ...

2025-01-21 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...