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)이다. 예를 들어, 소켓에서 데이터를 읽으려는데 데이터가 안 오면 프로그램은 거기서 멈추게 된다.
이 문제를 해결하려면 두 가지 방식이 있다:
- 멀티스레드/멀티프로세스 방식
- 연결당 하나의 스레드나 프로세스를 만듦
- 자원 소비가 크고 병목이나 동기화 이슈 발생 가능
- 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.