0Pricing
C++ Academy · 강의

epoll과 kqueue를 활용한 비동기 IO

Linux에서는 epoll을, BSD 또는 macOS에서는 kqueue를 사용해 많은 연결을 처리합니다.

epoll과 kqueue를 활용한 비동기 IO은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

비동기 I/O를 사용하는 이유

연결마다 스레드를 하나씩 사용하는 방식은 수천 또는 수백만 개의 클라이언트로 확장되지 않습니다. 비동기 I/O를 사용하면 한 스레드가 여러 소켓을 처리하면서 그중 읽기 또는 쓰기가 가능해지는 소켓을 기다릴 수 있습니다.

Linux: epoll

Linux의 확장 가능한 이벤트 API입니다. 파일 기술자를 epoll 인스턴스에 추가하고, 그중 어느 기술자에서든 이벤트가 발생하기를 기다립니다.

#include <sys/epoll.h>
int epfd = epoll_create1(0);
epoll_event ev{};
ev.events = EPOLLIN;
ev.data.fd = sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, sock, &ev);

이벤트 대기

epoll_wait는 이벤트를 사용할 수 있을 때까지 대기한 다음 준비된 기술자를 반환합니다.

epoll_event events[64];
int n = epoll_wait(epfd, events, 64, -1);
for (int i = 0; i < n; ++i) {
    int fd = events[i].data.fd;
    handle_io(fd);
}

에지 트리거와 수준 트리거

두 가지 모드가 있습니다:

  • 수준 트리거(기본값) — 조건이 유지되는 동안 epoll이 계속 보고합니다
  • 에지 트리거(EPOLLET) — 상태가 변경될 때만 보고하므로 매번 소켓을 완전히 비워야 합니다

macOS와 BSD: kqueue

kqueue는 epoll에 해당하는 BSD의 기능이며 macOS에서도 사용할 수 있습니다. 개념적으로는 비슷하지만 API는 다릅니다.

#include <sys/event.h>
int kq = kqueue();
struct kevent ev;
EV_SET(&ev, sock, EVFILT_READ, EV_ADD, 0, 0, nullptr);
kevent(kq, &ev, 1, nullptr, 0, nullptr);

Windows: IOCP

Windows는 epoll/kqueue의 준비 상태 모델 대신 완료 기반 모델을 사용하는 I/O 완료 포트(IOCP)를 사용합니다. 즉, 작업이 완료되었을 때 알림을 보냅니다.

비차단 소켓

fcntl(fd, F_SETFL, O_NONBLOCK)을 사용하여 소켓을 비차단 방식으로 설정합니다. 그렇지 않으면 읽기와 쓰기가 전체 이벤트 루프를 차단할 수 있습니다.

이벤트 루프 패턴

영원히 실행되는 반복 처리입니다:

  1. 준비된 이벤트를 기다립니다
  2. 각 이벤트에 대해 차단될 때까지 I/O를 수행합니다
  3. 반복합니다

많은 클라이언트 처리

하나의 epoll 스레드로 수만 개의 동시 연결을 처리할 수 있습니다. 이것이 C10K 문제입니다. 최신 시스템은 수백만 개까지 확장합니다.

일반적인 주의점

다음 사항에 주의합니다:

  • 비차단 모드 설정을 잊는 경우
  • 소켓을 비우지 않고 에지 트리거를 사용하는 경우
  • 닫힌 FD를 epoll 집합에서 제거하지 않는 경우
  • 연결마다 버퍼가 누수되는 경우

상위 수준 래퍼

epoll 반복 처리를 직접 작성하면 오류가 발생하기 쉽습니다. 운영 코드에서는 libuv, libevent 또는 Boost.Asio를 사용합니다. 이러한 라이브러리는 플랫폼별 차이를 추상화하고 테스트된 I/O 반복 처리를 제공합니다.

비동기 방식과 스레드 방식

비동기 I/O는 더 잘 확장되지만 작성하기는 더 어렵습니다. 수천 개 정도의 연결을 처리하는 서버라면 연결마다 스레드를 사용하는 모델이 더 간단합니다. 예상되는 부하를 기준으로 선택합니다.

빠른 확인

epoll의 에지 트리거 모드와 수준 트리거 모드의 차이는 무엇인가요?

복습

비동기 I/O는 하나의 스레드에서 많은 소켓을 처리하여 대규모 동시 접속으로 확장됩니다. Linux는 epoll을 사용하고, BSD/macOS는 kqueue를 사용하며, Windows는 IOCP를 사용합니다. 소켓을 비차단 방식으로 설정합니다. 운영 환경에서는 이벤트 루프를 직접 작성하는 대신 라이브러리(Asio, libuv, libevent)를 사용합니다.

자주 묻는 질문

“epoll과 kqueue를 활용한 비동기 IO” 강의는 무료인가요?

네 — “epoll과 kqueue를 활용한 비동기 IO” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“epoll과 kqueue를 활용한 비동기 IO”에서 뭘 배우나요?

Linux에서는 epoll을, BSD 또는 macOS에서는 kqueue를 사용해 많은 연결을 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C++ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“epoll과 kqueue를 활용한 비동기 IO” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. C++의 BSD 소켓 API
  2. TCP 에코 서버 만들기
  3. epoll과 kqueue를 활용한 비동기 IO
  4. 현대적인 비동기 IO에 Boost Asio 사용하기
← C++ Academy(으)로 돌아가기