Multiplexing
멀티플렉싱이란
멀티플렉싱은 하나의 자원이나 채널을 여러 작업이 번갈아 또는 함께 사용할 수 있게 만드는 방식이다. 통신에서는 하나의 회선을 여러 신호가 공유하는 의미로 쓰이고, 운영체제에서는 하나의 스레드나 프로세스가 여러 I/O 대상을 효율적으로 감시하는 의미로 자주 등장한다.
핵심은 제한된 자원을 더 잘 나눠 쓰는 것이다.
운영체제에서 왜 중요한가
네트워크 서버를 생각해 보면, 동시에 수많은 소켓이 열려 있어도 실제로 매 순간 읽거나 쓸 데이터가 있는 소켓은 일부뿐이다. 연결마다 스레드를 하나씩 두면 문맥 전환과 메모리 비용이 빠르게 커진다.
그래서 운영체제는 다음과 같은 I/O 멀티플렉싱 도구를 제공한다.
selectpollepollkqueue
이 도구들은 “어떤 파일 디스크립터에 이벤트가 발생했는가”를 한 번에 알려준다.
대표 방식
select
오래된 방식이다. 구조는 단순하지만 감시 가능한 파일 디스크립터 수와 성능 측면에서 제약이 있다.
poll
select의 한계를 일부 보완했지만, 여전히 매번 전체 대상을 훑는 비용이 있다.
epoll
리눅스에서 많이 쓰이는 방식이다. 관심 대상을 등록해 두고, 실제 이벤트가 발생한 것만 효율적으로 돌려받을 수 있다. 고성능 네트워크 서버에서 사실상 표준에 가깝다.
멀티플렉싱과 멀티스레딩의 차이
둘은 대체 관계라기보다 조합 관계에 가깝다.
- 멀티스레딩: 실행 흐름을 여러 개 둔다.
- 멀티플렉싱: 하나의 흐름이 여러 I/O 대상을 효율적으로 감시한다.
예를 들어 이벤트 루프 기반 서버는 한 스레드 안에서 멀티플렉싱을 사용하고, CPU 연산이나 블로킹 작업은 별도 스레드 풀로 넘길 수 있다.
실무에서 보는 포인트
- 연결 수가 많은가
- 대부분이 I/O 대기 상태인가
- 요청당 작업이 짧고 빠른가
- 블로킹 작업을 분리할 수 있는가
이 조건이 맞을수록 멀티플렉싱 기반 구조가 강해진다.
정리
멀티플렉싱은 “하나로 여러 개를 다루는 방법”이다. 운영체제와 네트워크 프로그래밍에서는 특히 많은 I/O 대상을 적은 스레드로 효율적으로 처리하기 위한 핵심 개념이다.
댓글
아직 댓글이 없습니다