논블록 소켓에서는 상태 확인 후 뭔가를 합니다. Overlapped I/O에서는 일단 저지른 후 결과를 확인합니다. 그래서 논블록 소켓을 ‘뒤늦게…’라는 의미의 리액터 패턴(reactor pattern)이라고 합니다. Overlapped I/O는 ‘미리…’라는 의미의 프로액터 패턴(proactor pattern)이라고 합니다.
표 3-3을 참고하여 이 둘의 미묘한 차이를 기억해 둡시다.
▼ 표 3-3 리액터 패턴과 프로액터 패턴 비교
리액터 |
프로액터 |
논블록 소켓 |
Overlapped I/O |
1. I/O를 시도한다(성공할 수도 있고 실패할 수도 있다). 2. 실패할 때는 I/O 가능을 기다린 후 I/O를 재시도한다. 3. 성공할 때는 상황을 종료한다. |
1. I/O를 시행(무조건 성공)한다. 2. I/O 완료를 기다린다. 3. 상황을 종료한다. |
리눅스, FreeBSD, iOS, 안드로이드 등에서 주로 사용된다. 윈도에서도 사용할 수 있으나 대세는 아니다. |
윈도에서만 사용할 수 있다. |
자, 이제 소켓 개수가 1만 개인 상황을 살펴봅시다. 리액터에서는 이렇게 해야 합니다.
1. 소켓 1만 개에 대해서 select를 호출합니다.
2. 각 소켓에서 루프를 돌며 I/O를 시도합니다(이 루프를 도는 것은 성능 문제로 이어집니다).