어플리케이션 디자인 패턴 : 마스터/슬레이브

업데이트 됨 Apr 20, 2021

마스터/슬레이브 디자인 패턴은 LabVIEW 개발자가 사용하는 또 다른 기본 아키텍처입니다. 동시에 연속적으로 실행해야하지만 속도는 서로 다른 둘 이상의 프로세스가있을 때 사용됩니다. 이러한 프로세스가 단일 루프에서 실행되면 심각한 타이밍 문제가 발생할 수 있습니다. 이러한 타이밍 문제는 루프의 한 부분을 실행하는데 예상보다 오래 걸리는 경우 발생합니다. 이 경우 루프의 나머지 섹션이 지연됩니다. 마스터/슬레이브 패턴은 여러 개의 병렬 루프로 구성됩니다. 각 루프는 서로 다른 속도로 작업을 실행할 수 있습니다. 이러한 병렬 루프 중 하나의 루프는 마스터로 작동하고 다른 루프는 슬레이브로 작동합니다. 마스터 루프는 모든 슬레이브 루프를 제어하고 메시징 아키텍처를 사용하여 통신합니다.

마스터/슬레이브 패턴은 데이터를 동시에 수집하는 동안 사용자 인터페이스 제어에 응답할 때 가장 일반적으로 사용됩니다. 5초마다 천천히 변화하는 전압을 측정하고 기록하는 애플리케이션을 작성한다고 가정해보겠습니다. 전송 라인에서 파형을 수집하여 100ms마다 그래프로 표시하고 사용자가 각 수집에 대한 매개 변수를 변경할 수있는 사용자 인터페이스를 제공합니다.
마스터/슬레이브 디자인 패턴은 이 애플리케이션에 적합합니다. 이 응용 프로그램에서 마스터 루프에는 사용자 인터페이스가 포함됩니다. 전압 수집 및 로깅은 한 슬레이브 루프에서 발생하고 전송 라인 수집 및 그래프 작성은 다른 루프에서 발생합니다.

제어를 포함하는 애플리케이션도 마스터/슬레이브 디자인 패턴을 사용하는 것이 이점이 있습니다. 예를 들어 사용자와 자유 동작 로봇 팔의 상호 작용이 있습니다. 이러한 유형의 애플리케이션은 제어가 잘못 처리 될 경우 발생할 수 있는 팔 또는 주변의 물리적 손상으로 인해 극도로 제어 지향적입니다. 예를 들어, 사용자가 팔을 아래로 내리는 동작을 중지하라고 지시했지만 프로그램에 팔 회전 명령어가 점유되어 있는 경우 로봇 팔이 지지 플랫폼과 충돌할 수 있습니다. 이러한 상황은 마스터/슬레이브 디자인 패턴을 애플리케이션에 적용하여 피할 수 있습니다. 이 경우 사용자 인터페이스는 마스터 루프에 의해 처리되며 로봇 팔의 모든 제어 가능한 섹션에는 자체 슬레이브 루프가 있습니다. 이 방법을 사용하면 팔의 각 제어 가능한 섹션이 자체 루프를 가지므로 자체 처리 시간을 갖게 됩니다.
이렇게 하면 사용자 인터페이스를 통해 로봇 팔에 대한 보다 반응적인 제어가 가능합니다.
 

왜 마스터/슬레이브 구조를 사용합니까?

마스터/슬레이브 디자인 패턴은 다중 작업 응용 프로그램을 만들 때 매우 유용합니다. 다중 루프 기능으로 인해 애플리케이션 개발에 대한 보다 모듈식 접근 방식을 제공하지만 가장 중요한 것은 애플리케이션의 시간 관리를 더 잘 제어 할 수 있다는 것입니다. LabVIEW에서 각 병렬 루프는 별도의 태스크 또는 스레드로 처리됩니다. 스레드는 다른 부분과 독립적으로 실행할 수있는 프로그램의 일부로 정의됩니다. 별도의 스레드를 사용하지 않는 응용 프로그램이 있는 경우 해당 응용 프로그램은 시스템에서 하나의 스레드로 해석됩니다. 애플리케이션을 여러 스레드로 분할하면 각 스레드는 처리 시간을 서로 동등하게 공유합니다.

이를 통해 애플리케이션의 시간을 더 잘 제어 할 수 있고 사용자가 애플리케이션을 더 잘 제어 할 수 있습니다. LabVIEW의 병렬 특성은 마스터/슬레이브 디자인 패턴의 구현에 적합합니다.

