1 オペレーティングシステム 2004 ファイル管理 (1) 2003 年 11 月 5 日 海谷 治彦.

Slides:



Advertisements
Similar presentations
プログラミング演習 II 2005 年 1 月 19 日(第 9 回) 理学部数学科・木村巌. 前回までの復習 共用体( union type ) 共用体( union type ) 列挙 (enumerated type ) 列挙 (enumerated type ) 構造体、構造体のポインタ、
Advertisements

ファイル管理(ファイルシス テム) オペレーティングシステム 第 11 回. ファイルとは データの集まりの入れ物 データの集まり自身 データセットと呼ぶ場合もある 両方を意味.
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
1 ファイル入出力と プロセス間通信 (1) 2004 年 12 月 10 日 海谷 治彦. 2 目次 まずはマニュアルをみよう. –2 章 システムコールインタフェース –3 章 汎用関数定義 アンバッファー化入出力 (Unbuffered I/O) –open, read, write... –lseek,
■プロセスとfileの関係 プロセスが一つファイルをオープンすると以下のようなデータ構造が作られる。
■ディレクトリエントリキャッシュ linuxではdentryという構造体に、ファイルパス名の情報を格納しメモリ上にキャッシングしている。
計算機工学III オペレーティングシステム #14 ファイル: より進んだファイルシステム 2006/07/21 津邑 公暁
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
■パス検索 各種ファイルを操作するには、まずパス名をiノードに変換しなければならない。 以下にパス名をiノードに変換する関数の説明を行う。
Linux インストール      のための基礎知識 物理実験 I 情報実験第9回 2003/12/12 中神 雄一.
物理実験 I 情報実験第9回 2004/12/10 小西 丈予 2003/12/12 中神 雄一
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
システムプログラミング 第6回、7回 main関数の引数 usageメッセージ システムコールのエラーメッセージ ファイル
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
ファイルシステムの構造 外部記憶装置のパーティション(区画) ファイルシステムとパーティション(区画) ファイルシステムのmount
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
オペレーティングシステム (OSの機能と構造)
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
数値計算及び実習 第7回 プログラミングの基礎(5).
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
Linuxカーネルについて 2014/01.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
オペレーティングシステム2005 デバイス管理 (1)
プログラミング論 ファイル入出力
第10回 ファイル管理 論理レコードと物理レコード アクセス方式 ユーザから見たファイルシステム 補助記憶装置の構成
オペレーティングシステム2006 第1回 概要 2006年10月12日 海谷 治彦.
プログラミング 4 記憶の割り付け.
画像処理プログラムの説明.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング論 ファイル処理 (中級編)
オペレーティングシステム イントロダクション
プログラミング論 ファイル入出力
演習2の解答例 2006年12月22日 海谷 治彦.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第4回 ファイル入出力方法.
オペレーティングシステム (ファイル) 2009年11月9日
オペレーティングシステム2006 ファイル管理 (3) 演習へのヒント他
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
Linux の世界に 触れてみよう! 情報実験 第 3 回 (2005/10/21)
データ構造とアルゴリズム 第11回 リスト構造(1)
オペレーティングシステム (OSの機能と構造)
プログラミング 3 2 次元配列.
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
オペレーティングシステムJ/K 2004年10月4日
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
高度プログラミング演習 (11).
オペレーティングシステム (ファイル) 2006年11月16日
オペレーティングシステム (ファイル) 2008年11月17日
モジュール分割.
オペレーティングシステム (OSの機能と構造)
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング プロセスとファイルシステム管理.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
プログラミング 3 ポインタ(1).
Presentation transcript:

1 オペレーティングシステム 2004 ファイル管理 (1) 2003 年 11 月 5 日 海谷 治彦

2 目次 (UNIX 系 ) ファイルシステムの概要 プロセスとファイルの関係 仮想ファイルシステム VFS –C 言語 関数へのポインタ ディスクの物理構造とフォーマット

3 UNIX 系ファイルシステムの概 要 文献 5 p.15 ご存知のとおり, UNIX 系 OS( その他も大抵そうだけ ど ) は,階層的なファイルシステムを持っている. / devhomebinusr fd0hda lscp ・・・・

