ubinos
메시지큐 예제

간단한 메시지큐 사용 예제 Simple message queue example

이 예제는 대표적인 태스크간 동기화 문제인 생산자 소비자 문제를 메시지큐를 사용해 해결한다. 생산자(태스크 1)는 메시지큐를 사용해 메시지를 소비자들(태스크 2와 3)에게 전달한다. 그리고 이와 동시에 소비자들(태스크 2와 3)은 역시 메시지큐를 사용해 메시지 소비 시점을 생산자(태스크 1)의 메시지 생산 시점에 동기시킨다.

메시지큐 기본 기능 시험 Test on basic functions of message queue

이 예제는 아래에 나열된 메시지큐의 기본 기능들을 시험한다.

  • 메시지큐로 메시지를 보내는 기능 (msgq_send 함수)
  • 메시지큐로부터 메시지를 받는 기능 (msgq_receive 함수)

시점 1에서 태스크 1을 높은 우선순위로, 태스크 2를 중간 우선순위로 생성한다.
여기까지 성공적으로 진행되었다면 확인 지점 1에서 태스크 1이 수행 중이어야 한다.

시점 2에서 태스크 1이 메시지 받기를 시도한다.
그러면 메시지큐가 비어있으므로 태스크 1은 잠든다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 2에서 태스크 2가 수행 중이어야 한다.

시점 3에서 태스크 2가 메시지를 보낸다.
그러면 태스크 1이 메시지를 받고 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 3에서 태스크 1이 수행 중이어야 한다.

시점 4에서 태스크 1이 시점 7까지 휴면sleep을 시도한다.
여기까지 성공적으로 진행되었다면 확인 지점 4에서 태스크 2가 수행 중이어야 한다.

시점 5에서 태스크 2가 메시지를 보낸다.
메시지를 기다리는 태스크가 없으므로 메시지는 메시지큐에 쌓인다. (메시지큐에 들어 있는 메시지 수는 1이 된다.)
여기까지 성공적으로 진행되었다면 확인 지점 5에서 태스크 2가 수행 중이어야 한다.

시점 6에서 태스크 2가 메시지를 다시 한번 보낸다.
메시지를 기다리는 태스크가 없으므로 메시지는 메시지큐에 쌓인다. (메시지큐에 들어 있는 메시지 수는 2가 된다.)
여기까지 성공적으로 진행되었다면 확인 지점 6에서 태스크 2가 수행 중이어야 한다.

시점 7이 되면 태스크 1이 휴면sleep 시간이 다해서 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 7에서 태스크 1이 수행 중이어야 한다.

시점 8에서 태스크 1이 메시지 받기를 시도한다.
메시지큐에 메시지가 쌓여 있으므로 태스크 1이 쌓여있는 메시지 하나를 받는다. (메시지큐에 들어 있는 메시지 수는 1이 된다.)
여기까지 성공적으로 진행되었다면 확인 지점 8에서 태스크 1이 수행 중이어야 한다.

시점 9에서 태스크 1이 메시지 받기를 다시 한번 시도한다.
메시지큐에 메시지가 쌓여 있으므로 태스크 1이 쌓여있는 메시지 하나를 받는다. (메시지큐에 들어 있는 메시지 수는 0이 된다.)
여기까지 성공적으로 진행되었다면 확인 지점 9에서 태스크 1이 수행 중이어야 한다.

시점 10에서 태스크 1이 시점 11까지를 제한 시간으로 두고 메시지 받기를 시도한다.
그러면 메시지큐가 비어있으므로 태스크 1은 잠든다(대기blocked 상태가 된다).
여기까지 성공적으로 진행되었다면 확인 지점 10에서 태스크 2가 수행 중이어야 한다.

시점 11이 되면 태스크 1이 제한 시간이 다해서 깨어난다.
여기까지 성공적으로 진행되었다면 확인 지점 11에서 태스크 1이 수행 중이어야 한다.

시점 12에서 태스크 1이 종료된다.

시점 13에서 태스크 2가 종료된다.

ubik_test_msgqtest01.gif

메시지큐에 의한 메모리 누수 시험 Test for memory leak by message queue

이 예제는 메시지큐에 의한 메모리 누수를 시험한다.
시험 과정은 다음과 같다.

먼저 힙heap의 할당된 메모리 총량과 메모리 블록 수를 가져와 저장한다.
그리고 메시지큐 생성과 제거를 여러 번 반복한다.
그 다음 힙heap의 할당된 메모리 총량과 메모리 블럭 수를 다시 가져와 저장했던 값과 비교한다.
메모리 누수가 발생하지 않았다면 저장했던 값과 다시 가져온 값이 같아야 한다.

Content is available under Attribution-Noncommercial-No Derivative Works 3.0 Unported.