전략적으로 [기다림(ms)] 함수를 사용하거나 VI 프로퍼티 대화 상자의 실행항목에서 우선순위 셋팅을 변경하여 병렬 작업의 우선순위를 정합니다.

대부분의 경우, VI의 기본 우선순위를 변경해서는 안됩니다. 우선순위를 사용하여 실행 순서를 컨트롤해도 반드시 원하는 결과가 나오지는 않습니다. 올바르게 사용되지 않는 경우, 낮은 우선순위의 작업은 완전히 배제될 수 있습니다. 높은 우선순위의 작업이 오랫동안 실행되도록 설계된 경우, 낮은 우선순위의 작업은 높은 우선순위의 작업이 주기적으로 대기하지 않는 한 실행되지 않습니다.

기다림 함수 사용하기

기다림 함수를 사용하여 우선순위가 낮은 작업이 낮은 빈도로 실행되도록 할 수 있습니다. 예를 들어, 몇 개의 루프가 병렬로 존재하며 그 중 일부를 더 자주 실행하고자 하는 경우, 낮은 우선순위의 작업에 기다림 함수를 사용하십시오. 이렇게 하면 더 많은 시간이 다른 작업에 할애됩니다. 많은 경우, 기다림 함수를 사용하면 충분합니다. 파일≫VI 프로퍼티를 선택하고 VI 프로퍼티 대화 상자에서 실행을 선택하여 우선순위를 변경하지 않아도 될 것입니다.

동기화/차단 노드 섹션에서 설명했듯이, 블록다이어그램이 기다릴 때 컴퓨터는 블록다이어그램을 큐에서 제거하여 다른 작업이 실행될 수 있도록 합니다.

기다림 함수는 사용자 인터페이스를 폴링하는 루프에 가장 유용합니다. 100에서 200ms 기다림은 거의 눈에 띄지 않으나, 어플리케이션을 작업에서 해제하여 다른 작업을 더 효율적으로 처리하게 해줍니다. 또한, 기다림은 OS를 해제하여 다른 스레드 또는 어플리케이션에 더 많은 시간을 할당하도록 합니다. 블록다이어그램의 우선순위가 낮은 섹션에 기다림을 추가하여 다른 작업에 더 많은 시간을 할당하는 것을 고려하십시오.

기다림 (ms) 함수를 사용하면, LabVIEW는 사용자가 지정한 시간만큼 기다립니다. 다음 ms 배수까지 기다림 함수를 사용하면, LabVIEW는 밀리초 카운터를 모니터하고, 카운터가 사용자가 지정한 수의 배수가 될 때까지 기다립니다.

우선순위 변경

또한 파일≫VI 프로퍼티를 선택한 후 VI 프로퍼티 대화 상자에서 실행을 선택하여 우선순위를 변경할 수 있습니다. 최하위에서 최상위 순서로 나열된 다음 우선순위 레벨 중에서 선택할 수 있습니다.

  • 배경 우선순위(최하위)
  • 표준 우선순위
  • 표준 우선순위 이상
  • 높은 우선순위
  • 시간에 결정적인 우선순위(최상위)
  • 서브루틴 우선순위

처음 다섯 우선순위는 작동이 유사하나(최하위에서 최상위), 서브루틴 우선순위는 추가적인 특징이 있습니다. 다음 두 섹션은 서브루틴 레벨을 제외한 모든 우선순위에 적용됩니다.

사용자 인터페이스 실행 시스템에서의 우선순위

멀티스레드 어플리케이션의 사용자 인터페이스 실행 시스템에서 실행 시스템 큐는 여러 개의 입력 포인트를 갖습니다. 실행 시스템은 큐에서 상위 우선순위 VI를 하위 우선순위 VI 앞에 둡니다. 상위 우선순위 작업이 실행 중이고 큐에 하위 우선순위 작업만이 있는 경우, 상위 우선순위 VI가 계속해서 실행됩니다. 예를 들어, 실행 큐에 각 우선순위 레벨의 두 VI가 있는 경우, 시간에 결정적인 VI는 두 VI가 완료될 때까지 독점적으로 실행 시간을 공유합니다. 그 후, 높은 우선순위 VI가 두 VI가 완료될 때까지 독점적으로 실행 시간을 공유합니다. 그러나, 높은 우선순위 VI가 기다리는 함수를 호출하는 경우, 실행 시스템은 기다림 또는 I/O가 완료될 때까지 큐에서 높은 우선순위 VI를 제거하고, 다른 작업(낮은 우선순위를 가진)의 실행을 지정합니다. 기다림 또는 I/O가 완료될 때, 실행 시스템은 대기 중인 작업을 큐의 하위 우선순위 작업 앞에 다시 끼워 넣습니다.

또한, 우선순위가 높은 VI가 우선순위가 낮은 SubVI를 호출하는 경우, 호출 VI가 실행 중이 아닌 경우에도 해당 SubVI는 호출하는 VI의 가장 높은 우선순위를 상속합니다. 결과적으로, subVI의 우선순위 레벨을 올리기 위해 VI가 호출하는 subVI의 우선순위 레벨을 변경할 필요가 없습니다.

다른 실행 시스템과 멀티스레드 어플리케이션에서 우선순위