위의 데이터 수집 예의 경우 전압 측정과 파형 수집을 모두 하나의 루프에 통합하면 루프의 50회 반복마다 전압 측정을 수행 할 수 있습니다. 그러나 전압 측정 및 데이터를 디스크에 기록하는 것은 파형의 단일 수집 및 표시보다 완료하는데 더 오래 걸릴 수 있습니다. 이 경우 이전 반복의 모든 코드가 완료되기 전에 시작할 수 없으므로 파형 수집의 다음 반복이 지연됩니다. 또한 이 아키텍처는 전압을 디스크에 기록하는 속도를 변경하지 않고는 파형을 획득한 속도를 변경하기 어렵게 만듭니다.

이 애플리케이션의 표준 마스터/슬레이브 디자인 패턴 접근 방식은 수집 프로세스를 두 개의 개별 루프(슬레이브 루프)에 배치하는 것입니다. 둘 다 사용자 인터페이스 (UI) 컨트롤을 폴링하여 매개 변수가 변경되었는지 확인하는 마스터 루프에 의해 구동됩니다. 슬레이브 루프와 통신하기 위해 마스터 루프는 로컬 변수에 기록합니다. 이렇게하면 각 수집 프로세스가 서로 영향을 미치지 않으며 사용자 인터페이스(예 : 대화 상자 표시)로 인한 지연이 수집 프로세스의 반복을 지연시키지 않습니다.

마스터/슬레이브 애플리케이션 구축

마스터/슬레이브 디자인 패턴은 여러 개의 병렬 루프로 구성됩니다. 다른 모든 루프를 제어하는 루프는 마스터이고 나머지 루프는 슬레이브입니다. 하나의 마스터 루프는 항상 하나 이상의 슬레이브 루프를 구동합니다. 이러한 루프 사이의 직접 데이터 통신은 데이터 흐름을 끊기 때문에 LabVIEW의 로컬 또는 글로벌 변수, 어커런스, 알림자 또는 큐와 같은 메시징 아키텍처로 쓰고 읽어야합니다. 그림 1은 공유 데이터를 사용하여 서로 다른 루프가 서로 연결되는 방식을 보여줍니다.

그림 1 : 마스터/슬레이브 개요


예제 - 루프 동기화

이 응용 프로그램에는 다음 요구 사항이 있습니다.

  • 사용자 인터페이스를 처리할 큐 메시지 핸들러를 만듭니다. 사용자 인터페이스에는 LED가 있는 두 개의 전환 프로세스 버튼과 종료 버튼이 있어야 합니다.

  • 서로 다른 속도 (100 및 200ms 간격)로 개별 LED를 켜고 끄는 두 개의 개별 프로세스를 만듭니다. 이 두 프로세스는 사용자 인터페이스를 사용하여 제어됩니다.


첫 번째 단계는 마스터가 될 프로세스와 슬레이브가 될 프로세스를 결정하는 것입니다. 이 예에서 사용자 인터페이스는 마스터 루프 내부에 배치되고 두 개의 깜박이는 LED 프로세스는 두 개의 슬레이브 루프가 됩니다. 사용자 인터페이스는 로컬 변수를 사용하여 각 슬레이브 루프의 작동을 제어합니다.

이제 LabVIEW 마스터/슬레이브 어플리케이션을 시작할 준비가되었습니다. 최종 마스터/슬레이브 어플리케이션을 보려면 첨부 된 VI (SynchLoops.vi)를여십시오.
 

메시징 아키텍처 (공유 데이터)

문제점 : 여러 루프가 동시에 공유 변수에 데이터를 쓰려고 하면 궁극적으로 어떤 값이 기록 될지 알 수 있는 방법이 없습니다. 이를 경쟁 상태라고합니다.

솔루션 : 글로벌 변수에 쓰는 모든 코드 주변에 "획득/해제 세마포어"쌍을 배치합니다. 이렇게하면 여러 루프가 동시에 글로벌 변수에 쓰기를 시도하지 않습니다. LabVIEW에 포함 된 예제 중에는 세마포어 사용을 보여주는 몇 가지 예제가 있습니다. 세마포어는 경쟁 조건을 피하기 위해 기록되는 동안 글로벌 데이터를 잠급니다.


동기화

문제점 : 마스터/슬레이브 디자인 패턴은 동기화를 기반으로 하지 않기 때문에 슬레이브 루프가 마스터 루프 이전에 실행을 시작할 수 있습니다. 따라서 슬레이브 루프가 실행을 시작하기 전에 마스터 루프를 초기화하는 것이 문제가 될 수 있습니다.

솔루션 : 어커런스는 이러한 종류의 동기화 문제를 해결하는 데 사용할 수 있습니다.


어커런스 사용을 보여주는 예제를 찾으려면 LabVIEW 제공 예제를 참조하십시오. 그림 2는 어커런스 사용 방법에 대한 예를 보여줍니다.


그림 2 : 어커런스 예