태그 보관물: Reactor

reactor 프레임웍의 socketchannel의 read 메쏘드 호출을 어디에서??

흠…
현재 개발된 프레임웍의 구조는 master, slave reactor가 있고.. slave reactor가 네트웍 이벤트를 디스패칭을 하고있는 구조이고, 또 socketchannel의 read 메쏘드를 통해서 bytebuffer를 worker 쓰레드에 넘기는 구조인데요..

최근에 큰 사이즈의 이미지를 전송하다 보니….
worker 쓰레드에서 socketchannel의 read 메쏘드를 호출하는 것이 더 맞아보이기도 하고..

흠.. socketchannel의 read 메쏘드를 호출하는 객체가 slave reactor가 되야 될까요?? 아님 worker 쓰레드가 되야 될까요??

고민이네.. ㅜㅜ

Scalable IO in Java

Doug Lea 교수님께서 강의를 위해서 만들어놓은 자료입니다. 어디에서 다운로드를 받았는지 기억이 안나서 업로드 합니다.
PDF 자료를 보면, POSA2의 Reactor 패턴을 이용해서 이벤트를 디스패칭하는 내용을 기본으로, 약 3가지의 모델을 제시하고 있고, 그 중에서 Using Multiple Reactors 슬라이드 편이 멀티 프로세서 환경에서, 성능이 가장 좋아 보인다.

nio.pdf

리액터(Reactor) 패턴의 성능 향상 방안..

리액터(Reactor) 패턴을 사용해서 자바 네트워크 서버를 개발하다 보면, 동접을 2000 이상 붙여보면 성능저하를 확인할 수 있다. 그래서 리액터를 마스터-슬레이브(Master-Slave)의 구조로 개선하고, 슬레이브 리액터의 개수를 CPU 개수만큼 만들어서 성능을 개선할 수 있다. 아래는 이 구조를 쉽게 알수 있는 그림이다.^^

리액터(Reactor) VS 프로액터(Proactor)

리액터(Reactor)는 소켓이나 파일에서 이벤트가 발생하면, 동기(Sync) I/O를 수행할 수 있는 상태를 체크하고, 이벤트에 맞는 핸들러를 호출해서 이벤트를 처리하는 방식이다. 만약, 서버소켓으로 새로운 커넥션 요청이 들어오면, 리액터는 내부 스레드로 새로운 커넥션을 처리하는
핸들러(Acceptor)를 호출해서 커넥션을 처리한다.

프로액터(Proactor)는 하나 이상의 비동기 I/O를 초기화하거나 작업이 완료되서 발생한 이벤트를 처리하는 핸들러를 등록해서 처리한다. 프로액터가 비동기 I/O를 사용하는 경우, 유저 스레드가 I/O 작업을 직접 수행하지 않기에, 동시성 문제에 있어서 많은 이점을 누릴 수 있어서 성능을 향상시킬 수 있다.

Comparing Two High-Performance I/O Design Patterns

Reactor 패턴과 Proactor 패턴에 대한 비교 자료입니다.
위의 패턴들은 더글라스 슈미츠 박사의 ACE 프레임웍에서 구현을 하였고, 패턴으로 승화가 되었죠.. ^^

아래 내용에서 TProactor 패턴에 대한 얘기가 나오고 있습니다.
소스를 까보면 Leader/Followers 패턴도 적용이 되어 있네요..
결국 기본적으로 IO에 대한 멀티플랙스 + 효율적인 처리를 위한 쓰레드 적용을 통해서 성능을 높이는 것이 TProactor 패턴으로 느껴집니다.

한번씩 읽어보세요.. ^^
 
http://www.artima.com/articles/io_design_patternsP.html