[Archive] 강좌게시판

취소
다음에 대한 결과 표시 
다음에 대한 검색 
다음을 의미합니까? 

[myLV.net 집필진 강좌] Actor Framework 구조 분석 - 3

 [myLV.net 집필진 강좌 – 웅킹킹킹]

 

안녕하세요. 웅킹킹킹 입니다.

 

 

지난 시간에 이어 계속해서 Actor Framework의 라이브러리를 구성하는 함수들을 분석하는 시간을 가지도록 하겠습니다.


지금까지 Actor Framework의 Message 전달 메커니즘을 담당하는 Queue 관련 함수들을 분석하고 있었습니다. Message Queue, Message Enqueuer, Message Dequeuer 총 3개의 클래스에 대해서 알아보았으며 이번 시간에는 가장 중요한 Message Priority Queue클래스를 분석하고자 합니다.

 

사실 지금까지 알아본 Message Queue, Message Enqueuer, Message Dequeuer 클래스는 Message Priority Queue 클래스의 기능을 좀 더 편하게 사용하고자 하는 목적으로 만들어진 클래스이며 사실상 Actor Framework의 핵심인 Message 전달 메커니즘을 특별한 목적으로 수정하거나 만들지 않는 이상 전혀 사용할 일이 없습니다. 단 Actor클래스의 Method를 호출하기 위한 Message클래스를 LabVIEW에서 제공하는 자동 생성 기능을 이용하지 않고 직접 구현하는 경우는 Message Enqueuer클래스의 Method 중 Enqueue를 사용합니다.

 

지난 시간의 내용을 간단하게 정리하면

 

1. Message Enqueuer, Message Dequeuer클래스는 Data 멤버로 Message Priority Queue클래스 정보를 가집니다.

 

2. Message Enqueuer는 Queue의 기본적인 기능인 Enqueue 기능을 수행하기 위한 클래스로 Message Priority Queue 클래스로부터 Enqueue 기능을 호출합니다.

 

3. Message Dequeuer는 Queue의 기본적인 기능인 Dequeue 기능을 수행하기 위한 클래스로 Message Priority Queue 클래스로부터 Dequeue 기능을 호출합니다.

 

4. Message Enqueuer, Message Dequeuer 두 클래스로 Message Priority Queue 클래스가 가지는 Enqueue, Dequeue 기능을 나누어 가진 이유는 Enqueue와 Dequeue 만을 가지는 클래스를 생성하여 Enqueue 기능을 구현할 때 프로그래머가 Dequeue 기능을 실수라도 구현되지 않게 하기 위함입니다. 만약 Actor 클래스의 Method 중 Actor Core에서 Dequeue를 수행하고 있을 때 다른 곳에서 Dequeue를 하게 된다면 Actor Framework의 Message 전달 메커니즘에 치명적인 버그를 발생하기 때문입니다.
또한, Message Enqueuer, Message Dequeuer를 구분하여 좀 더 프로그래머가 각각의 기능을 좀 더 편하게 구현할 수 있는 이 점도 가지게 됩니다.

 

입니다.

 

Message Priority Queue 클래스의 Data멤버와 Method를 자세하게 분석하면 Actor Framework에서 Message가 Queue를 통해서 전달되는 메커니즘을 파악하실 수 있습니다.

 

 

  1. Message Priority Queue 클래스
    Message Priority Queue 클래스는 Actor Framework 구조에서 Actor에게 수행하고자 하는 Method의 Message를 전달하는 Queue의 역할을 담당합니다. Priority라는 이름에 걸맞게 전달하고자 하는 Message의 중요도에 따라서 Low, Normal, High, Critical 4가지의 우선순위를 정해서 전달할 수 있도록 구성되어 있습니다.

 

A. Message Priority Queue 클래스의 Data멤버

 

그림 1 Message Priority Queue 클래스의 Data멤버그림 1 Message Priority Queue 클래스의 Data멤버

 

그림 1은 Message Priority Queue 클래스의 Data 멤버입니다. LabVIEW를 오랫동안 사용한 유저에게도 낯선 모양의 컨트롤 타입입니다. 하지만 이는 메모리 공간의 재사용을 극대화해서 리소스를 최소화하기 위해서 "메모리 컨트롤" 관련 함수를 사용하기 때문에 생기는 메모리의 데이터 값 참조 컨트롤입니다. 우선순위를 구분하기 위해 여러 개의 Message타입의 Queue를 생성하고 다루어야 하기 때문에 메모리를 효율적으로 다루기 위함입니다.

