로컬과 글로벌 변수를 사용시 유의 사항
- 업데이트 날짜:2025-08-27
- 4분 (읽기 시간)
로컬과 글로벌 변수는 고급 LabVIEW 개념에 속합니다. 이 변수는 원래 LabVIEW 데이터 흐름 실행 모델의 일부가 아닙니다. 로컬과 글로벌 변수를 사용할 때 블록다이어그램이 읽기 어려워질 수 있으므로 주의해서 변수를 사용해야 합니다. 커넥터 팬 대신에 로컬 또는 글로벌 변수를 사용하거나 시퀀스 구조의 각 프레임마다 값에 접근하기 위해 로컬과 글로벌 변수를 사용하는 것과 같이 이들을 잘못 사용하면, VI에서 예상치 못한 결과를 초래할 수도 있습니다. 블록다이어그램 전체를 지나는 긴 와이어를 피하기 위해서나, 또는 데이터 흐름 대신에 변수를 사용한다는지와 같이 로컬 변수 및 글로벌 변수를 과도하게 사용하면 성능이 느려질 수 있습니다.
로컬과 글로벌 변수 초기화하기
로컬 변수나 글로벌 변수를 초기화하려면 VI를 실행하기 전, 알려진 값을 변수에 씁니다. 확인하지 않는 경우, VI가 올바르지 않은 작동을 일으키게 하는 데이터가 변수에 포함되어 있을 수 있습니다. 변수의 초기값이 연산 결과에 의존할 경우, LabVIEW가 반드시 다른 동작을 위해 변수에 접근하기 전에 변수에 해당 값을 쓰도록 합니다. 쓰기 동작이 VI의 나머지 부분과 병렬로 작동하도록 연결하면 경합 조건이 발생할 수 있습니다.
VI의 다른 작업들이 실행되기 전에 변수가 처음으로 시작되도록 하려면 변수에 초기값을 쓰는 코드를 시퀀스 구조의 첫 번째 프레임이나 SubVI에 따로 두고, 해당 SubVI를 연결하여 블록다이어그램의 데이터 흐름에서 첫 번째로 실행되도록 합니다.
VI가 변수를 처음으로 읽기 전에 이 변수를 초기화하지 않으면 이 변수는 연결된 프런트패널 객체의 기본값을 갖습니다.
글로벌 또는 로컬 변수 값이 다이어그램의 다른 항목에 연결되면, 변수가 변경될 때 와이어의 값이 변경되지 않습니다. 와이어 값을 업데이트하려면, 변경 후에 변수의 값을 읽어야 합니다.
경합 조건
두 개 혹은 그 이상의 코드가 병렬 실행되고, 공유 메모리에 접근할 수 있을 때 경합 조건이 발생할 수 있습니다. 각 코드가 독립적이라면, LabVIEW가 어떤 순서로 공유하는 리소스에 접근할지 구분할 수 없습니다.
경합 조건은 예상치 못한 결과를 초래할 수도 있습니다. 예를 들어, 두 개의 독립적인 코드가 큐에 접근할 때, 사용자가 LabVIEW가 큐에 어떤 순서로 접근할지 제어하지 않으면, 경합 조건이 발생할 수도 있습니다.
경합 조건은 프로그램의 타이밍이 바뀜에 따라 나타나거나, 사라질 수 있기 때문에 위험할 수도 있습니다. 경합 조건은 OS를 바꿨을 때, 또는 LabVIEW 버전이나 다른 소프트웨어를 바꿨을 때 발생할 수 있습니다.
OS나 LabVIEW 버전의 업그레이드 등으로 VI 타이밍에 변화가 생기면, 같은 데이터에 접근하는 병렬 코드를 찾아 타이밍 조건을 이용하여 어떤 작업이 먼저 실행될지를 제어합니다.
로컬 변수와 글로벌 변수 이용 시 경합 조건
경합 조건은 하나 이상의 작업이 함께 공유하는 데이터 값을 업데이트할 때마다 발생할 수 있지만, 로컬과 글로벌 변수를 사용할 때, 또는 외부 파일을 사용할 때 종종 발생하기도 합니다. 다음 블록다이어그램은 로컬 변수에서 경합 조건의 예제를 보여줍니다.
이 VI의 출력(로컬 변수 x의 값)은 어떤 작업이 먼저 실행하느냐에 따라 달라집니다. 각 작업이 x에 다른 값을 쓰면, 결과가 7인지 3인지 알 수 없습니다. 일부 프로그래밍 언어에서는, 위에서 아래로의 데이터 흐름 패러다임이 실행 순서가 됩니다. LabVIEW에서는, 와이어링을 사용하여 경합 조건이 생기지 않게 하면서 변수에서 여러 작업을 수행할 수 있습니다. 다음 블록다이어그램은 로컬 변수 대신 와이어링을 사용해 추가적인 작업을 수행합니다.
두 작업이 병렬적으로 글로벌 변수를 업데이트하려고 할 때에도 경합 조건이 발생합니다. 글로벌 변수를 업데이트하기 위해 값을 읽고, 수정하고, 원래의 위치에 다시 쓰는 작업이 수행됩니다. 첫 작업이 읽기-수정하기-쓰기 동작을 수행하고 뒤이어 두번째 작업이 따르면, 그 결과는 예상할 수 있고 바르게 나옵니다. 첫번째 작업이 읽은 후에 두번째 작업이 읽으면, 두 작업 모두가 값을 수정하고 쓰게 됩니다. 이 동작은 읽기-수정하기-쓰기 경함 조건을 야기하고, 유효하지 않거나 찾을 수 없는 값을 생성합니다.
글로벌 변수와 관련된 경합 조건을 방지하려면 기능적인 글로벌 변수를 사용하여 변수에서 해당 작업에 접근하는 코드의 중요 섹션을 보호할 수 있습니다. 여러 로컬 또는 글로벌 변수 대신 하나의 기능적인 글로벌 변수를 사용하면 한 번에 하나의 작업만 실행되므로 작업이 서로 상충되거나 저장된 데이터에 상충되는 값을 할당하는 것을 피할 수 있습니다.
루프 내 변수 동작
변수가 여러 병렬 루프를 컨트롤하는 경우, 루프는 변수가 작성된 후 실행되어야 하며 각 루프의 각 반복에서 변수를 읽어야 합니다.
시스템이 다시 시작되면, 변수를 읽는 루프가 실행되기 전에 변수를 적절한 시작 조건으로 설정해야 합니다. 그렇지 않으면 루프가 조기에 정지됩니다.
로컬 변수 사용 시 메모리 관리
로컬 변수는 데이터 버퍼의 복사본을 생성합니다. 로컬 변수에서 데이터를 읽어올 때, 이와 연결된 컨트롤의 데이터에 대한 새로운 버퍼를 생성하게 됩니다.
로컬 변수를 사용하여 대량의 데이터를 블록다이어그램의 한 위치에서 다른 위치로 이동하는 경우, 일반적으로 와이어를 사용한 데이터 전송보다 더 많은 메모리를 사용하게 되어 결국 실행 속도가 느려지게 됩니다. 실행시 데이터를 저장해야하는 경우, 시프트 레지스터 사용을 고려하십시오.
글로벌 변수 사용 시 메모리 관리
글로벌 변수에서 데이터를 읽어올 때, LabVIEW는 그 글로벌 변수에 저장된 데이터의 복사본을 생성합니다.
대용량의 배열이나 문자열를 다루는 경우, 글로벌 변수를 관리하려면 상당한 시간과 메모리가 요구됩니다. 배열의 글로벌 변수를 다루는 경우, LabVIEW는 한 개의 배열 원소를 수정하더라도 배열 원소 전체를 저장하고 편집하므로 비효율적입니다. 어플리케이션의 여러 장소에서 글로벌 변수를 읽으면, 여러개의 메모리 버퍼가 만들어지므로 비효율적이며 시스템의 성능을 저하시킵니다.
LabVIEW에서 고려해야 할 성능 및 메모리 관리에 대한 추가적인 정보는 성능과 메모리 관리하기를 참조하십시오.