[Network기초] 3. 멀티플렉싱
멀티플렉싱 기반의 다중 접속 서버
- 입출력 다중화란 하나의 프로로세스 혹은 스레드에서 입력과 출력을 모두 다룰 수
있는 기술을 의미한다.
- 커널에서는 **하나의 스레드가 여러 개의 소켓(파일)을 핸들링할 수 있는
select
,poll
,epoll
과 같은 시스템 콜을 제공한다
- 커널에서는 **하나의 스레드가 여러 개의 소켓(파일)을 핸들링할 수 있는
select
, poll
, epoll
select
- select방식은 이벤트(입력|출력|에러)별로 감시할 파일들을 fd_set이라는 파일 상태
테이블(fd 비트 배열)에 등록하고, 등록된 파일(파일 디스크립터)에 어떠한 이벤
트가 발생했을 경우 fd_set을 확인하는 방식으로 동작한다
예를 들어 6개의 파일을 다루어야 한다고 했을 때, 6개의 파일에 대한 입출력 데 이터가 준비될 때까지 이벤트를 기다리는 파일 상태 테이블을 준비한다. 그 후 6개 의 파일 중 입출력이 준비된 파일에 대해서 이벤트가 발생하면 이벤트가 발생한 파 일 디스크립터의 수를 반환한다. 이후 이벤트가 준비된 파일에 대해 입출력을 수행 하는ㅇ데 이미 데이터가 준비된 파일에 대해 입출력을 수행하기 때문에 봉쇄가 발생 하지 않을 것이라는게 보장된다
- 장점
- 단일 프로세스(스레드)에서 여러 파일의 입출력 처리가 가능
- 지원하는 OS가 많아 이식석이 좋음(POSIX 표준)
- 단점
- 커널에 의해서 완성되는 기능이 아닌, 순수하게 함수에 의해 완성되는 기능이다
- select 함수의 호출을 통해서 전달된 정보는 커널에 등록되지 않은 것이며, 그래 서 select함수를 호출할 때마다 매번 관련 정보를 전달해야 한다
- select 함수의 호출 결과 이벤트가 발생한 파일 디스크립터의 개수이기 때문에 어 떤 파일 디스크립터에서 이벤트가 발생했는지 확인하기 위해서는 fd_set테이블 전체를 감시해야 한다
- 검사할 수 있는 fd개수에 재한이 있다 (최대 1024개)
- select호출 때마다 데이터를 복사해야 한다(select함수를 호출한 후 이벤트를 처리할 때 fd_set테이블 변경이 필요하기 때문에 미리 복사가 필요하다)
poll
- poll도 select와 마찬가지로 멀티플렉싱을 구현하기 위한 방법 중 하나이다
-
poll이 여러 개의 파일을 다루는 방법은 select와 마찬가지로 fd(파일 디스크립터)의 이벤트를 기다리다가 이벤트가 발생하면, poll에서의 block이 해제되고, 다음 루틴에서 fd에 어떤 이벤트가 발생했는지 검사하는 방식을 사용한다
- 장점
- select와 단일 프로세스(스레드)에서 여러 파일의 입출력 처리가 가능하다
-
select방식처럼 표준 입력 출력 에러를 따로 검사할 필요가 없다 - select는 timeval이라는 구조체를 사용해 타임아웃 값을 세팅하지만, poll은 별다른 구조체 없이 타임아웃 기능을 지원한다
- 단점
- 일부 unix시스템에서는 poll을 지원하지 않는다
epoll
- epoll은 select함수의 단점 극복을 위해 커널 레벨멀티플렉싱을 지원해준다
- 커널에 관찰대상에 대한 정보를 한 번만 전달하고, 관찰대상의 범위, 또는 내용에 변경이 있을 때만 변경 사항을 알려준다
- 리눅스에서는
epoll
, 윈도우에서는IOCP
, 맥에서는Kqueue
가 이에 해당한다 - 장점
- 상태변화의 확인을 위한, 전체 파일 디스크립터를 대상으로 하는 반복문이 필요없다
- select함수에 대응하는 epoll_wait함수 호출 시, 커널에서 상태정보를 유지하기 때문에 관찰대상의 정보를 매번 전달할 필요가 없다
- 단점
- 리눅스의 select기반 서버를 윈도우의 select기반 서버로 변경하는 것은 간단하나, 리눅스의 epoll기반 서버를 윈도우의 IOCP기반으로 변경하는 것은 select를 이용하는 것보다 번거롭다