VFS and Block I/O

VFS and Block I/O
VA Linux Systems Japan
Hirotaka.Sasaki
sasaki@valinux.co.jp
Copyright© 2002, VA Linux Systems Japan K.K. All right reserved.
目次
● ファイルシステム概要
● VFS(仮想ファイルシステム)
● ページキャッシュとバッファキャッシュ
● ブロックI/O共通レイヤ
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
ファイルシステム概要
Copyright© 2002, VA Linux Systems Japan K.K. All right reserved.
ファイルシステムとは?
記憶デバイス上のデータをファイルという論理的な
構造で抽象化し利用するための機構
● 論理的なファイルと物理的なディスクブロックの対応を管理
● ファイルに対するアクセス要求を、ディスクブロックへのアク
セス要求へ変換
● ファイルの生成、拡張、削除に応じた、ディスクブロックの割
り当て
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
ファイルシステムのレイヤ構造
システムコールエントリ open() read() write() lseek() close() …
VFS
iノードキャッシュ
ページキャッシュ
ページキャッシュ I/O
共通ルーチン
バッファキャッシュ
バッファ I/O
共通ルーチン
ext2
ext3
iso9660
・
・
・
ブロック I/O 共通レイヤ
Loop
デバイス
LVM
dentryキャッシュ
proc
NFS
kernel
内部データ
RPC
TCP/IP
SoftWare
Raid
ブロック型デバイスドライバ
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
NICドライバ
VFSの概要
read (ファイルB)
read (ファイルA)
VFS
sys_read()
ext2用ファイル操作テーブル
ext2用ファイルリード関数()
iso9660用ファイル操作テーブル
iso9660用ファイルリード関数()
ext2
iso9660
ファイルA
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
ファイルB
さまざまなファイルシステム
● ローカルファイルシステム
ー ローカルディスク上のファイルシステム
- Linuxの標準はext2ファイルシステム
- 他、FFS(BSD)、VFAT(Win98)、iso9660など多数
- ext3、XFSなどのジャーナリングFSもサポート
● ネットワークファイルシステム
- ネットワークの先にあるファイルシステムを共有
- 代表的(Unix系)なものはNFS
- 他、CODA、SMB、NCP、Intermezzoなど
● 特殊なファイルシステム
- procファイルシステム
- kernel内部データをファイルとして抽象化
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
ブロックI/O共通レイヤ
● ディスクブロックのアクセス要求をもとに
ブロック型デバイスドライバを起動
● ファイルシステム構造には関与しない
● バッファI/O要求のクラスタリング
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
さまざまなキャッシュ
キャッシュによる処理の高速化
● ページキャッシュ
(ファイルデータのキャッシュ)
● バッファキャッシュ
(ディスクブロックのキャッシュ)
● iノードキャッシュ
● dentryキャッシュ
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
VFS
Copyright© 2002, VA Linux Systems Japan K.K. All right reserved.
VFSのデータオブジェクト
● file_system_typeオブジェクト
● super_blockオブジェクト
● inodeオブジェクト
● dentryオブジェクト
● fileオブジェクト
● address_spaceオブジェクト
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
iノードオブジェクト
struct inode {
iノード番号;
利用カウンタ;
デバイス番号;
ハードリンク数;
:
union {
minix固有のiノード情報;
ext2固有のiノード情報;
:
}
}
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
minix固有のiノード情報
ext2固有のiノード情報
ext3固有のiノード情報
nfs固有のiノード情報
:
iノードオブジェクトとdentryオブジェクト
ファイルの管理情報
ファイル名とディレクトリ階層
dentry
inode
i_dentry;
d_inode;
d_alias;
d_name;
d_iame;
15文字までの名前
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
16文字以上
の名前
プロセスとファイル
プロセス (struct task_struct)
:
fs;
files;
fd配列
fileオブジェクト
0
1
fileオブジェクト
2
3
fileオブジェクト
4
:
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
fileオブジェクト
:
VFSとファイルシステムのI/F
● super_block読み込みメソッド
(file_system_typeオブジェクトのread_superメンバ)
● super_operationsテーブル
(super_blockオブジェクトのs_opメンバ)
● inode_operationsテーブル
(inodeオブジェクトのi_opメンバ)
● dentry_operationsテーブル
(dentryオブジェクトのd_opメンバ)
● file_operationsテーブル
(fileオブジェクトのf_opメンバ)
● address_space_operationsテーブル
(address_spaceオブジェクトのa_opsメンバ)
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
VFSとファイルシステムのI/F(通常ファイル)
VFS
file
f_dentry;
f_op;
inode
dentry
d_inode;
d_op;
i_op;
i_mapping;
i_data;
file
f_dentry;
f_op;
inode
dentry
d_inode;
d_op;
i_op;
i_mapping;
i_data;
host;
a_ops;
nfs_file_aops
nfs_file_inode_operations
nfs_dentry_operations
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
nfs_file_operations
ext2_aops
ext2_file_inode_operations
未定義 ext2_file_operations
EXT2
host;
a_ops;
NFS
パスの解析
/bar/foo
パスの解析
dentry
/
inode
dentry
bar
inode
dentry
foo
inode
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
ファイルのオープン
open(/bar/foo)
ファイルのオープン
fd
task_struct
パス解析
file
fd
ファイルの
オープン
状態管理
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
foo
dentry
inode
ファイルの読み込み
read(fd)
fd
ファイルのオープン
ファイルの読み込み
依頼先を決定
fd
読み込み依頼
EXT2
NFS
EXT3
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
file
dentry
inode
ページキャッシュ
と
バッファキャッシュ
Copyright© 2002, VA Linux Systems Japan K.K. All right reserved.
ファイルI/Oの処理階層
VFS
ファイル
ページキャッシュI/O
ページキャッシュ
バッファキャッシュI/O
Page
Page
Bh
Bh
Bh
Bh
Bh
Bh
Bh
Bh
Page
Bh
Bh
Bh
Bh
バッファキャッシュ
I/Oリクエスト
ブロックI/O
デバイスドライバ
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
Bh
Bh
Bh
Bh
Bh
Bh
バッファキャッシュI/Oの概要
バッファI/O要求
デバイス番号;
ブロック番号;
I/O待ち
起床
I/O完了通知関数;
(end_buffer_io_sync)
バッファキャッシュI/O
end_buffer_io_sync
ブロックI/O
デバイスドライバ
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
I/O完了通知
実行再開
バッファのI/O要求
buffer I/O要求
buffer I/O要求
バッファキャッシュI/O
ll_rw_block
submit_bh
I/Oリクエストキュー
ブロックI/O
デバイスドライバ
buffer I/O要求
buffer I/O要求
I/Oリクエスト
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
バッファのI/O実行
wait_on_buffer
バッファキャッシュI/O
run_task_queue
I/Oリクエストキュー
ブロックI/O
デバイスドライバ
buffer I/O要求
buffer I/O要求
I/Oリクエスト
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
ファイルとページキャッシュ
inode
mapping;
dentry
address_space
address_space_operations
nrpages(3);
writepage
readpage
sync_page
a_ops;
clean_pages;
d_inode;
host;
:
file
f_dentry;
f_pos;
ファイル
0
page
list;
index(0);
mapping;
1
page
2
list;
index(1);
mapping;
:
page
list;
index(n);
n
mapping;
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
メモリ空間
ページキャッシュI/Oの概要
ファイル
ページキャッシュI/O
Page I/O要求
I/O待ち
起床
バッファキャッシュI/O
buffer buffer buffer I/O要求
buffer I/O要求
I/O要求
I/O要求
end_buffer_io_async
ブロックI/O
デバイスドライバ
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
I/O完了通知
実行再開
通常ファイル読み込みの流れ
ページキャッシュ I/O
generic_file_read
do_generic_file_read
generic_readahead
ファイル
キャッシュ検索
Page
ext2_apos(アドレススペース操作テーブル)
Page
Page
readpageメソッド
EXT2
:
ext2_readpage
ext2_get_block
block番号取得
Page
bread
block_read_full_page
キャッシュ検索
バッファキャッシュ I/O
ll_rw_block
submit_bh
ブロック I/O
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
bh
bh
bh
bh
通常ファイルの書き込み
● prepare_write
● 書き込みデータコピー
● commit_write
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
通常ファイル書き込みの流れ(prepare_write)
ページキャッシュ I/O
ファイル
generic_file_write
キャッシュ検索
Page
ext2_apos(アドレススペース操作テーブル)
Page
Page
prepare_writeメソッド
EXT2
:
データを書き込む部分
ext2_get_block
ext2_prepare_write
block番号取得
bread
block_prepare_write
バッファキャッシュ I/O
キャッシュ検索
Page
読み込み要求
ll_rw_block
bh
ブロック I/O
submit_bh
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
bh
通常ファイル書き込みの流れ(commit_write)
ページキャッシュ I/O
ファイル
generic_file_write
Page
ext2_apos(アドレススペース操作テーブル)
Page
Page
commit_writeメソッド
EXT2
:
flushtime
Dirty
generic_commit_write
bh
flushtime
Dirty
bh
__mark_dirty
__block_commit_write
blance_dirty
bdflushデーモン
blance_dirty_state
起床
wakeup_bdflush
バッファキャッシュ I/O
write_some_buffers
buffer WRITE要求
ブロック I/O
submit_bh
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
bdflushとkupdateデーモン
● bdflushデーモン
- Dirty属性(遅延書き込み)のバッファが一定数
以上になったらディスクに書き戻す
● kupdateデーモン
- Dirty属性になって一定時間を経過したバッファ をディスクに書き戻す
● その他のディスクへの書き戻し処理
- updateコマンド(bdflushシステムコール)
- syncコマンド(syncシステムコール)
- 空きメモリの枯渇
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
ブロックI/O共通レイヤ
Copyright© 2002, VA Linux Systems Japan K.K. All right reserved.
バッファI/OとブロックI/O
バッファI/O
- ブロック単位で処理
- ブロックサイズはファイルシステム依存
(ページサイズは超えられない)
block
ブロックI/O共通レイヤ
sector
sector
sector
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
sector
- セクタ単位で処理
- セクタサイズは512バイト
(ファイルシステムサイズの制限)
I/Oリクエストの作成
VFS
buffer
I/O
buffer
I/O
buffer
I/O
buffer
I/O
バッファキャッシュI/O
submit_bh
tq_disk
generic_make_request
loop__make_request
__make_request
I/Oタスクキュー
...
ブロックI/O
IDE
SCSI
requestキュー
requestキュー
requestキュー
I/O
リクエスト
I/O
リクエスト
I/O
リクエスト
ブロックデバイスドライバ
I/O
リクエスト
I/O
リクエスト
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
I/O
リクエスト
I/Oタスクの実行
run_task_queue(tq_disk)
tq_disk
I/Oタスクキュー
task実行ルーチン
・・
generic_unplug_device
ブロックI/O
IDE
SCSI
requestキュー
requestキュー
requestキュー
I/O
リクエスト
I/O
リクエスト
I/O
リクエスト
ブロックデバイスドライバ
I/O
リクエスト
I/O
リクエスト
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
I/O
リクエスト
ブロックI/Oのクラスタリング
bufferI/O要求
request_queue
request
request
request
buffer_head
buffer_head
buffer_head
buffer_head
buffer_head
request_queue
request
request
buffer_head
buffer_head
buffer_head
buffer_head
buffer_head
Copyright (C) 2002, VA Linux Systems Japan K.K., All rights reserved.
おわり
http:/valinux.co.jp/
Copyright© 2002, VA Linux Systems Japan K.K. All right reserved.