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.
© Copyright 2024 Paperzz