tl; drリソースの順序付けにより、リーダー/ライターロックのデッドロックも防止されます。
長い答え:
次のような待機グラフを描画します。
まず、すべてのリソースの頂点を左から右に所定の順序で描画します。
次に、リソースを待機しているプロセスごとに、待機中のリソースの頂点の直前に頂点を描画します。プロセスがリソースを待機していない場合は、すべてのリソース頂点の後に、右端に頂点を描画します。
次に、各プロセスからそのプロセスが待機しているリソースにエッジを描画し、各リソースから現在そのリソースを保持しているプロセスにエッジを描画します。
グラフの各エッジを検討してください。2つのケースがあります:
エッジはPi -> Ri
、つまり、プロセスからリソースへです。各プロセスは1つのリソースのみを待機しており、待機しているリソースのすぐ左側にプロセスの頂点を描画しているため、エッジは左から右になります。
エッジはRi -> Pj
、つまり、リソースからプロセスへです。リソースを待機していない場合Pj
、その頂点はすべてのリソースの右側にあるため、エッジは左から右になります。プロセスが順番にリソースを取得するため、Pj
が待機している場合は、。の場合、はの左側にあり、すぐ左側にあります(そのようにグラフを描画したため)。したがって、の左側にあるため、エッジは再び左から右になります。Rk
i < k
i < k
Ri
Rk
Pj
Rk
Ri
Pj
このように描かれたグラフのすべてのエッジは左から右であるため、グラフのトポロジカルソートを作成しました。したがって、グラフにはサイクルがなく、デッドロックは発生しません。
重要なのは、プロセスが待機する理由ではなく、プロセスが待機するという事実であることに注意してください。したがって、ミューテックス、読み取り/書き込みロック、セマフォなどを待機するかどうかは関係ありません。デッドロック防止のためのこの戦略は、すべての人に有効です。