Message Priority Queue 클래스에서 다루는 Data는 # Waiting, Buffers, Wait Msg, Wait Prior 총 4가지로

 

i. # Waiting : 전달하는 Message의 대기 번호. 대기 번호가 0이 아니면 “Wait Msg Queue”를 통해서 Message를 전달.

 

ii. Buffers : Low, Normal, High, Critical 순으로 4개의 Message Queue 정보를 관리

 

iii. Wait Msg : 대기번호가 생긴 Message를 다루는 Message Queue 정보를 관리.

 

iv. Wait Prior : Wait Msg를 통해 전달하는 Message의 우선순위 정보를 전달.

 

입니다

 

간단하게 설명하자면 Low, Normal, High, Critical 순으로 Queue정보를 Buffers라는 배열 타입으로 관리하여 Message를 전달합니다.

 

평소에는 Buffers에 있는 Queue를 통해서 우선순위에 따라서 Message는 Actor에게 전달하지만 Buffers의 Queue에 Message가 비어있거나 다른 요인에 의하여 Message를 전달하는 과정에서 타임아웃이 발생하게 되면 Wait Msg의 Queue를 통해서 Message를 전달합니다.

 

이 과정에서 필요한 Waiting 정보와 우선순위 정보는 각각 # Waiting과 Wait Prior에서 담당합니다.

* 이런 방식을 취하는 이유는 모두 우선순위 4가지 Low, Normal, High, Critical에 따라 Message를 전달하기 위해서 입니다.

 

B. Message Priority Queue 클래스의 구성요소

 

 

 

그림 2 Message Priority Queue 클래스의 구성요소그림 2 Message Priority Queue 클래스의 구성요소

 

Message Priority Queue 클래스의 구성요소는 그림 2와 같이 메모리 컨트롤 정보를 관리하는 DVR Contents 타입정의 컨트롤 1개와 Dequeue Timed Out, Obtain Priority Queue, Priority Enqueue, Priority Dequeue, Flush, Release Priority Queue 총 6개의 Method로 이루어져 있습니다.

 

C. Message Priority Queue 클래스의 타입정의 컨트롤 - DVR Contents

 

 

 

그림 3 DVR Contents그림 3 DVR Contents

 

Message Priority Queue 클래스에서 Data멤버로 사용하는 # Waiting, Buffers, Wait Msg, Wait Prior를 타입정의 컨트롤 형태로 관리하여 데이터 타입을 효율적으로 사용합니다.

 

DVR Contents 타입정의 컨트롤을 “메모리 컨트롤” 함수를 사용하여 리소스를 효율적으로 사용하게 됩니다.

 

 D. Message Priority Queue 클래스의 Method - Obtain Priority Queue

 

 

 

4.png

 

그림 4 Obtain Priority Queue그림 4 Obtain Priority Queue

 

Obtain Priority Queue에서는 우선순위에 따라 Message를 전달하기 위한 Queue를 생성합니다.

 

우선순위 Low, Normal, High, Critical에 해당하는 Queue 4개를 생성하고 보조적인 개념의 “Wait Msg”와 “ Wait Prior” Queue를 생성합니다.

 

이를 “메모리 컨트롤” 함수 중 “데이터 값 참조” 라는 함수를 사용하여 Queue 정보를 리소스 측면에서 좀 더 효율적으로 관리합니다.

 

i. 우선순위 Queue 생성. (Message 클래스 타입)



Low, Normal, High, Critical 순으로 For Loop를 사용하여 Message 클래스 타입의 Queue를 4개 생성합니다. 생성한 우선순위 Queue 정보는 배열 타입으로 관리합니다.

 

a.png

 

 ii. “Wait Msg” Queue 생성. (Message 클래스 타입)

 



생성한 우선순위 Queue에서 Message를 정보를 가져올 때 Queue가 비어있거나 다른 여러 요인에 의해서 타임아웃 에러가 발생했을 때를 대비한 Message 클래스 타입의 “Wait Msg” Queue를 생성합니다.
* “Wait Msg” Queue를 사용하는 이유는 Message를 가져오는 부분을 수행하는 “Priority Dequeue” Method에서 자세하게 설명합니다.

 

b.png

  

iii. “Wait Prior” Queue 생성. (숫자형 I32 타입)

 

 


