2011년 2월 23일 수요일

소켓 입출력 모델의 장단점(비교)

■ 각 모델들의 장점
Select 모델
- 모든 윈도우 버전은 물론 유닉스에서도 사용할 수 있으므로 이식성이 높다.

WSAAsyncSelect 모델
- 소켓 이벤트를 윈도우 메시지 형태로 처리하므로, GUI 애플리케이션과 잘 결합 할 수 있다.

WSAEventSelect 모델
- Select 모델과 WSAAsyncSelect 모델의 특성을 혼합한 형태로, 비교적 뛰어난 성능을 제공하면서 윈도우를 필요로 하지 않는다.

Overlapped 모델(Ⅰ)
- WSAEventSelect 모델과 비슷하지만 비동기 입출력을 통해 성능이 뛰어나다.

Overlapped 모델(Ⅱ)
- 비동기 입출력을 통해 성능이 뛰어나다. ( APC Queue )

Comlpetion Port 모델 ( IOCP )
- 비동기 입출력과 완료포트를 통해 가장 뛰어난 성능을 제공한다.


■ 각 모델들의 단점
Select 모델
- 하위 호환성을 위해 존재하며, 성능은 여섯 가지 모델 중 가장 떨어진다.
   64개 이상의 소켓을 처리하려면 여러개의 스레드를 사용해야 한다.

WSAAsyncSelect 모델
- 하나의 윈도우 프로시저에서 일반 윈도우 메시지와 소켓 메시지를 처리해야 하므로 성능저하의 요인이 된다.

WSAEventSelect 모델
- 64개 이상의 소켓을 처리하려면 여러 개의 스레드를 사용해야 한다.

Overlapped 모델(Ⅰ)
- 64개 이상의 소켓을 처리하려면 여러 개의 스레드를 사용해야 한다.

Overlapped 모델(Ⅱ)
- 모든 비동기 소켓 함수에 대해 완료 루틴을 사용 할 수 있는 것은 아니다.

Comlpetion Port 모델
- 가장 단순한 소켓 입출력 방식( 블로킹 소켓 + 스레드 )와 비교하면 코딩이 복잡하지만 성능면에서 특별한 단점이 없다.
  윈도우 NT계열에서만 사용할 수 있다.


■ 동기 입출력과 비동기 입출력 모델의 성능
Select, WSAAsyncSelect, WSAEventSelect 
- 동기 입출력을 사용하므로 성능면에서 비동기 입출력 모델에 비해서 떨어진다.

Overlapped(Ⅰ), Overlapped(Ⅱ), Comlpetion Port (IOCP)
- 비동기 입출력을 사용하므로 성능이 높다.


■ 소켓 입출력 모델이 요구되는 사항
1. 소켓 함수 호출 시 블로킹을 최소화한다.
    여섯가지 모델 모두 만족한다.

2. 입출력 작업을 다른 작업과 병행한다.
    비동기 입출력 방식을 사용하는 Overlapped 모델(Ⅰ), Overlapped 모델(Ⅱ), Comlpetion Port 모델만 만족한다.

3. 스레드 개수를 최소화한다.
    여섯가지 모델 모두 어느정도 만족한다.
    64개 이상의 소켓을 만들시에는 WSAAsyncSelect 모델, Overlapped 모델(Ⅱ), Comlpetion Port 모델을 제외하고는
    스레드를 추가로 생성한다.
    하지만 WSAAsyncSelect 모델은 스레드 개수가 늘어나면 성능이 상당히 떨어져서 Overlapped 모델(Ⅱ), Comlpetion Port 모델만
    이 조건을 만족한다. ( IOCP는 CPU 개수에 비례하여 작업자 스레드를 생성할 수 있으므로 가장 이상적이다. )

4. 유저모드와 커널모드 전환 횟수와 데이터 복사를 최소화한다.
    비동기 입출력 방식을 사용하는 모델만 이 조건을 만족한다.
    비동기 입출력을 할대 송신버퍼나 수신버퍼가 가득차면, 윈도우 운영체제는 애플리케이션 버퍼를 잠근후(lock),
    이 메모리 영역을 직접 접근한다.
    따라서 유저영역 ↔ 커널 영역 복사가 불필요하며 모드 전환없이 입출력 작업을 곧바로 이루므로 효율적이다.


※ 결론은 위의 모든 조건을 만족하는 모델은 Overlapped 모델(Ⅱ)과 IOCP 모델뿐이다.
    하지만 성능 면에서 IOCP가 좋기 때문에 거의 모든 Server는 IOCP로 만든다.( 그 이외의 것을 사용한다는 소리는 들은 적이 없다. )

댓글 없음:

댓글 쓰기