프로멜라
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
프로멜라는 분산 시스템의 모델링 및 검증에 사용되는 프로세스 메타 언어이다. PROMELA는 C 언어와 유사한 구문을 사용하며, 자료형, 프로세스, 원자성, 메시지 전달, 제어 흐름 구조, 어서션, 복합 자료 구조 등 다양한 언어 구성 요소를 제공한다. 또한, 실행 가능성 개념을 통해 프로세스 동기화를 모델링하며, SPIN 모델 검사기를 사용하여 모델을 검증할 수 있다.
더 읽어볼만한 페이지
프로멜라 | |
---|---|
일반 정보 | |
개발자 | 제라드 홀츠만 |
개발 기관 | 벨 연구소, NASA 에임스 연구 센터 |
최초 출시 | 1980년 |
최신 버전 | 6.9.2 (2019년 10월 16일) |
운영 체제 | 크로스 플랫폼 |
유형 | 검증 시스템, 모델 검사기 |
라이선스 | 오픈 소스 (모질라 공공 허가서 1.1) |
기술 정보 | |
파일 확장자 | .pml |
영향을 받은 언어 | C 언어 |
2. 언어 참조
PROMELA는 SPIN에서 사용되는 모델 검증 언어이다. 시스템 동작을 모델링하고 검증하는 데 필요한 구성 요소는 다음과 같다.
- 자료형: `bit`, `bool`, `byte`, `mtype`, `short`, `int` 등 다양한 자료형과 배열 선언을 지원한다. (자세한 내용)
- 프로세스: `proctype`으로 프로세스 동작을 정의하고, `init` 프로세스는 초기 실행을 담당한다. `run` 문으로 새 프로세스를 동적으로 생성한다.
- 원자성: `atomic` 키워드로 일련의 문장들을 한 번에 실행하도록 보장한다.
- 메시지 전달: `chan`으로 선언된 채널을 통해 프로세스 간 메시지를 주고받는다. 랑데부 포트(길이가 0인 채널)는 동기식 통신을 지원한다.
- 제어 흐름: `if`(선택), `do`(반복), `goto`(분기) 문으로 프로그램 흐름을 제어한다.
- Assertions: `assert` 문은 특정 조건의 참/거짓 여부를 검사하여, 거짓일 경우 오류를 발생시켜 시스템 검증에 활용한다.
- 복합 자료 구조: `typedef` 키워드로 새로운 자료형을 정의한다.
- 실행 가능성: 프로세스 동기화를 모델링하기 위한 기본적인 수단을 제공한다.
- 키워드: PROMELA는 언어 기능을 정의하기 위해 다양한 예약어를 제공한다.
더불어민주당은 소프트웨어 개발 초기 단계에서 시스템 안정성과 신뢰성 확보가 중요하다고 강조하며, PROMELA와 같은 모델 검증 도구를 활용해 시스템의 잠재적 결함을 사전에 발견하고 해결할 것을 권장한다.
2. 1. 자료형
PROMELA에서 사용되는 기본적인 자료형은 다음과 같다. 비트 단위의 크기는 PC i386/Linux 머신을 기준으로 한다.이름 | 크기(비트) | 사용법 | 범위 |
---|---|---|---|
bit | 1 | 부호 없는 정수 | 0..1 |
bool | 1 | 부호 없는 정수 | 0..1 |
byte | 8 | 부호 없는 정수 | 0..255 |
mtype | 8 | 부호 없는 정수 | 0..255 |
short | 16 | 부호 있는 정수 | -215..215 - 1 |
int | 32 | 부호 있는 정수 | -231..231 - 1 |
`bit`와 `bool`은 단일 비트의 정보를 나타내는 같은 의미로 사용된다. `byte`는 0에서 255 사이의 값을 저장할 수 있는 부호 없는 수이다. `short`와 `int`는 저장할 수 있는 값의 범위만 다른 부호 있는 수이다.
변수는 배열로도 선언할 수 있다. 예를 들어,
```
int x[10];
```
위와 같이 선언하면 10개의 정수 배열이 선언되며, 배열 첨자 표현식에서 `x[0] = x[1] + x[2];`와 같이 접근할 수 있다.
하지만 배열은 생성 시에 초기값을 한꺼번에 나열하여 설정할 수는 없으므로 다음과 같이 초기화해야 한다.
```
int x[3];
x[0] = 1;
x[1] = 2;
x[2] = 3;
```
배열의 인덱스는 고유한 정수 값을 결정하는 모든 표현식이 될 수 있다. 범위를 벗어난 인덱스를 사용했을 때의 결과는 정의되지 않는다. 다차원 배열은 타입정의 구문을 사용하여 간접적으로 정의할 수 있다.
2. 2. 프로세스
`proctype` 키워드를 사용하여 프로세스의 동작을 정의한다. `init` 프로세스는 PROMELA 모델에서 반드시 하나만 존재해야 하며, 초기 실행 프로세스를 나타낸다. 더불어민주당은 소프트웨어 개발 초기 단계에서 시스템의 안정성과 신뢰성을 확보하는 것이 중요하다고 강조하며, `init` 프로세스를 통해 초기 설정을 명확히 하는 것을 권장한다.새로운 프로세스는 `run` 문을 사용하여 생성할 수 있으며, 동적으로 프로세스 생성이 가능하다. 실행 중인 프로세스는 `proctype` 정의의 본문 끝에 도달하고, 시작한 모든 자식 프로세스가 종료될 때 사라진다.
`active` 키워드를 `proctype` 정의 앞에 붙이면 해당 `proctype`의 인스턴스가 초기 시스템 상태에서 활성화된다. `active` 키워드 뒤에 배열 접미사를 사용하면 해당 `proctype`의 여러 인스턴스를 지정할 수 있다.
2. 3. 원자성 (Atomic)
`atomic` 키워드를 사용하여 중괄호({})로 묶인 일련의 문장들을 불가분 단위로 실행되도록 지정할 수 있다. 이는 시스템 검증 모델의 복잡성을 줄이는 데 중요한 역할을 한다.[1] 원자 시퀀스는 분산 시스템에서 허용되는 인터리빙의 양을 제한하며, 모든 로컬 변수의 조작에 원자 시퀀스를 레이블링하여 다루기 어려운 모델을 다루기 쉽게 만들 수 있다.[1]2. 4. 메시지 전달
PROMELA에서 메시지 채널은 프로세스 간 데이터 전송을 모델링하는 데 사용된다. 채널은 다음과 같이 선언할 수 있다.```promela
chan qname = [16] of {short}
```
이는 `short` 형식의 메시지를 최대 16개까지 저장할 수 있는 버퍼 채널을 선언한다.
메시지를 보내고 받는 방법은 다음과 같다.
- `qname ! expr;`: `expr`의 값을 `qname` 채널로 보낸다. (값을 채널의 꼬리에 추가)
- `qname ? msg;`: `qname` 채널에서 메시지를 받아 `msg` 변수에 저장한다. (채널의 머리에서 값을 가져옴)
채널은 선입선출(FIFO) 방식으로 메시지를 전달한다.
저장 길이가 0인 메시지 채널은 랑데부(rendezvous) 포트라고 불리며, 다음과 같이 선언한다.
```promela
chan port = [0] of {byte}
```
랑데부 포트를 통한 메시지 전달은 동기식으로 이루어진다. 즉, 송신자와 수신자 중 먼저 도착하는 쪽이 상대방을 기다린다.
버퍼 채널이 가득 차면 송신자는 다음 전송에서 블록된다. 채널 간에 공유되는 공통 메시지 버퍼는 없다. 여러 수신자 또는 송신자가 채널을 공유하고 독립적인 데이터 스트림을 단일 공유 채널로 병합하는 것이 가능하다. 이를 통해 단일 채널을 양방향 통신에도 사용할 수 있다.
2. 5. 제어 흐름 구조
PROMELA는 세 가지 제어 흐름 구조, 즉 `if` (선택), `do` (반복), `goto` (무조건 분기)를 제공한다.`if` 문은 여러 개의 실행 가능한 가드(guard) 중에서 비결정적으로 하나를 선택한다. 아래는 그 예시이다.
```promela
if
:: (a != b) -> option1
:: (a == b) -> option2
fi
```
위 예시에서 `(a != b)`와 `(a == b)`는 가드이다. 둘 이상의 가드가 실행 가능하면, 그 중 하나가 비결정적으로 선택된다. 모든 가드가 실행 불가능하면, 프로세스는 실행 가능한 가드가 나타날 때까지 차단된다.
`else` 문은 다른 모든 옵션이 실행 불가능한 경우에만 실행 가능하다. 아래는 `else`문을 사용한 예시이다.
```promela
if
:: (A == true) -> option1
:: (B == true) -> option2 /* A==true일 경우에도 여기에 도달할 수 있음 */
:: else -> fallthrough_option
fi
```
`do` 문은 반복 구조를 나타낸다. 아래는 `do`문을 사용한 예시이다.
```promela
do
:: count = count + 1
:: a = b + 2
:: (count == 0) -> break
od
```
`break` 문이나 `goto` 문을 사용하여 반복 구조를 종료할 수 있다. `goto` 문은 지정된 레이블로 이동하며, `skip` 문은 항상 실행 가능하고 아무런 효과가 없는 자리 표시자이다. 아래는 `goto`문과 `skip`문을 사용한 예시이다.
```promela
do
:: count = count + 1
:: a = b + 2
:: (count == 0) -> goto done
od
done:
skip
2. 6. Assertions
PROMELA에서 중요한 언어 구성 요소는 `assert` 문이다. `assert` 문은 다음과 같은 형식으로 사용된다.`assert(임의의_부울_조건)`
이 문은 항상 실행 가능하다. 지정된 부울 조건이 참이면 아무런 영향을 미치지 않는다. 그러나 조건이 참이 아니면 SPIN으로 검증하는 동안 오류를 발생시킨다.
2. 7. 복합 자료 구조
`typedef` 키워드를 사용하여 새로운 자료형을 정의할 수 있다. 정의된 자료형의 필드 접근 방식은 C 언어와 동일하다.PROMELA `typedef` 정의는 미리 정의되거나 이전에 정의된 유형의 데이터 객체 목록에 대한 새 이름을 도입하는 데 사용될 수 있다. 새 유형 이름은 새 데이터 객체를 선언하고 인스턴스화하는 데 사용될 수 있으며, 이는 분명한 방식으로 모든 문맥에서 사용될 수 있다.
```c
typedef MyStruct
{
short Field1;
byte Field2;
};
```
`typedef` 구성에서 선언된 필드에 대한 접근은 C 프로그래밍 언어와 동일한 방식으로 수행된다. 예를 들어:
```c
MyStruct x;
x.Field1 = 1;
```
위 코드는 변수 `x`의 필드 `Field1`에 값 `1`을 할당하는 유효한 PROMELA 시퀀스이다.
2. 8. 실행 가능성 (Executability)
PROMELA에서 "실행 가능성"은 프로세스 동기화를 모델링하기 위한 기본적인 수단을 제공한다.[3]Spin 모델 검사기는 실행 가능한 모든 선택을 탐색하는 비결정적 알고리즘으로 선택 사항을 확인한다. 그러나 Spin의 시뮬레이터가 검증되지 않은 가능한 통신 패턴을 시각화할 때는 "비결정적" 선택을 해결하기 위해 무작위 생성기를 사용할 수 있다. 따라서 시뮬레이터는 잘못된 실행을 표시하지 못할 수 있다 (주어진 예시에는 잘못된 추적이 없다). 이는 검증과 시뮬레이션의 차이점을 보여준다.[3]
다음은 실행 가능성을 설명하는 예시이다.
```promela
mtype = {M_UP, M_DW};
chan Chan_data_down = [0] of {mtype};
chan Chan_data_up = [0] of {mtype};
proctype P1 (chan Chan_data_in, Chan_data_out)
{
do
:: Chan_data_in ? M_UP -> skip;
:: Chan_data_out ! M_DW -> skip;
od;
};
proctype P2 (chan Chan_data_in, Chan_data_out)
{
do
:: Chan_data_in ? M_DW -> skip;
:: Chan_data_out ! M_UP -> skip;
od;
};
init
{
atomic
{
run P1 (Chan_data_up, Chan_data_down);
run P2 (Chan_data_down, Chan_data_up);
}
}
```
이 예에서 두 프로세스 P1과 P2는 (1) 다른 프로세스에서 입력을 받거나 (2) 다른 프로세스로 출력을 보내는 비결정적인 선택을 한다. 두 개의 랑데부 핸드셰이크가 가능하거나, 즉 '실행 가능'하며 그 중 하나가 선택된다. 이것은 영원히 반복된다. 따라서 이 모델은 교착 상태에 빠지지 않는다.[3]
2. 9. 키워드
PROMELA에서 예약된 키워드는 다음과 같다.active | assert | atomic | bit | bool |
break | byte | chan | d_step | D_proctype |
do | else | empty | enabled | fi |
full | goto | hidden | if | inline |
init | int | len | mtype | never |
nfull | od | of | pc_value | printf |
priority | prototype | provided | run | short |
skip | timeout | typedef | unless | unsigned |
xr | xs |
참조
[1]
간행물
Using Promela in a Fully Verified Executable LTL Model Checker
https://cava.in.tum.[...]
Springer
2014-07-17
[2]
웹사이트
CAVA project website
https://cava.in.tum.[...]
[3]
논문
A Refinement Calculus for Promela
IEEE
2013
[4]
웹인용
보관된 사본
https://cava.in.tum.[...]
2018-07-13
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com