PROMELA 문제로 머리를 감쌀 수 없습니다. 채널 ("to_pc")을 통해 메시지를 보내고받을 수있는 N 개의 프로세스 ("pc")가 있습니다. 각 프로세스에는 메시지를 수신하는 자체 채널이 있습니다. 프로세스가 수신하려면 들어오는 메시지의 채널을 확인하는 루프를 유지해야합니다. 두 번째 루프 옵션으로 프로세스는 다른 모든 채널에 메시지를 전송합니다.PROMELA 프로세스에서 시간 초과/교착 상태없이 송수신하는 방법은 무엇입니까?
그러나 시뮬레이션 모드에서는 항상 아무것도 보내지 않고 시간 초과가 발생합니다. 지금까지의 이론은 모든 프로세스가 즉시 보내려고하는 교착 상태를 만들었 기 때문에 (코드의 "보내기"부분에 갇혀 있기 때문에) 모두 수신하지 못하게되었습니다.
지금까지이 문제를 해결할 수 없었습니다. 전역 변수를 세마포 (semaphore)로 사용하여 송신을 금지하고 있으므로 한 채널 만 보낼 수 있습니다. 그러나 이로 인해 결과가 변경되지 않았습니다. 나의 유일한 다른 아이디어는 송신을위한 트리거로서 타임 아웃을 사용하는 것이지만, 이것은 나에게 옳은 것처럼 보이지 않는다.
아이디어가 있으십니까? 미리 감사드립니다!
#define N 4
mtype={request,reply}
typedef message {
mtype type;
byte target;
byte sender;
};
chan to_pc[N] = [0] of {message}
inline send() {
byte j = 0;
for (j : 0 .. N-1) {
if
:: j != address ->
to_pc[j]!msg;
:: else;
fi
}
}
active [N] proctype pc(){
byte address = _pid;
message msg;
do
:: to_pc[address]?msg -> /* Here I am receiving a message. */
if
::msg.type == request->
if
:: msg.target == address ->
d_step {
msg.target = msg.sender
msg.sender = address;
msg.type = reply;
}
send();
:: else
fi
:: msg.type == reply;
:: else;
fi
:: /* Here I want to send a message! */
d_step {
msg.target = (address + 1) % N;
msg.sender = address;
msg.type = request;
}
send();
od
};
이 상세한 답변을 보내 주셔서 감사합니다. 사실 제가 설명한 문제를 해결했습니다. 이제 메시지 내용을 전송하기 전에 메시지 내용을 설정하는 방법 만 찾아야합니다. 이 예제에서는 기본적으로 일정하지만 문제를 해결하기 위해 단순화했습니다. 어쨌든, 다시 한번 감사드립니다. –
@ K.Huber는 각각의 'out! stuff' 문에'else '를 제공합니다. 'else'는'main loop'의 시작 부분에서 당신을 되돌릴 것이고,'send'로 되돌아 올 때마다 당신은 처음부터 시작하기보다는 당신이 보낼 수 있었던 최신 색인'j'에서 재개 할 것입니다. 이런 식으로, * send *를 수행 할 수 없을 때마다 *받을 수 있는지 평가할 기회가 있습니다. –
확인 모드에서 실행할 때 "i/o와 결합 된 else의 모호한 사용"오류가 발생하지 않습니까? –