각 실행 시스템은 서브루틴 우선순위 레벨과 사용자 인터페이스 실행 시스템은 제외하고, 각 우선순위 레벨에 대해 별도의 실행 시스템을 갖습니다. 각 우선순위 시스템에는 고유의 큐와 해당 큐의 블록다이어그램을 처리하기 위한 두 개의 스레드가 있습니다.

6개의 실행 시스템을 가지는 대신, 우선순위와 관계없이 사용자 인터페이스 시스템을 위해 한 개의 실행 시스템이 있고 기타 시스템을 위해 25개의 실행 시스템이 있습니다. 이것은 5개의 실행 시스템에 5개의 우선순위 레벨 중 각각에 대해 5개를 곱한 것입니다.

OS는 이 분류에 기초하여 각 실행 시스템의 스레드에 OS 우선순위 레벨을 지정합니다. 그러므로, 일반적인 실행에서 상위 우선순위 작업은 하위 우선순위 작업보다 더 많은 시간을 얻습니다. 사용자 인터페이스 실행 시스템에서의 우선순위와 같이, 하위 우선순위 작업은 상위 우선순위 작업이 주기적으로 기다리지 않는 한 실행되지 않습니다.

몇몇 OS는 주기적으로 하위 우선순위 작업의 우선순위 레벨을 올려 이 문제를 피하려 합니다. 이런 OS에서는 상위 우선순위 작업이 계속 실행되려하는 경우에도 하위 우선순위 작업이 주기적으로 실행될 기회를 얻습니다. 그러나 이런 작동은 OS마다 다릅니다. 일부 OS에서는 이런 동작과 작업의 우선순위를 조정할 수 있습니다.

사용자 인터페이스 실행 시스템은 단일 스레드형 입니다. 사용자 인터페이스 스레드는 다른 실행 시스템의 표준 우선순위를 사용합니다. 그러므로 표준 우선순위 이상의 표준 실행 시스템에서 VI가 실행되도록 설정하는 경우, 사용자 인터페이스 실행 시스템은 실행되지 않을 수 있으며, 이로 인해 사용자 인터페이스가 느려지거나 응답을 하지 않을 수 있습니다. 마찬가지로, VI를 배경 우선순위에서 실행되도록 설정하는 경우 사용자 인터페이스 실행 시스템보다 낮은 우선순위로 실행됩니다.

이전에 설명한 바와 같이, VI가 낮은 우선순위의 subVI를 호출하는 경우, 호출 기간 동안 subVI는 호출자와 같은 우선순위 레벨로 올라갑니다.

서브루틴 우선순위 레벨

서브루틴 우선순위 레벨은 VI가 최대한 효율적으로 실행되도록 합니다. 서브루틴 우선순위를 설정한 VI는 다른 VI와 실행 시간을 공유하지 않습니다.

VI가 서브루틴 우선순위 레벨에서 실행될 때, VI는 실행되는 스레드를 효율적으로 컨트롤하며 호출자와 같은 스레드에서 실행됩니다. 다른 VI가 서브루틴 우선순위 레벨에 있는 경우에도 서브루틴 VI가 실행을 마칠 때까지 다른 VI는 해당 스레드에서 실행될 수 없습니다. 단일 스레드 어플리케이션에서, 다른 VI는 실행되지 않습니다. 실행 시스템에서, 서브루틴을 실행하는 스레드는 다른 VI를 처리하지 않으나 실행 시스템의 두 번째 스레드는 다른 실행 시스템과 함께 계속 VI를 실행할 수 있습니다.

다른 VI와 시간을 공유하지 않는 것에 덧붙여서, 서브루틴 VI 실행은 간소화되어 프런트패널 컨트롤과 인디케이터는 서브루틴이 호출될 때 업데이트되지 않습니다. 서브루틴 VI 프런트패널은 실행에 대해 아무 정보도 보여주지 않습니다.

서브루틴 VI는 다른 서브루틴 VI를 호출할 수 있으나, 다른 우선순위의 VI를 호출할 수는 없습니다. 서브루틴 우선순위 레벨은 단순한 계산을 수행하는 subVI의 오버헤드를 최소화하려는 경우 사용합니다.

또한, 서브루틴은 실행 큐와 상호작용하도록 설계되지 않았기 때문에 LabVIEW가 큐에서 서브루틴을 빼도록 하는 함수는 호출할 수 없습니다. 즉, 기다림, GPIB, VISA, 또는 대화 상자 함수는 모두 호출할 수 없습니다.

서브루틴은 시간에 결정적인 어플리케이션에서 유용한 추가적인 특징을 가지고 있습니다. SubVI에서 마우스 오른쪽 버튼을 클릭한 후 바로 가기 메뉴에서 사용중이면 서브루틴 호출 건너뛰기를 선택하는 경우, 서브루틴이 현재 다른 스레드에서 실행되고 있는 경우 실행 시스템은 호출을 건너뜁니다. 이것은 실행 시스템이 안전하게 서브루틴이 실행하는 작업을 건너뛰는 시간에 결정적인 루프에 유용합니다. 또한, subVI가 작업을 끝내기를 기다리는 시간을 피하려는 경우에도 유용합니다. SubVI의 실행을 건너뛰는 경우, subVI의 모든 출력은 subVI 프런트패널 인디케이터의 기본값이 됩니다.