I/O 멀티플렉싱 서버란?

멀티 플렉싱

- 하나의 통신채널을 통해서 둘 이상의 데이터를 전송하는데 사용되는 기술

 

다중서버 멀티플렉싱 서버

- 하나의 프로세스를 통해 여러개의 클라이언트들과 통신하는 방식

- 클라이언트와 서버간의 송수신 데이터 용량이 작은 경우

- 송수신이 연속적이지 않은 경우

- 많은 수의 클라이언트를 처리할 경우

 

Select() 함수

- 하나의 스레드로 여러 소켓의 "사건-이벤트"를 한꺼번에 처리할 수 있는 모델

- 소켓 함수 호출이 성공할 수 있느 시점을 미리 알수있다.

블로킹 소켓 : 소켓 함수 호출 시 조건이 만족되지 않아 블로킹되는 상황을 막을 수 있다.

넌블로킹 소켓 : 소켓 함수 호출 시 조건이 만족되지 않아 나중에 다시 호출해야하는 상황을 막을 수 있다.

장점

- 하나의 스레드로 여러 소켓이 블록되는 것을 막을 수 있다

- UNIX와 윈도우 소켓이 모두 지원하는 모드이므로 두 운영체제에 호환되는 소켓 코드를 구현 할 수있다.

단점

- select함수 자체가 '사건-이벤트'가 발생하기 전까지 블록된다.

- 대기할 수 있는 소켓 개수는 디폴트 64 최대 1024개이고 소켓이 많아지면 비례하여 스레드 수가 증가해야 한다

- 하나의 사건이 발생하면 사건이 발생한 소켓을 찾기 위해 내부적으로 루프 구조를 사용하여CPU 자원을 많이 소모한다

 

 

<-- select() 함수 호출 전 소켓 셋 상태

읽기 셋에 두개의 소켓이 대기

쓰기 셋에 두개의 소켓이 대기

예외 셋에 한개의 소켓이 대기

 

 

<-- select() 함수 호출 후 소켓 셋 상태

하나의 소켓이 recv() 준비가 됨

두개의 소켓이 write() 준비가 됨

 

 

 

소켓셋 == 소켓 디스크립터의 집합

recv() 함수를 호출하고 싶으면 읽기 셋에 넣고

send() 함수를 호출하고 싶으면 쓰기 셋에 넣으면 된다.

1. select() 함수를 호출하면 소켓셋에 포함된 소켓이 입출력을 위한 준비가 될 때가지 대기

2. 적어도 한 소켓이 준비되면 select() 함수는 리턴

3. 소켓셋에는 입출력이 가능한 소켓만 남고 나머지는 모두 제거된다.

 

select() 함수

select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout);

nfds : 유닉스/린눅스와의 호환성을 위해 존재 윈도우에서는 무시

readfds, writefds, exceptfds : 각각 읽기 셋, 쓰기 셋, 예외 셋을 나타낸다 사용하지 않으면 NULL 값

timeout : seconds, microseconds 단위로 타임아웃을 지정 이 시간이 지나면 select() 함수는 무조건 리턴

 

집합 정의(읽기 셋)

FD_SET rset = {0};

읽기 셋에 sock 넣기

FD_SET(sock, &rset);

FD_SET(sock2, &rset);

매크로 내용
FD_ZERO(fd_set* set) set의 소켓을 모두 비운다.
FD_SET(SOCKET s, fd_set* set) set에 소켓 s를 넣는다.
FD_CLR(SOCKET s, fd_set* set) set에서 소켓 s를 제거한다.
FD_ISSET(SOCKET s, fd_set* set) sset에 소켓 s가 들어있으면 0이 아닌 값을 반환, 그렇지 않으면 0을 반환

 

select() 함수를 사용 주의점

select() 함수에 사용할 fd_set 변수를 복사하여 원본은 유지하고 복사본을 사용한다.

fd_set에 사건-이벤트가 발생하지 않으면 fd_set의 소켓이 제거되고 fd_set 설정을 다시 해주어야한다

이 과정을 줄이기 위해  복사본을 사용한다.

 

 

'서버 공부 > TCP IP 윈도우 소켓 프로그래밍' 카테고리의 다른 글

멀티 스레드 서버  (0) 2022.02.09
멀티 프로세스 서버  (0) 2022.02.02
다중 접속 서버  (0) 2022.02.02
TCP / UDP 차이  (0) 2022.02.02
1장 - 1. TCP/IP 프로토콜 개요  (0) 2015.11.23

+ Recent posts