경합조건 : 랩뷰의 코드 실행 순서
- LabVIEW 랩뷰/Labview 랩뷰 강의
- 2021. 1. 8.
안녕하세요. 이번 강의에서는 랩뷰에서 어떤 코드가 먼저 실행되는지에 대해 알아보도록 하겠습니다. 경합 조건이 일어나는 경우와 경합 조건을 막기 위해 사용하는 구조, 방법등에 대해서 알아보겠습니다.
1. 경합 조건
텍스트 기반의 프로그래밍 언어는 텍스트 라인 순서대로 코드가 실행됩니다. 아래와 같은 코드에서 실행 순서는 line1->2->3->4 순으로 실행됩니다.
x=1 #line 1
y=5 #line 2
result_sum = x+y #line 3, result_sum의 결과는 6
result_sum = x+result_sum #line 4, result_sum의 결과는 1+6이므로 7
따라서 텍스트 기반의 코드에서 line 4까지 실행했을 때 result_sum의 결과는 항상 7입니다.
랩뷰에서 위의 텍스트 기반 코드와 비슷하게 코드를 짜 보면 아래와 같습니다. result_sum 인디케이터는 아직 프로그램을 실행하기 전이라서 기본값인 0으로 디스플레이 되어 있습니다.
랩뷰는 그림처럼 소스 코드를 작성하면서 프로그래머가 꼭 신경써야 할 문제가 있습니다. 위의 블록 다이어그램에서 '1번 더하기와 2번 더하기 둘 중에 어느 더하기가 먼저 실행되는가?' 를 생각해 봅시다. 결론을 먼저 말하면 '알 수 없음' 입니다. 랩뷰는 텍스트 기반 언어와 다르게 함수의 위치에 따라서 함수의 실행 순서가 결정되지 않습니다. 1번 더하기와 2번 더하기 함수는 동일한 순서에 놓여 있고, 어느 더하기가 먼저 실행되는지 알 수 없습니다. 이것을 '경합 조건(Race Condition)'이라고 합니다.
경합 조건은 특히 로컬 변수(Local variable) 및 전역 변수(Global variable)을 사용할 때 문제가 많이 일어납니다. [그림 1]의 블록 다이어그램에서 맨 위에 있는 result_sum은 인디케이터이고, 그 아래 2번 더하기 양쪽에 있는 사각형 안의 집 모양이 있는 result_sum 이 로컬 변수입니다.
로컬 변수는 result_sum 인디케이터를 소스코드 내의 다른 곳에서 다시 읽거나 쓸 때 사용합니다. 로컬 변수와 글로벌 변수에 대한 자세한 이야기는 다른 강의에서 하도록 하겠습니다.
위와 같은 코드를 직접 만들고 계속 실행해 보면 신기하게도 하나의 값만 계속 나올 수도 있습니다. 그러면 경합 조건이 아닌 것이 아니냐? 라고 말씀하실 수도 있습니다. 하지만 실제로는 경합 조건이 맞고, 윈도우의 타이밍이나 랩뷰를 껐다 켜거나 하면 결과가 달라질 수 있습니다. 경합 조건인데도 불구하고 마치 경합 조건이 아닌 것 처럼 결과가 동일하게 나오는 순간, 버그를 인지하지 못하고 소스코드를 작성하게 되고 이건 더 위험한 결과를 초래합니다. 따라서 랩뷰에서는 항상 소스코드의 실행 순서를 신경써야 합니다.
랩뷰에서는 경합 조건을 막기 위해서 여러가지 방법으로 프로그램의 실행 순서를 지정할 수 있습니다.
2. 경합 조건을 방지하는 방법
- 플랫 시퀀스(Flat Sequence) 구조 사용하기
플랫 시퀀스 구조는 대표적으로 랩뷰에서 실행 순서를 강제하는 방법입니다. 마치 영화 필름처럼 만들어져 있고, 각 필름 안의 코드가 순서대로 실행됩니다. 플랫 시퀀스 구조는 블록 다이어그램의 Structures - Flat Sequence를 클릭하여 삽입할 수 있습니다.
아래 gif는 1번 더하기 함수와 2번 더하기 함수를 Flat Sequence 구조를 통해서 순차적으로 실행되도록 만드는 방법입니다. 중간에 프레임을 추가하는 것은 Add Frame After 메뉴를 클릭했습니다.
- 다층 시퀀스(Stacked Sequence)구조 사용하기 : 추천하지 않습니다.
다층 시퀀스 구조는 플랫 시퀀스 구조를 블록 다이어그램의 공간을 절약하기 위하여 사용하는 방법으로 한 번에 한 프레임을 보여줍니다. 0번 프레임에서 1번 프레임으로 데이터를 전달하기 위해서는 시퀀스 로컬(Sequence Local)이라는 터미널을 만들어서 데이터를 전달해야 합니다.
이 구조는 순서대로 코드를 실행하고 블록 다이어그램의 공간을 절약한다는 점에서는 좋지만 나중에 코드를 분석할 때, 상당히 불편한 구조입니다. 하나하나의 프레임을 모두 확인하면서 소스코드를 분석해야 합니다. (플랫 시퀀스 구조는 한눈에 보이기라도 합니다.) 따라서 저는 다층 시퀀스 구조를 사용하는 것을 추천하지 않습니다.
- 에러 핸들러(Error Handler)를 사용하기 : 가장 추천하는 방법
에러 핸들러를 사용하여 소스 코드의 실행 순서를 강제하는 것은 경합 조건을 방지하는 데 가장 좋은 방법입니다. 하지만 위의 예제를 에러 핸들러를 이용하려면 SubVI를 만드는 방법과 에러 핸들러에 대한 설명을 먼저 해야 할 것 같습니다. 이후 강의에서 SubVI를 만들고 사용하는 방법에 대해서 설명하고, 강의가 완성되면 이후 단계를 추가 작성하도록 하겠습니다.
'LabVIEW 랩뷰 > Labview 랩뷰 강의' 카테고리의 다른 글
랩뷰 배열 다루기 (0) | 2021.01.11 |
---|---|
랩뷰의 루프(Loop) 사용하기 (4) | 2021.01.10 |
랩뷰 데이터 구조 알아보기 (0) | 2021.01.08 |
컨트롤, 인디케이터란 무엇인가? (0) | 2021.01.07 |
랩뷰 추천 설정 적용하기 (0) | 2021.01.07 |