dev/rtos

메시지 큐(Message Queue)

조뎅 2020. 8. 4. 22:03
728x90

메시지 큐의 정의

버퍼 형태 오브젝트파이프라인과 비슷

여러 태스크와 ISR은 메시지큐를 통해 데이터 통신과 동기화를 수행

버퍼링 매커니즘을 통해 수신 태스크와 송신 태스크를 나누어 관리 할 수 있음

큐 컨트롤 블록(QCB), 메시지큐 이름고유 ID,메모리 버퍼큐의 전체 길이최대 메시지의 길이,하나 이상의 태스크 대기 리스트로 구성

 

메시지 큐의 상태

메시지 큐 생성 시 큐는 비어 있는 상태

큐가 비어 있는 상태에서 메시지를 수신하려 하면 태스크는 블록되고 원할 경우 수신 태스크 대기 리스트에 놓임(FIFO또는 우선순위 기반)

이 상태에서 다른 태스크가 메시지 큐를 보내면 메시지는 블록된 태스크로 직접 전달되고블록된 태스크는 대기 리스트에서 삭제되고 준비 또는 실행 상태가 됨

수신 대기 리스트에 태스크가 없는 상태에서 메시지 큐에 메시지가 전송 될 경우 메시지 큐는 비어 있는 상태에서 벗어나게 됨

메시지가 계속해서 큐로 전송되어 큐의 길이와 메시지의 개수가 동이할 때를 가득 찬 상태라 표현

큐가 가득 찬 상태에서는 쓰기 작업 불가능(커널에 따라 에러코드를 리턴한다던지,태스크를 블록 상태로 만들어 송신 태스크 리스트에 삽입 하는 기능을 지원)

 

메시지 복사

하나의 태스크가 다른 태스크로메시지를 보낼때 메시지는 보통 두번 복사 됨

(수신 대기 리스트에 수신 태스크가 블록 중 일때에는 메시지큐를 거치지 않고 송신 태스크에서 수신 태스크로 한번만 직접 복사 됨)

실시간 임베디드 시스템은 가급적 작은 크기의 메시지를 사용하거나 포인터를 사용하여 데이터 복사를 최소화 해야 함

 

 

메시지 큐의 저장

커널에 따라 메시지큐를 저장할 때 서로 다른 종류의 메모리 영역을 사용하기도 함

시스템 풀 / System Pools

모든 큐의 메시지를 하나의 커다란 공유 메모리 영역에 저장

전체 메시지큐가 사용하는 메모리 크기가 특정 크기를 넘지 않을 것이 확실하다면 시스템 풀을 사용

시스템 풀은 메모리를 절약

특정 메시지큐가 풀 메모리의 대부분을 사용할 경우 다른 메시지큐가 사용할 메모리가 모자랄 수 있음

프라이빗 버퍼 / Private Buffer

메시지 큐 별로 별개의 메모리 영역을 사용

메시지 큐 마다 최대 메시지 데이터 양 만큼 메모리를 확보해야 함

시스템 풀 대비 많은 메모리 사용

모든 메시지가 저장될 수 있는 공간이 보장됨으로 안정성 높음

 

메시지 송수신

메시지 송신

메시지를 송신 할때 커널은 FIFO 방식에 의해 메시지큐의 선두에서 후미 방향으로 메시지를 채움,새로 전송된 메시지는 큐의 후미에 놓임

대부분의 메시지 큐는 긴급한 메시지를 바로 큐의 선두에 보낼 수 있는 기능을 제공(LIFO 방식)

대부분의 메시지 큐는 ISR에서 메시지를 보내는 것도 허용

메시지 큐에 메시지를 보낼 때는 다음 중 한가지 방법을 사용

  • 블록되지 않음(ISR과 태스크)
  • 타임아웃을 두고 블록(태스크 only)
  • 무제한 블록(태스크 only)

특정 커널에서는 브로드캐스트 방식으로 메시지를 보낼 수 있음

메시지 수신

메지시 수신도 메시지 송신과 같은 방법 제공

  • 블록되지 않음
  • 타임아웃을 두고 블록
  • 무제한 블록

하지만 메시지 수신시에는 메시지 큐가 비어 있는 상태라면 태스크 블록이 발생

메시지를 읽는 방법은 다음 두가지가 있음

  • 파괴적 읽기(destructive read): 메시지 수신 시 메시지 큐의 저장 버퍼에 있는 메시지를 완전히 지움
  • 비파괴적 읽기(non-distructive read):메시지 수신 시 메시시지 큐의 저장 버퍼에 있는 메시지를 읽기만 함(모든 커널이 지원하는 것은 아님)

태스크 대기 리스트

메시지 송신 또는 수신 태스크 대기 리스트는 FIFO 방식과 우선순위 기반 방식을 지원

 

728x90

'dev > rtos' 카테고리의 다른 글

세마포어(Semaphore)  (0) 2020.08.04
태스크(Task)  (0) 2020.08.04
RTOS란?  (0) 2020.08.04