epoll 동작 과정 시각화

사용자 프로세스 ↔ 리눅스 커널 ↔ 네트워크 소켓의 상호작용을 8단계로 살펴봅니다.

🧑‍💻 사용자 프로세스 (Node.js / Nginx 등)

// 1. epoll 인스턴스 생성 int epfd = epoll_create1(0); // 2. 감시할 소켓 등록 epoll_ctl(epfd, EPOLL_CTL_ADD, sock1, &ev1); epoll_ctl(epfd, EPOLL_CTL_ADD, sock2, &ev2); epoll_ctl(epfd, EPOLL_CTL_ADD, sock3, &ev3); // 3. 준비된 이벤트 대기 (블로킹) int n = epoll_wait(epfd, events, 64, -1); // 4. 준비된 fd만 처리 for (int i = 0; i < n; i++) { handle(events[i].data.fd); }

🌐 네트워크 (외부)

sock1 (fd=4)
sock2 (fd=5)
sock3 (fd=6)
대기 중
데이터 도착

⚙️ 리눅스 커널 — epoll 인스턴스

📋 감시 목록 (Watch List, Red-Black Tree)

아직 등록된 fd가 없습니다

✅ 준비됨 리스트 (Ready List)

아직 준비된 fd가 없습니다

🔔 동작 원리

1. epoll_ctl로 fd 등록 → 커널이 소켓의 wait queue에 콜백을 심음
2. NIC가 데이터 수신 → 소켓 버퍼에 채움 → 콜백 발동
3. 콜백이 해당 fd를 Ready List로 옮김
4. epoll_wait은 Ready List만 읽음 → O(준비된 개수)
시작하려면 다음 → 버튼을 누르세요.
Step 0 / 8