4 mount: ファイルシステムの接 木 実際のファイルシステムは,複数のファイル システムを接木して,一つの大きな木構造を 成している. これによって,物理的 / 論理的に異なるファイ ルシステム群を 1 つの構造にまとめることが できる. – 物理的 : HD や FD や CD やネットワークデバイス – 論理的 : Ext2 や FAT や NTFS や SMB 等 Ext2 は Linux 標準のファイルシステム FAT は古い Windows(MSDOS) のファイルシステム NTFS は Win/Nt や XP のファイルシステム SMB は Windows のネットワークドライブ

5 mount の概念図 文献 1 p.45 改 / etcusrhome b kaiyamiyaotakei binlocal / etcusr home binlocal b を home に マウントする b kaiyamiyaotakei

6 mount の実際 / (hda1) (hdb1) (hdc) (fd0) (hda3) /home/usr/mnt /cdtest

7 プロセスとファイル プロセスからはファイルシステムの一 部 ( 全体かもしれない ) が参照可能となっ ている. 参照可能なファイルシステムの最上位 をルートディレクトリと呼ぶ. プロセス毎に,現在,注目している ディレクトリというのは異なる. このようなディレクトリを Current Working Directory と呼ぶ.

8 File Descriptor あるプロセスが参照しているファイル ( 特殊ファイルを含む ) は, File Descriptor と呼ばれる数値で識別される. 番号, 0, 1, 2 は全プロセス共通に標準入 力,出力,エラーに対応. この数値は構造体 file の配列の添え字に なっている. – 構造体 file については後述.

9 構造体 file ・ 構造体の関係 構造体 task_struct ・ /* open file information */ struct files_struct *files; ・ 構造体 files_struct ・ struct file** fd; ・ 0 1 2

10 open や fopen 普段, fopen 関数なんかで開けてる FILE なんかも,結局は,前述の File Descriptor を参照している. open システムコールや read,write システ ムコールは File Descriptor を直接使って ファイルの操作を行う.

11 ファイルの種類 通常ファイル ディレクトリ シンボリックリンク ブロック型デバイスファイル キャラクタ型デバイスファイル パイプ,名前付きパイプ ソケット この辺は本日 扱わない.

12 inode 番号とリンク ファイル名というのは,割と簡単につ けかえられるので,実はファイルの識 別子にはあまりなっていない. ファイルは inode というデータ構造で内 部的には管理されており, inode 番号が ファイルを識別する id と考えることがで きる. include/linux/fs.h の 338 行目辺りで定義

13 ( ハード ) リンク ファイルを特定ディレクトリ下に名前 をつけて所属させるのがリンクである. 前述のように,ファイルの実体は inode で管理されているので, – 同一実体のファイルを,異なるディレクト リに異なる名前で所属させることができる.

14 シンボリックリンク ハードリンクには大きな制限がある. – 同じファイルシステムに所属するファイル にしか適用できない. – 一般ユーザーはディレクトリへのリンクを はれない. この制限を克服するためにシンボリッ クリンクが作られた. – 存在しないファイルにさえリンクが張れる.

15 ファイルのアクセス権 ユーザー,同一グループ,その他で分 類 モードはそれぞれ rwx 他 3 つほどのアクセス権情報を持つ. 例

16 個々のファイル内のアクセス 法 順次的 (sequential) アクセス –C のリスト構造やビデオテープのように前 から順番にアクセスする方式. –UNIX 系の通常ファイルは通常このアクセ ス形式をとる. ランダムアクセス –C の配列のように順番に関係なく任意の位 置のデータにアクセスできる方式.

17 通常ファイルのためのシステムコー ル open アクセスするためにファイルを開ける関 数. close 逆に閉じる関数 read 読む関数 write 書く関数 lseek 現在の読み書き位置を移動させる関数. ( ビデオの早送り巻き戻しみたいなもの ) rename ファイル名の付け替え unlink ディレクトリからのエントリ削除. これらはシステムコールなので,実際には, カーネルへの作業要求依頼である.

18 仮想ファイルシステム VFS Linux では物理的・論理的に種類の異な るファイルシステムを統一的に扱うた めに, 仮想ファイルシステム ( スイッチ )VFS と いうのを仲介役としておいて全ての ファイルを扱うようにしている. これによって,ファイルシステムの種 類や所在をユーザーは意識せずにファ イルにアクセスできる. – システムコールの種類を変える必要が無い.

