본문 바로가기

Tools/IBM Rhapsody

Rhapsody :: Reactive 클래스의 Sequential과 Active 동작의 차이점

Rhapsody에서 Reactive 클래스의(클래스에 State Chart를 추가하면 Reactive 클래스가 된다.) Sequential과 Active의 동작을 확인하기 위하여 아래의 시나리오대로 동작하는 프로그램을 간단히 만든다.
  • Producer 1개와 Consumer 1개를 생성한다.
  • Producer는 500 ms 마다 메시지를 Consumer에게 전달한다.
  • Consumer는 전달받은 메시지 처리하는데 2 s의 시간을 허비한다.
  • Producer는 20개의 메시지를 Consumer에게 던지고 종료한다.
위의 시나리오대로 구동하기 위한 Producer의 State Chart는 아래와 같다.



위의 시나리오대로 구동하기 위한 Consumer의 State Chart는 아래와 같다.


상황 1. Producer/Consumer를 sequential로 하여 구동
클래스 다이어그램
(sequential 클래스들은 테두리 두께가 동일하다.)



결과화면1

결과화면2



상황 2. Producer/Consumer를 active로 하여 구동
클래스 다이어그램
(active 클래스들은 양옆 테두리가 더 두껍다.)


결과화면1

결과화면2


해석 결과
State Chart를 가지는 클래스가 Sequential로 지정이 되어있다면, 원하는 Task의 Event Loop에서 받을 수 있도록 지정할 수 있다. 객체를 생성시 인자에 해당 Task를 넣으면 된다. 반면 Active로 지정이 되어있다면 자기자신의 Event Loop를 가지고 Event를 받아처리할 것이다. Sequential일 경우와 Active일 경우의 각 클래스의 생성자의 차이는 아래와 같다.

Sequential의 경우

CClass::CClass(IOxfActive* theActiveContext) {
     setActiveContext(theActiveContext, true);
     initStatechart();
}

Active의 경우

CClass::CClass(IOxfActive* theActiveContext) {
     setActiveContext(this, true);
     initStatechart();
}

만약 Sequential의 경우 Event Loop가 지정되지 않으면 Main Thread의 Event Loop를 사용하게 될 것이다.
상황1의 경우 Producer와 Consumer가 동일하게 Main Thread의 Event Loop를 사용하였으므로, Consumer가 2 s동안 일을 처리할 동안에도 Producer는 원하는 동작을 수행할 수가 없었던 것이다.

클래스 feature에 있는 Concurrency는 이와 같은 의미를 지닌다.