■プロセスとfileの関係 プロセスが一つファイルをオープンすると以下のようなデータ構造が作られる。 file構造体は、プロセスが行っているファイル操作の情報を管理する(openモード、ファイルポインタなど)。 dentry構造体はファイルの名前とディレクトリやファイルの相互の参照関係を管理する。 inodeはファイル実体を管理する。ファイルのデータブロックの場所、ファイルのオーナやモードなどを 管理している。 file構造体はプロセスに依存したデータであり、別のプロセスが同じファイルをopenすると、別途その プロセス用にfile構造体が用意される。二つあるfile構造体は同じdentry構造体を指す。 linuxでは様々な種類のファイルシステムをサポートしているため、ファイルシステム毎に適切な方法で ファイル(inode)をアクセスしなければならない。 これらアクセス方法は各種ファイルシステム内に関数テーブルという形で用意されており、各inodeは そのinodeが属するファイルシステム内の関数テーブルを指している。 (v2.4からはページキャッシュとファイル間での操作関数は address_space管理構造体で管理されること となった。)
address_space_operations file f_op f_dentry open, read, write, ioctl, mmap, …. hash, compare, delete, iput, release, … dentry d_op d_inode file_operations dentry_operations create, lookup, link, mkdir, truncate, …. address_space inode a_op i_fop i_op i_mapping inode_operations read_page, write_page, commit_write, bmap, ... address_space_operations
各プロセスはファイルシステムに関する情報、カレントディレクトリやumaskを持っているが、 各file構造体は下図のように各プロセスが保有するファイルディスクリプタテーブルに登録されている。 ファイルディスクリプタはこのテーブルの indexである。 task_struct fs_struct task_struct fs pwd root umask fs files files_struct file 各プロセスはファイルシステムに関する情報、カレントディレクトリやumaskを持っているが、 一般に同じshellから生まれたコマンドプロセスはこのデータを共有している。
■プロセスとfileの関係 - ファイル構造体の確保と解放 filp_open(パス名) パス名に対応したdentryを求める(open_namei関数) dentry_open関数を呼び出す。 dentry_open(dentry, ...) 空きファイル構造体を獲得(get_empty_filp関数) ファイル構造体の初期化 - ファイル構造体と上記dentryをリンク) - ファイル構造体のf_opメンバにファイル操作テーブルを登録 (「vfsと各ファイルシステムのインターフェイス」参照) ファイルのopen関数(ファイルシステム固有部)を呼ぶ ファイル構造体は、その参照数が0になると自動的に解放される。 (つまり誰も参照しなくなったとき) その参照数を1減らす関数は、以下のfput関数である。 fput(ファイル構造体) 参照数を1減らす 参照数が0になったら、フリーリストfree_listに戻す。
■プロセスとfileの関係 - 補足説明 get_empty_filp()は、ファイル構造体のフリーリストfree_listに root専用のfile構造体をリザーブしておく。 (NR_RESERVED_FILES 10個) このfile構造体は一般ユーザは利用できない。 ファイル構造体の上限値(初期値はNR_FILE 8192個)を使い切るとエラーになるが、エラーになった後に 運用を続けたままこの上限値を大きくするとが可能。 またファイル構造体が確保可能となる。 (当然、エラーになる前に大きくしておく方が良い)
■プロセスとfileの関係 - その他、主なファイル構造体操作関数群 fget() 引き数として与えられたファイルディスクリプタに対応する ファイル構造体の参照数を1増やす get_empty_filp() 空のファイル構造体を用意する. 用意したファイル構造体は anon_listリストに繋がれる。 put_filp() ファイル構造体の参照数が0なら、フリーリストfree_listに繋ぐ
■プロセスとfileの関係 - ファイル構造体の監視 以下の変数を見る事により、ファイル構造体の状態を大雑把につかむことができる。 ・nr_files 現在システム上の存在するファイル構造体数 ・nr_free_files フリー状態のファイル構造体数