19 VFS の概念図

20 VFS は interface VFS は (UML 等 でいうところ の )Interface に あたる. –Linux はオブ ジェクト指向 言語で書いて あるのではな いので概念上 の話. open read write lseek ・・・ > VFS Ext2FAT32 NTFS

21 VFS が扱うファイルシステムの種 類 ディスクベースのファイルシステム –Ext2, FAT, NTFS, ISO9660 等のマシンに直 接接続された装置内のファイルシステム群 ネットワークファイルシステム –NFS や SMB などのネットワークファイルシ ステム 特殊ファイルシステム –/proc/ の下のファイルや /dev/pts 等

22 特殊ファイルの例 端末がファイル に ?! ファイルと同様に端末に対し てリダイレクションすると, 送り込まれた文字が端末に出 てくる.

23 ファイルアクセスの実際 種類の違うファイルシステムへのアクセスには当然, 異なる関数 ( 機能 ) が必要である. –CDROM と HD とではデータの読み方は違うだろう. しかし, OS 操作やアプリ上において,一般にはファ イルシステムの実体の違いにより関数を使い分けす ることは無い. –CDROM だろうが, HD だろうが, open で開けて read で読む. ユーザーは VFS を経由してファイルアクセスするの で,この点を考慮しなくてよい. 当然, VFS は一般的なファイルアクセス関数群 ( シス テムコール ) とシステム固有のアクセス関数との対応 を知っている.

24 システム固有の関数までの道の 例 1. ユーザーは read() 等のシステムコールを呼 ぶ. 2. カーネルは sys_read() を呼ぶ. 3. この関数は,カーネル内に保持されている 開き済なファイルを示す構造体 file のイ ンスタンスを読む. 4.file のメンバーに構造体 f_op というのが あり,これに関数へのポインタが列挙され ている. 5.f_op 内のこのポインタ群がシステム固有の 関数である. file ->f_op->read(….) という間接的な呼び方

25 関数へのポインタ 普通の C の構文の一種. 返り値と引数の型が一致している関数 を,変数 ( コレが関数へのポインタ ) に代 入して,関数呼び出しを動的に変更す ることができる. 無論,関数引数にも使える.

