ИМХО , №
Следует список необходимых условий для тупика , как показано в Википедии:
тупикСитуация с ресурсом может возникнуть тогда и только тогда, когда в системе одновременно выполняются все следующие условия:
Взаимное исключение: Как минимумодин ресурс должен храниться в режиме без общего доступа.В противном случае процессы не будут лишены возможности использовать ресурс при необходимости.Только один процесс может использовать ресурс в любой момент времени.
Удержание и ожидание или удержание ресурса: процесс в настоящее время удерживает хотя бы один ресурс и запрашиваетдополнительные ресурсы, которые удерживаются другими процессами.
Нет приоритет : ресурс может быть освобожден только добровольно процессом, который его удерживает.
Циклическое ожидание: каждый процесс должен ожидать ресурс, который удерживается другим процессом, который, в свою очередь, ожидает, пока первый процесс освободит ресурс,В общем, существует набор ожидающих процессов, P = {P1, P2,…, PN}, так что P1 ожидает ресурс, удерживаемый P2, P2 ожидает ресурс, удерживаемый P3и так далее до тех пор, пока PN не ожидает ресурс, содержащийся в P1.
Эти четыре условия известны как условия Кофмана из их первого описания в статье 1971 года Эдвард Дж. Коффман, мл.
Ваша модель включает в себя процесс, который зависает вечно , но нет общего ресурса , нет другого процесса s удерживает его, нет циклического ожидания и т. д. Другими словами, это просто процесс, которому нечего выполнять в течение бесконечного количества времени,потому что one
назначается false
по умолчанию, а выражение, оцениваемое как false
, всегда блокируется в Promela .
Простой пример взаимоблокировки, взятый из лекции «Спин: Введение», проводимый в Университете Тренто ранееs год, следующий.
file: mutex_simple_flaw2.pml
bit x, y;
byte cnt;
active proctype A() {
again:
x = 1;
y == 0; /* waits for process B to end: if y != 0, the execution of this
statement is blocked here */
cnt++;
/* critical section */
printf("Process A entered critical section.\n");
assert(cnt == 1);
cnt--;
printf("Process A exited critical section.\n");
x = 0;
goto again
}
active proctype B() {
again:
y = 1;
x == 0;
cnt++;
/* critical section */
printf("Process B entered critical section.\n");
assert(cnt == 1);
cnt--;
printf("Process B exited critical section.\n");
y = 0;
goto again
}
Эта модель заходит в тупик, когда процессы A
и B
"современно " выполнить инструкции x = 1
и y = 1
.
Об этом свидетельствует следующий проверочный поиск, который сигнализирует о существовании недопустимого конечного состояния , которое соответствуеттрассировка выполнения, удовлетворяющая всем условиям Кофмана :
~$ spin -search -bfs mutex_simple_flaw2.pml
pan:1: invalid end state (at depth 2)
pan: wrote mutex_simple_flaw2.pml.trail
(Spin Version 6.4.8 -- 2 March 2018)
Warning: Search not completed
+ Breadth-First Search
+ Partial Order Reduction
Full statespace search for:
never claim - (none specified)
assertion violations +
cycle checks - (disabled by -DSAFETY)
invalid end states +
State-vector 20 byte, depth reached 2, errors: 1
8 states, stored
8 nominal states (stored-atomic)
1 states, matched
9 transitions (= stored+matched)
0 atomic steps
hash conflicts: 0 (resolved)
Stats on memory usage (in Megabytes):
0.000 equivalent memory usage for states (stored*(State-vector + overhead))
0.291 actual memory usage for states
128.000 memory used for hash table (-w24)
128.195 total actual memory usage
pan: elapsed time 0 seconds
Следящая за ошибкой трассировка выполнения, найденная Spin
, следует:
~$ spin -t -p -g -l mutex_simple_flaw2.pml
using statement merging
1: proc 1 (B:1) mutex_simple_flaw2.pml:24 (state 1) [y = 1]
y = 1
2: proc 0 (A:1) mutex_simple_flaw2.pml:7 (state 1) [x = 1]
x = 1
3: proc 0 (A:1) mutex_simple_flaw2.pml:8 (state 2) [((y==0))]
transition failed
spin: trail ends after 3 steps
#processes: 2
x = 1
y = 1
cnt = 0
3: proc 1 (B:1) mutex_simple_flaw2.pml:25 (state 2)
3: proc 0 (A:1) mutex_simple_flaw2.pml:8 (state 2)
2 processes created
Ваша модель также приводит к «недопустимому конечному состоянию» .Однако это не означает, что это обязательно deadlock , это только означает, что трассировка выполнения завершается до того, как процессы достигнут конца своего блока кода.В зависимости от моделируемой системы это не всегда актуальная проблема.