ファイルアクセスの排他処理

複数のプロセスから、同時一つのファイルに対する構造の変更処理が行われないように、またファイル参照中にその構造が変更されてしまわないように、ファイルシステムはファイルの排他処理を行っている。各ファイルのメモリiノード中にロックフラグ(i_semメンバ)を用意し、下記の場合ファイルiノードのロック操作を行っている。

  • 書き込みを行うファイル(writeシステムコール)
  • トランケート対象のファイル(do_truncate関数)
  • パス名の検索処理中のディレクトリ(real_lookup関数、open_nami関数)
  • ファイル生成時の親ディレクトリ(open_nami関数)
  • ディレクトリファイル、デバイスファイル、シンボリックリンクファイル 生成時の親ディレクトリ(do_mkdir, do_mknod, do_symlink関数)
  • ファイルのリンク時の親ディレクトリ(do_link関数)
  • ファイルのアンリンク時の親ディレクトリ(do_unlink関数)
  • ディレクトリ削除時の対象ディレクトリと親ディレクトリ(do_rmdir関数)
  • ファイルの移動時の、移動元の親ディレクトリと移動先の親ディレクトリ (do_rename関数)
  • ファイルの同期(fsyncシステムコール)

ファイル構造に依存しない処理ではiノードのロックを行っていない。例えば、ファイルのread処理ではiノードのロックを行わないので、ファイルへのwrite処理中でも、ファイルからのread処理が行えることを意味している。

補足説明

ディレクトリ操作では、二つのiノードを同時にロックする場合があるが、デッドロックを避けるため必ずメモリiノードが配置されているアドレス順でロックを行っている。


(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1