“Wait Msg” Queue에서 Message를 전달할 때 우선순위 정보를 함께 전달하는 숫자형 I32 타입의 Queue를 생성합니다.
4개의 우선순위 Queue는 순차적으로 Low, Normal. High, Critical 순으로 관리하기 때문에 Message를 전달한 Queue 순서에 따라서 우선순위를 알 수 있지만 “Wait Msg” Queue에서는 하나의 Queue에서 4가지 우선순위 모두를 전달하기 때문에 “Wait Prior” Queue에서 우선순위도 함께 전달하여 현재 Message의 우선순위를 파악합니다.

 

c.png

  

iv. “데이터 타입 컨트롤 함수” 타입으로 Priority Queue 정보 관리.

 

 


“# Waiting”와 함께 ①, ②, ③에서 생성한 Queue를 클러스터로 묶어 “새 데이터 값 참조” 함수를 사용하여 메모리 리소스를 효율적으로 관리할 수 있도록 합니다.
* LabVIEW는 배열이나 클러스터 타입의 정보를 “일반적인” 방식으로 사용하게 되면 메모리 공간을 추가로 자동 할당해서 사용합니다. Priority Queue 관련 정보는 클러스터와 배열타입으로 형성되어 있고 자주 사용하기 때문에 무분별한 메모리 사용을 줄이기 위해서 “새 데이터 값 참조” 함수를 사용해서 메모리 리소스를 관리하게 됩니다.
“메모리 컨트롤” 관련 함수는 시중의 LabVIEW 관련 교육 서적에 자세하게 설명되어 있습니다.

 

d.png

  

 v. Message Priority Queue 클래스의 Data멤버에 정보 전달.

 

 


①, ②, ③, ④에서 에러가 발생하지 않으면 Message Priority Queue 클래스의 Data멤버에 생성한 정보를 전달합니다.
만약 에러가 발생하면 생성한 Queue정보를 모두 해제합니다.e.png

 

e-2.png

 

 

E. Message Priority Queue 클래스의 Method - Priority Enqueue

 

 

 

5.png

 

그림 5 Priority Enqueue그림 5 Priority Enqueue

 

Priority Enqueue는 Obtain Priority Queue에서 생성한 Queue를 통해 Message를 보내는 역할을 합니다. Priority Enqueue에서 Message를 보내면 바로 다음에 설명드릴 Priority Dequeue에서 Message를 전달받게 됩니다.

 

i. 우선순위 정보 확인.

 

 


전달하고자 하는 Message와 우선순위 정보를 입력 받습니다. 우선순위는 Low, Normal, High, Critical 범위에 따른 올바른 우선순위 정보인지 확인합니다.f.png

 

 

ii. 올바르지 않은 우선순위 정보일 때.

 

 


올바르지 않은 우선순위 정보일 경우 에러번호 1605를 매겨서 에러를 유발시켜서 Actor 종료를 유도합니다.g.png

 

 

iii. “Buffers” Queue (우선순위)를 통해 Message 전달.

 

 


“# Waiting” 이 0일 때 “Buffers” Queue를 우선순위 정보에 맞는 Queue를 찾아서 전달하고자 하는 Message를 전달합니다.h.png

 

 

iv. “Wait Msg” Queue를 통해 Message 전달.

 

 


“# Waiting” 이 0이 아닐 때는 “Wait Msg” Queue를 통해 Message를 전달합니다. 이 때 전달하는 Message의 우선순위를 알 수 없기 때문에 “Wait Prior” Queue에 우선순위 정보를 함께 전달합니다.
“Wait Msg” Queue를 통해 Message를 전달했기 때문에 “# Waiting”에서 -1를 해서 Message 대기번호를 맞춥니다.i.png

 

 

나머지 Message Priority Queue 클래스의 Data 멤버와 Method는 다음 시간에 이어서 계속하도록 하겠습니다.

 

너무 글이 길어지면 루즈해지는 경향이 있는 것 같고 또한 현재 다루는 내용이 소스코드를 분석하는 내용이기 때문에 적당한 양의 내용으로 진행하도록 하겠습니다.

 

조금 지루하지만 Actor Framework의 내부 메커니즘을 알아야 구조를 좀 더 제대로 사용할 수 있기 때문에 Actor Framework에 관심이 있으신 분들은 글을 정독하시면서 소스코드도 함께 보시면 큰 도움이 될거라 믿습니다.

 

감사합니다.

기여자