-
TCP/IP 소켓 프로그래밍 - 12장 : IO 멀티플렉싱 ( Multiplexing )네트워크 2024. 6. 23. 23:18
12장12-1 IO 멀티플렉싱 기반의 서버
멀티프로세스 기반의 방식의 단점은 다음과 같다.
- 프로세스마다 별도의 메모리 공간을 유지하기 때문에,
- 프로세스 생성을 위한 overload가 크다.
멀티플렉싱 기반의 서버는
프로세스의 생성없이 다수의 클라이언트에게 서비스를 제공할 수 있다.
멀티플렉싱은 물리적 장치의 효율성을 위해서,
최소한의 물리적 요소로 최대한의 데이터를 전달하려는 데 사용되는 기술을 말한다.

책에서 예시로 종이컵 전화기를 들었다.
3인이 동시에 소통하기 위해서는,
말할 때도 2개의 컵을 가져다 대야하고, 들을 때도 2개의 컵을 동시에 가져다 대야 한다.
종이컵 전화기에 멀티플렉싱 기술을 도입하면 아래와 같다.

물리적 장치의 효율성이 증가한 상황이다. (실 길이, 컵 개수 감소)


멀티플렉싱이 적용된 서버 클라이언트의 수에 상관없이,
서비스를 제공하는 프로세스(서버)의 수는 하나다.
12-2 select 함수의 이해와 서버의 구현
select 함수를 사용하면 여러 개의 파일 디스크립터를 모아 동시에 이들을 관리할 수 있다.
주로 관리하는 이벤트는 아래와 같다.
- 수신데이터를 가진 소켓 존재 여부
- 블로킹되지 않고 데이터 전송 가능한 소켓은 무엇인지
- 예외상황이 발생한 소켓은 무엇인지
select 함수는
- 파일 디스크립터 설정, 검사 범위 지정, 타임아웃 설정
- select 함수 호출
- 호출 결과 확인
순으로의 과정을 지켜야 한다.

여러개의 파일 디스크립터를 관찰할 때는
수신, 전송, 예외같은 관찰 항목에 따라 구분해서 모아 관리한다.
fd_set 형 변수는 비트단위의 배열로
파일 디스크립터를 세 묶음으로 묶어 관리할 때 사용된다.
fd_set을 위한 매크로들로는
- FD_ZERO : 모든 비트를 0으로 초기화
- FD_SET : 파일 디스크립터 정보 등록 ( 1로 세팅 )
- FD_CLR : 파일 디스크립터 정보 삭제 ( 0로 세팅 )
- FD_ISSET : 파일 디스크립터 정보가 있으면 ( 비트값이 1이면 ) 양수 반환
FD_ISSET은 select 함수의 호출 결과를 확인하는데 사용된다.

select 함수는 다음과 같이 생겼다.
#include <sys/select.h> #include <sys/time.h> int select( int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval * timeout ); //성공 시 0이상 , 실패 시 -1 반환 //maxfd : 검사 대상이 되는 파일 디스크립터 수 //readset : '수신된 데이터 존재여부'가 궁금한 파일 디스크립터정보 리스트가 담긴 변수 주소값 //writeset : '블로킹 없는 데이터 전송 가능여부'가 궁금한 FD 정보 리스트가 담긴 변수 주소값 //exceptset : '예외 발생 여부'가 궁금한 FD 정보 리스트가 담긴 변수 주소값 //timeout : select함수 호출 이후 무한정 블로킹 상태에 빠지지 않도록 함. // 오류 발생 시 -1, 타임 아웃으로 인한 리턴 시 0, 관심등록한 fd에 변화가 생기면 // 그 변화가 생긴 파일디스크립터 수 반환select함수는 관찰중인 파일 디스크립터에 변화가 생겨야 반환을 하며,
변화가 생기지 않으면 무한정 블로킹 상태가 될 수 있다.
이를 막기 위해서는, 타임아웃을 지정해주어야 한다.
struct timeval { long tv_sec; long tv_usec; } //timeout을 위한 자료형 . 이 자료형의 주소값을 select함수의 인자로 전해주면 된다.select함수 호출완료 이후,
전달된 fd_set형 변수에는 변화가 발생한 파일디스크립터만 비트가 1로 남고
나머지는 모두 0으로 바뀐다.
아래는 책에 나온 select함수 예제 실행 결과이다.

아래는 멀티플렉싱으로 구현된 서버와 다수 클라이언트끼리의 데이터 송수신 결과이다.

'네트워크' 카테고리의 다른 글
TCP/IP 소켓 프로그래밍 - 14장 : 멀티캐스트 & 브로드캐스트 (0) 2024.06.25 TCP/IP 소켓 프로그래밍 - 13장 : 다양한 입출력 함수들 (0) 2024.06.24 TCP/IP 소켓 프로그래밍 - 11장 : 프로세스간 통신 (0) 2024.06.21 TCP/IP 소켓 프로그래밍 - 10장 : 멀티프로세스 기반의 서버 구현 (0) 2024.06.20 TCP/IP 소켓 프로그래밍 - 9장 : 소켓의 다양한 옵션 (0) 2024.06.19