[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:メモリiノードの確保
}}}
= メモリiノードの確保 = #SECTION03420000000000000000
iノード域の確保は、伝統的UNIXと同じigetという関数で実現されている。igetは指定されたiノード番号に対応するiノード域を確保し返却する。iノード域の初期化は各ファイルシステムが行う。
{{{
iget(iノード番号)
if(上記iノードキャッシュ内に目的のiノードが見つかった)
return 見つかったiノード
iノード番号に対応するメモリiノードを作成する(get_new_inode関数)
return 新規に作成したiノード
}}}
キャッシュ内に目的のiノードが見つからなかった場合、以下のget_new_inode関数により、空のiノード域を確保し初期化を行う。
{{{
get_new_inode(iノード番号)
if (フリーリストinode_unsedに空iノード域がある) {
フリーリストからiノード域を一つはずす。
iノードの参照数を一つ増やす
iノード域をinode_in_useリストに繋ぐ
iノード域をキャッシュに登録
iノード域を0クリア
ディスクinode域の読み込み(read_inode関数)
return 確保したiノード域
}
inode域を拡張する(grow_inodes関数)
if(上記作業中に、別の人が目的のiノードを用意した) {
今確保したiノード域をフリーリストinode_unusedに登録
return 別の人が用意したiノード
}
iノード域をinode_in_useリストに繋ぐ
iノード域をキャッシュに登録
iノード域を0クリア
ディスクinode域の読み込み(read_inode関数)
return 拡張したiノード域
}}}
iノード域が不足した場合grow_inodes関数で、空きiノード域をつくり出す。iノード数の上限値に達するまではどんどんメモリを確保し、それをiノード域に分割しinode_unusedに登録する。
iノード数の上限値に達した後は、利用頻度の低そうなiノード域を見つけ出し、フリーリストに戻す処理が動く。もし、フリーリストに戻すことの可能なiノード域が無かった場合は、iノード域数のマックス値を越えてでもメモリを確保し iノード域の拡張を実行する。
{{{
grow_inodes()
if (iノード域数が、マックス値を越えた)
利用頻度の低そうなinode域をフリーリストinode_unusedに戻す
(try_to_free_inodes関数)
}
メモリ域を確保( __get_free_page)
iノード域に分割し、フリーリストinode_unusedに登録
}}}
これからファイルを新規作成する場合は、そのファイル用のメモリiノード獲得にiget関数は利用できない。初期化されていない空のメモリiノード獲得には次の get_empty_inode関数を利用する。
{{{
get_empty_inode()
if (フリーリストinode_unsedに空iノードがある) {
フリーリストからiノードを一つはずす。
inode_in_useリストに繋ぐ
inodeを0クリア
return 確保したiノード
}
inode = grow_inodes(); //無理矢理inode域を用意する
inode初期化
return inode;
}}}
----
''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]