Post

Multiplexing

1. 멀티플렉싱

“멀티플렉싱(Multiplexing)”은 하나의 통신 채널이나 리소스를 여러 사용자나 신호가 동시에 공유할 수 있게 해주는 기술을 말한다. 보통 통신, 네트워크, 데이터 전송 분야에서 사용된다.

멀티플렉싱의 목적

  • 리소스 효율성: 제한된 대역폭이나 채널을 더 효율적으로 사용
  • 비용 절감: 물리적인 채널 수를 줄일 수 있어 비용 절감
  • 동시성 향상: 여러 데이터 스트림을 동시에 전송 가능

주요 멀티플렉싱 종류

종류설명
FDM (주파수 분할 멀티플렉싱)서로 다른 주파수 대역을 사용하는 방식. 아날로그 통신에서 많이 사용. (예: 라디오 방송)
TDM (시간 분할 멀티플렉싱)시간 슬롯을 나누어 각 사용자에게 순차적으로 할당. 디지털 통신에서 사용. (예: 디지털 전화)
WDM (파장 분할 멀티플렉싱)광섬유 통신에서, 서로 다른 파장을 사용해 데이터 전송.
CDM (코드 분할 멀티플렉싱)각 사용자가 고유한 코드로 데이터를 전송. 여러 사용자가 동시에 같은 채널 사용 가능. (예: CDMA 휴대폰)

소프트웨어/운영체제 관점에서의 멀티플렉싱

멀티플렉싱은 파일 디스크립터나 소켓을 관리할 때도 쓰인다.

  • select(), poll(), epoll() 같은 시스템 호출을 통해 여러 입출력 이벤트를 감지
  • 네트워크 서버에서 다수의 클라이언트를 하나의 스레드로 관리할 때 유용

실생활 예시

  • IPTV: 여러 채널을 한 선에서 시청 가능 (FDM, TDM 사용)
  • 인터넷: 여러 사용자 데이터가 하나의 회선을 통해 동시에 전송
  • Zoom/Teams 같은 화상회의 앱: 여러 영상/음성 스트림을 하나의 연결로 처리

소프트웨어/운영체제에서의 멀티플렉싱

소프트웨어/운영체제 관점에서 멀티플렉싱(Multiplexing)은 주로 입출력(I/O) 자원, 특히 파일 디스크립터(File Descriptor)소켓(Socket) 등의 비동기 I/O를 효율적으로 관리하기 위해 사용된다. 즉, 하나의 프로세스(또는 스레드)가 동시에 여러 I/O를 Non-blocking 방식으로 다루는 기술이다.

왜 멀티플렉싱이 필요한가?

운영체제에서 I/O는 기본적으로 블로킹(blocking)이다. 예를 들어, 소켓에서 데이터를 읽으려는데 데이터가 안 오면 프로그램은 거기서 멈추게 된다.

이 문제를 해결하려면 두 가지 방식이 있다:

  1. 멀티스레드/멀티프로세스 방식
    • 연결당 하나의 스레드나 프로세스를 만듦
    • 자원 소비가 크고 병목이나 동기화 이슈 발생 가능
  2. I/O 멀티플렉싱 방식
    • 하나의 스레드로 여러 I/O 이벤트를 감지 및 처리
    • 고성능 서버(예: Nginx, Node.js)에서 주로 사용

대표적인 I/O 멀티플렉싱 기법 (리눅스/유닉스 기준)

함수설명특징
select()가장 오래된 방식, 지정된 파일 디스크립터 집합에서 이벤트 감지최대 FD 수 제한 있음 (보통 1024)
poll()select 개선 버전, FD 수 제한 없음매번 모든 FD 확인해야 해 성능 저하 가능
epoll()리눅스 전용, 이벤트 기반높은 성능, 대규모 서버에서 많이 사용
kqueue()BSD/맥 전용epoll과 비슷한 고성능 멀티플렉싱
IOCP윈도우 전용 I/O 완료 포트 모델비동기 처리에 최적화됨

epoll 동작 방식 간단 요약

1
2
3
int epfd = epoll_create(1); // epoll 인스턴스 생성
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event); // 관심 있는 FD 등록
epoll_wait(epfd, events, MAX_EVENTS, timeout); // 이벤트 대기
  • 등록된 FD들 중 실제 이벤트가 발생한 것만 반환
  • O(1) 성능으로 매우 빠름

사용 예시: 네트워크 서버

1
2
3
4
// 1. 서버 소켓 생성 및 listen
// 2. epoll에 서버 소켓 등록
// 3. epoll_wait()로 클라이언트 접속/데이터 수신 감지
// 4. 감지된 이벤트 기반으로 처리
  • Node.js는 내부적으로 libuv를 사용하며, epoll, kqueue, IOCP 등을 추상화하여 사용한다.
  • Nginx는 event-driven + epoll 구조로 매우 가볍고 빠르다.
This post is licensed under CC BY 4.0 by the author.