複数のロックを獲得するときの注意事項として、ロックは別のプロセスであっても同じ順番で獲得しなければならない、というのがある。これについて説明がなされている。
- プロセスAがロック1→ロック2の順番で獲得する
- プロセスBがロック2→ロック1の順番で獲得する
上記のようになっていた場合、以下の順番でロックを獲得するとデッドロックが発生する。
- プロセスAがロック1を獲得する
- プロセスBがロック2を獲得する
- プロセスAがロック2を獲得しようとする (プロセスBがロックを獲得しているため待ち合わせ)
- プロセスBがロック1を獲得しようとする (プロセスAがロックを獲得しているため待ち合わせ)
このため、ロックを使う関数にとっても影響が出る。特定の順番で関数をコールしていかないと、上記のような問題が発生するからである。
ちなみに、xv6はこのような連続ロックを獲得する可能性としては、長いものでも2つのロックだけらしい。 ファイルシステムなどではこのような問題が発生するらしい。例えば、まずはディレクトリのロックを獲得してから、そのディレクトリ内のファイルのロックを獲得する、などの考慮が必要になる。