tl; dr Упорядочение ресурсов предотвращает взаимоблокировку и для блокировок чтения-записи.
Длинный ответ:
Нарисуйте график ожидания следующим образом:
Сначала нарисуйте вершину для всех ресурсов слева направо в
установленный порядок.
Затем для каждого процесса, ожидающего ресурса, нарисуйте вершину,
непосредственно перед вершиной ожидаемого ресурса.
Если процесс не ожидает каких-либо ресурсов, нарисуйте вершину
в дальнем правом углу после всех вершин ресурса.
Затем проведите грань от каждого процесса до ресурса, на котором это
процесс ожидает и отрисовывает грань от каждого ресурса до
процесс, который в настоящее время содержит этот ресурс.
Рассмотрим каждое ребро на графике. Есть два случая:
край равен Pi -> Ri
, то есть от процесса к ресурсу. Так как каждый
Процесс ожидает только на одном ресурсе, и мы нарисовали
обрабатывать вершину непосредственно слева от ресурса
в ожидании, то край слева направо.
край равен Ri -> Pj
, т.е. от ресурса к процессу. Если Pj
не дожидаясь какого-либо ресурса, его вершина находится справа от
все ресурсы, поэтому край слева направо. Если Pj
ожидает Rk
, затем i < k
, потому что процессы получают ресурсы в
порядок. Если i < k
, то Ri
слева от Rk
и Pj
сразу слева от Rk
(так как мы нарисовали графику таким образом),
следовательно, Ri
слева от Pj
, поэтому край снова остается
правый.
Поскольку все ребра графика, построенные таким образом, расположены слева направо
Хорошо, тогда мы построили топологическую сортировку графа,
следовательно, в графике нет циклов, следовательно, тупик не может возникнуть.
Обратите внимание, что факт ожидания процесса, а не почему
ждет. Таким образом, не имеет значения, ожидает ли он мьютекса,
блокировка чтения-записи, семафор или что-то еще - эта стратегия тупика
профилактика для всех.