728x90

멀티 프로세스 -> 멀티 스레드

select -> epoll(리눅스), iocp(window)

 

멀티 프로세스 서버의 단점

- 프로세스의 빈번한 생성은 성능은 저하

- 멀티 프로세스의 흐름을 고려해서 구현해야 하기 때문에 구현이 쉽지 않다.

- 프로세스간 통신이 필요한 상황에서는 서버의 구현이 더 복잡해진다.

 

멀티 프로세스 서버의 대안

- 하나의 프로세스가 다수의 클라이언트에게 서비스 할 수 있도록 한다

- 이를 위해서는 하나의 프로세스가 여러 개의 소켓을 핸들링 할 수 있는 방법이 존재 해야 한다.

- 바로 이것이 IO 멀티플렉싱이다.

 

 

멀티 플렉싱의 의해

- 기존 멀티 프로세스에서는 클라이언트 갯수 만큼 프로세스를 1대1로 대응 시켰지만, 멀티 플렉싱은 하나의 프로세스에서 다수의 클라이언트 접속을 처리 한다(하나의 리소스를 통해서)

 

select 모델 flow

-> 멀티플렉싱

-> 다수 클라이언트 fd를 하나의 프로세스가 관리 해야 한다

-> 게임을 예로 들면 서버-클라이언트 사이에서 처리할 데이터의 크기가 굉장히 작기 때문에 하나의 프로세스에서도 충분히 처리가 가능하다 때문에 하나의 프로세스가 모든 클라이언트 요청을 처리하는 것이 '프로세스를 여러개 만드는 것보다' 효율적일 수 있다.

-> 다수의 클라이언트 소켓 fd를 저장할 fd_set 자료구조가 존재

-> fd_set에 클라이언트 소켓 fd를 등록

-> select() 함수를 통해서 fd_set에 변경된 데이터가 있으면  값을 반환한다(그전 까진 블로킹 상태)

-> 변경된 fd 정보 하나에는 나머지는 다 리셋된다.

-> 해당되는 fd를 찾아서)(fd_set을 반복문을 통해서 찾아야 한다.) 이용 read/write

-> 다시 fd_set에 fd를 등록하고 다시 select() 함수 호출 후 대기(블로킹)

 

fd_set 관련 함수

FD_ZERO

FD_SET

FD_CLR

FD_ISSET

 

 

 

728x90

+ Recent posts