서버

이벤트 루프 vs 블로킹 멀티쓰레드

_soboro 2025. 9. 3. 11:25

이벤트 루프 개념

  • I/O 이벤트 등록: 관심 있는 FD(파일 디스크립터)와 어떤 이벤트(읽기/쓰기)를 감시할지 커널에 등록 (epoll_ctl 등)
  • 대기: epoll_wait 같은 호출로 등록된 FD 집합에 이벤트가 생길 때까지 블록
  • 처리: 이벤트가 발생하면 깨어나서 해당 FD에 대한 작업 수행
  • 반복: 처리가 끝나면 다시 대기 단계로 돌아가 루프를 반복

특징

  • 소수의 스레드로 다수의 연결 처리: 한 이벤트 루프 스레드가 수천 개의 FD를 감시 가능
  • 논블로킹 방식: 이벤트가 준비된 것만 처리하므로 CPU 사용 효율적
  • 콜백/핸들러 구조: 각 이벤트마다 지정된 콜백 함수 실행

요약

  • 이벤트 루프 = I/O 이벤트 감시 + 처리의 반복 구조
  • 단일 스레드에서도 다수 FD 처리 가능 → 스레드-당-연결 구조보다 효율적

블로킹 멀티스레드에서의 read/write 동작

  • read(): 스레드가 호출하면 해당 FD에 읽을 데이터가 도착할 때까지 커널에서 블록됨. 데이터가 도착하면 커널이 유저 공간 버퍼에 복사 후 반환.
  • write(): 쓰기 버퍼에 여유가 있을 때만 즉시 전송. 버퍼가 가득 차면 공간이 생길 때까지 해당 스레드가 커널에서 블록됨.
  • 특징: 각 스레드는 보통 하나의 FD만 전담해 read/write를 수행하고, 해당 호출에서 블록되는 동안 다른 FD는 전혀 처리하지 못함.

특징

  • 소수의 스레드로 다수의 연결 처리(이벤트 루프)와 달리, 블로킹 멀티스레드는 연결 수만큼 스레드 필요
  • 스레드-당-연결 구조는 구현이 단순하지만, 연결 수가 많아지면 스레드 수 증가로 인한 메모리·컨텍스트 스위치 비용이 커짐

요약

  • 이벤트 루프 = I/O 이벤트 감시 + 처리의 반복 구조
  • 블로킹 멀티스레드 = 각 스레드가 하나의 FD를 read/write로 전담