
- 참고링크 :
http://www.riverace.com/newsletters/March2005.htm
- 여러가지 토를 붙이면서 나름대로 정리해보려합니다.
1 개요 #
ACE가 많이 알려지면서 수천개의 네트워크 동시 접속을 관리해야만 하는 서비스를 실행하는 방법에 대한 많은 질문을 봐왔습니다. 대부분의 네트워크 서비스들이 ACE Reactor 프레임워크를 사용하여 네트워크 연결을 다중수신 및 디스패칭하기 때문에, 항상 핸들 수용한계 및 처리성능이 고려사항과 한계점 판단 조건이 되어왔습니다.
각각의 플렛폼마다 동시에 열수 있는 화일(또는 핸들)의 개수를 제한하고 있긴하지만, 각각의 ACE Reactor에서 어떤 다중수신 구조를 사용하는가 여부는 종종 어플리케이션이 동시에 수용할 수 있는 핸들의 최대 개수를 알아내는데 중요한 요소로 생각되고 있습니다.
- WaitForMultipleObjects(). 윈도우즈에서만 사용가능하며, ACE_WFMO_Reactor로 구현되어있습니다. 이 시스템 호출은 한번 호출할때마다 64개의 핸들 제한을 가지고 있습니다. ACE는 내부적으로 2개를 사용하기 때문에 개발자는 62개의 핸들만 사용가능합니다.
- select(). (윈도우즈를 포함한) 대부분의 플렛폼에서 사용가능. select()는 ACE_Select_Reactor와 ACE_TP_Reactor로 구현되어있습니다. select()에서 사용가능한 핸들의 개수는 플렛폼에 따라 다양합니다.
- /dev/poll 또는 epoll. epoll은 리눅스 커널 2.6 이상에서 사용가능하며, /dev/poll 은 솔라리스와 HP-UX에서 사용가능합니다. 이 장치들은 모두 ACE_Dev_Poll_Reactor에 구현되어있습니다. 이들은 특별한 한계 개수가 정해져있지 않습니다. (epoll은 대략 10000개까지도 테스트한 자료가 존재합니다)
2 Windows : WFMO 대 select #
윈도우즈에서 다수의 접속을 처리하는데 있어서 Proactor 프레임워크가 더 나은 선택이긴 하지만, Reactor 프레임워크는 친숙함과 쉬운 이식성때문에 윈도우즈에서도 자주 거론됩니다. 기본적인 선택사항은 두가지가 있습니다.
- ACE_WFMO_Reactor : 위에서 언급했듯이 62개의 핸들제한이 있습니다. 다수의 연결을 제어하는데는 알맞지 않습니다. (간단한 P2P 클라이언트 어플리케이션 제작에는 무리가 없을듯) 윈도우즈 플렛폼에서 기본으로 설정되어있습니다.
- ACE_Select_Reactor (그리고 그 사촌, ACE_TP_Reactor) : select()에 기반하고 있습니다. 윈도우즈의 select() 구현은 특별히 핸들수가 제한되어있지 않습니다. 하지만 윈도우즈에서 구현된 fd_set 의 내부 형태로 인해, 다른 플렛폼에서 처럼 핸들 집합을 검색하는 부분을 최적화하기가 매우 어렵습니다. 그러므로 핸들제한은 피할 수 있지만 특정 어플리케이션에서 너무 많은 부하가 걸리는지는 스스로 테스트해볼 필요가 있습니다. 만약 많은 부하가 걸린다면 여러분은 Proactor 프레임워크로 변경하여야합니다.
3 비 윈도우즈 플렛폼 : select() 대 기타등등 #
select()는 오늘날 인기있는 플렛폼이라면 거의 필수적으로 탑재되어있으므로, 다중수신장치로서 첫번째 선택으로 결정하기 마련입니다. 하지만 select()에는 두가지 문제점이 있습니다.
- 핸들 제한 : select()의 사용가능한 핸들 개수는 제한되어있으며, 동일한 제한을 두는 플렛폼은 거의 없습니다. 게다가 제한을 알려주는 방식은 플렛폼마다 모두 다릅니다.
- 성능 문제 : select()는 최대 핸들 갯수 과부하가 발생했을때 상당히 안좋은 성능을 가진다는 것으로 유명합니다. 몇몇 상황에서 select()의 핸들 사용가능검사와 어플리케이션의 사용가능 핸들집합을 검사하는 작업때문에 CPU 자원이 엄청나게 소모될 수 있습니다.
끝내주네요! 이것들을 어떻게 사용할 수 있을까요?! 이런 이유로 ACE는 플렛폼의 구분없이 /dev/poll 또는 epoll을 이용할 수 있도록 하기위해서 ACE_Dev_Poll_Reactor 구현을 제공하고 있습니다. (물론 윈도우즈에서는 사용할 수 없습니다.) 이것을 기본 reactor 구현과 교체하려면, 단지 인스턴스 하나를 생성하고 이를 새로운 ACE_Reactor 인스턴스로 설정하기만 하면 됩니다. CNP2권과 APG 모두 새로운 reactor를 설정하는 예를 담고 있습니다.
하지만 알아둘 것이 있습니다. ACE_Dev_Poll_Reactor는 ACE 5.4에 추가되었지만 적합성이 제한되어있는 이유로 아직 "실험단계"로 분류되어있습니다. 하지만, Riverace와 다른 ACE 사용자들이 ACE 5.5에서 ACE_Dev_Poll_Reactor를 개선하는데 (특히 리눅스의 epoll에 대한 부분을 중점적으로) 협력하고 있습니다. 이는 아주 조금 개선되었지만, 다른 reactor 구현과 같이 광범위하게 사용가능할 만큼 만들려면 몇가지 추가작업이 아직 필요합니다. 다른 여러 개발들이 끝나면 이 reactor 구현을 끝내고 이것을 추가할 수 있을 것입니다.