26 例 int add(int a, int b){ return a+b; } int sub(int a, int b){ return a-b; } main(){ int (*fp)(int, int); // ここで関数へのポインタを宣言. fp=add; // 関数名を代入できる printf("%d\n", (*fp)(10, 4) ); fp=sub; // 関数名を代入できる printf("%d\n", (*fp)(10, 4) ); } 命令文は全く同じだが, fp の指している関数の 実体が異なるため,計 算結果も異なる.

27 システム固有の関数までの道 1. ユーザーは read() 等のシステムコールを呼 ぶ. 2. カーネルは sys_read() を呼ぶ. 3. この関数は,カーネル内に保持されている 開き済なファイルを示す構造体 file のイ ンスタンスを読む. 4.file のメンバーに構造体 f_op というのが あり,これに関数へのポインタが列挙され ている. 5.f_op 内のこのポインタ群がシステム固有の 関数である. file ->f_op->read(….) という間接的な呼び方

28 ファイル操作切り替えの戦略 main(){ ssize_t (*read)(struct file *, char *, size_t, loff_t *); if( ファイルが ext2 上にある ) read=read_ext2; else if( ファイルが FAT32 上にある ) read=read_fat32; (*read)(&file, buf, size); // 実体に関係なくファイルを読む } ssize_t read_ext2(struct file *, char *, size_t, loff_t *){ // ext2 ファイルシステムを読む処理. } ssize_t read_fat32(struct file *, char *, size_t, loff_t *){ // FAT32 ファイルを読む処理. } 本質的な戦略 の説明. 実際はモちっ と複雑.

29 構造体 file struct file { struct file *f_next, **f_pprev; struct dentry *f_dentry; struct file_operations *f_op; // コイツが Interface にあたる mode_t f_mode; loff_t f_pos; unsigned int f_count, f_flags; unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; struct fown_struct f_owner; unsigned int f_uid, f_gid; int f_error; unsigned long f_version; /* needed for tty driver, and maybe others */ void *private_data; }; include/linux/fs.h の 423 行目くらい

30 構造体 file_operations struct file_operations { loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *); int (*fasync) (int, struct file *, int); int (*check_media_change) (kdev_t dev); int (*revalidate) (kdev_t dev); int (*lock) (struct file *, int, struct file_lock *); }; include/linux/fs.h の 810 行目くらい 全てのファイルシステムに全ての関数が定義されているわけではない. メンバが関数への ポインタとなって おり,ポインタの 指す実体が FS の実 体毎に異なる.

31 プロセスと VFS 間の関係 個々のプロセスがファイルシステムにたどり着くまで, いくつかの構造体のインスタンスを経由します. プロセス 1 プロセス 2 構造体 file のインスタンス 構造体 file のインスタンス 構造体 file のインスタンス 構造体 dentry のインスタンス 構造体 dentry のインスタンス 構造体 inode のインスタンス 構造体 super_block のインスタンス ディスク

32 各構造体の意味の説明 file オープンされているファイルの情報 を保持する.プロセスがファイルにア クセスしている間しかインスタンスは 存在しない. dentry ディレクトリのエントリを現すイ ンスタンス. inode 個々のファイルについての一般的 情報. super_block マウントされたファイルシ ステムに関する情報を保持.

33 構造体 dentry struct dentry { int d_count; unsigned int d_flags; struct inode * d_inode; /* Where the name belongs to - NULL is negative$ struct dentry * d_parent; /* parent directory */ struct dentry * d_mounts; /* mount information */ struct dentry * d_covers; struct list_head d_hash; /* lookup hash list */ struct list_head d_lru; /* d_count = 0 LRU list */ struct list_head d_child; /* child of parent list */ struct list_head d_subdirs; /* our children */ struct list_head d_alias; /* inode alias list */ struct qstr d_name; unsigned long d_time; /* used by d_revalidate */ struct dentry_operations *d_op; struct super_block * d_sb; /* The root of the dentry tree */ unsigned long d_reftime; /* last time referenced */ void * d_fsdata; /* fs-specific data */ unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ }; include/linux/dcash.h の 58 行目くらい

34 構造体 inode struct inode { struct list_head i_hash; struct list_head i_list; struct list_head i_dentry; unsigned long i_ino; unsigned int i_count; kdev_t i_dev; umode_t i_mode; nlink_t i_nlink; uid_t i_uid; gid_t i_gid; kdev_t i_rdev; off_t i_size; time_t i_atime; time_t i_mtime; time_t i_ctime; unsigned long i_blksize; unsigned long i_blocks; unsigned long i_version; unsigned long i_nrpages; struct semaphore i_sem; struct semaphore i_atomic_write; struct inode_operations *i_op; struct super_block *i_sb; struct wait_queue *i_wait; struct file_lock *i_flock; struct vm_area_struct *i_mmap; struct page *i_pages; struct dquot *i_dquot[MAXQUOTAS]; // 長いので以下省略 }; inlcude/linux/fs.h の 338 行目くらい

35 構造体 super_block struct super_block { struct list_head s_list; /* Keep this first */ kdev_t s_dev; unsigned long s_blocksize; unsigned char s_blocksize_bits; unsigned char s_lock; unsigned char s_rd_only; unsigned char s_dirt; struct file_system_type *s_type; struct super_operations *s_op; struct dquot_operations *dq_op; unsigned long s_flags; unsigned long s_magic; unsigned long s_time; struct dentry *s_root; struct wait_queue *s_wait; struct inode *s_ibasket; short int s_ibasket_count; short int s_ibasket_max; struct list_head s_dirty; /* dirty inodes */ // 以下長いので略 } include/linux/fs.h の 528 行目くらい

36 ディスクの物理構造

37 フォーマット 通常,隣接したシ リンダ何枚かをグ ループ化し,それ をパーティション とする. ディスク丸ごと 1 パーティションと してもさしつかえ ない.

38 とあるディスクの情報の実例 ディスク /dev/hda: ヘッド 255, セクタ 63, シリンダ 2434 ユニット = シリンダ数 of * 512 バイト デバイス 始点 終点 ブロック ID システム /dev/hda Linux /dev/hda Linux スワップ /dev/hda Linux /dev/hda Linux 255 個 hda1 hda2 hda3 hda4 1 円周にセクタが 63 個 4 つの パーティ ション