ファイルシステム

Similar documents
ファイル入出力

Microsoft Word - Cプログラミング演習(9)

ファイル入出力

slide4.pptx

PowerPoint プレゼンテーション

演算増幅器

02: 変数と標準入出力

Prog1_12th

Taro-ファイル処理(公開版).jtd

C言語講座 ~ファイル入出力編~

2006年10月5日(木)実施

02: 変数と標準入出力

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

Microsoft Word - Cプログラミング演習(10)

ファイル入出力と プロセス間通信 \(1\)

計算機プログラミング

Microsoft PowerPoint - kougi6.ppt

Microsoft PowerPoint - 第3回目.ppt [互換モード]

情報処理演習 B8クラス

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

PowerPoint プレゼンテーション

Microsoft Word - no204.docx

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint pptx

ファイル操作-バイナリファイル

memo

計算機概論

※ ポイント ※

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - kougi8.ppt

C言語におけるファイル入出力の高速化

Microsoft Word - no15.docx

メモリ管理

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

目次

スライド タイトルなし

PowerPoint プレゼンテーション

プログラミング基礎

Microsoft PowerPoint - InfPro_I6.pptx

PowerPoint Presentation

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

PowerPoint Presentation

Microsoft PowerPoint - CproNt11.ppt [互換モード]

gengo1-12

gengo1-12

Microsoft PowerPoint - CproNt02.ppt [互換モード]

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

Microsoft PowerPoint - lec10.ppt

PowerPoint Presentation

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

ディジタル信号処理

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

PowerPoint プレゼンテーション

Microsoft PowerPoint fs

memo

Microsoft PowerPoint - dev1.ppt

PowerPoint プレゼンテーション

ゲームエンジンの構成要素

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - prog06.ppt

gengo1-12

Microsoft PowerPoint - prog03.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi11.ppt

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

V

memo

( ) 3 1 ( ), ( ).. 1

プログラミング演習3 - Cプログラミング -

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

slide6.pptx

Taro-ポインタ変数Ⅰ(公開版).j

第2回

プログラミング演習3 - Cプログラミング -

Microsoft PowerPoint - kougi4.ppt

オペレーティングシステム2004 ファイル管理 \(2\)

Microsoft Word - Cプログラミング演習(12)

数値計算

UNIX とは? 1969 年 米国のベル研究所で開発されたオペレーティングシステム特徴 文字ベースの対話型 OS マルチユーザ 複数のユーザが同時に利用できる マルチタスク マルチプロセス 複数の処理を平行して行える タイムシェアリング 一定の時間に区切って処理を行う 複数の処理を平行しているよう

データ構造

Microsoft PowerPoint - handout08.ppt

PowerPoint プレゼンテーション

操作方法 XXXTOEMF は コマンドライン形式のアプリケーションです 通常のコマンドと同じように コマンドラインからの実行やバッチファイルに組み込むことが可能です インストールについては, 別紙の KDxxxx コンバートソフトの特記事項について を参照してください ここでは 直接コマンドライン

Microsoft Word - 06

Taro-リストⅠ(公開版).jtd

PowerPoint プレゼンテーション

k_seminar_hands_on_for_linux_beginner.pptx

mstrcpy char *mstrcpy(const char *src); mstrcpy malloc (main free ) stdio.h fgets char *fgets(char *s, int size, FILE *stream); s size ( )

PowerPoint プレゼンテーション

これを調べるには pwd というコマンドを使います pwd とは print working directory の頭文 字をとったもので これから意味は明らかですよね 演習 1 (a) pwd を実行した結果を書け なお 立ち上げた直後の作業用ディレクトリのことをホー ムディレクトリ もしくは単に

プログラミングI第10回

Microsoft PowerPoint - kougi7.ppt

10-vm1.ppt

Si 知識情報処理

PowerPoint プレゼンテーション

Microsoft PowerPoint - 14th.ppt [互換モード]

構造体

Microsoft Word - no103.docx

PowerPoint プレゼンテーション

AquesTalk プログラミングガイド

Transcription:

1 ソフトウェアアークテクチャ 第 2 回ファイルシステム 環境情報学部 萩野達也

オペレーティングシステムの構成要素 2 アプリケーション オペレーティングシステム システムコール処理 ファイルシステム プロセス管理 ネットワーク管理 メモリ管理 ブートストラップ スケジューラー デバイス管理 ハードウェア

3 ファイルとは 情報を外部記憶媒体に記録する単位 データセットとも呼ばれたことがある ファイルの特徴 ファイル情報は不揮発 ファイル情報は presistent( 永続的 ) ファイルシステム 外部記憶媒体上のファイルを管理 Windows NTFS MacOS HFS Unix UFS 外部記憶媒体 (SSD, HDD) ファイル ファイル ファイル関連の取り決め ファイル名 ファイル構造 ファイルの種類 ファイルのアクセス方法

4 ファイル名に関する取り決め 大文字および小文字の区別がない場合もある ファイル名の文字コードはどうする? ファイル名の文字数には制限があるものもある MS-DOS では 8+3 UNIX では 255 ファイル拡張子 (file extension) によりファイルの種類を表す場合もある Windows では起動されるプログラムが異なる Mac では以前は内部的に保持していた UNIX はアプリケーション任せ コンパイラは拡張子によって言語を判断

5 ファイルの構造 バイト列 ファイルはバイトの並んだものであると考え, 何の構造もない ユーザは任意のフィールドを扱うことができる テキストファイルの場合は改行文字で区切る レコード列 ファイルは固定長のレコードの集まりとして取り扱われる パンチ カード時代には 1 レコード 80 文字としていた レコード単位で読み書きが可能である. 1 行目 バイトバイトバイト改行 レコード 1 バイトバイトバイトバイトバイトバイト 2 行目 バイトバイトバイトバイトバイト改行 レコード 2 バイトバイトバイトバイトバイトバイト 3 行目 バイトバイトバイトバイト改行 レコード 3 バイトバイトバイトバイトバイトバイト 4 行目 バイトバイト改行 レコード 4 バイトバイトバイトバイトバイトバイト

6 ファイルの種類 通常ファイル (regular file) テキストファイルまたはバイナリの 2 種類がある ディレクトリ (directory) ファイルを管理するためのファイル フォルダー (folder) とも呼ばれる 文字型特殊ファイル (character special file) 入出力関連のデバイスを表す. 端末, プリンタ, ネットワークなどのシリアル型のデバイス ブロック型特殊ファイル (block special file) ディスクなどのブロック単位で利用するデバイス ファイルシステムを作ることができる

ファイルのアクセス方法 逐次アクセス sequential access プロセスはファイルのバイトやレコードを順番に読むことしかできない. スキップしたり, 順序を外れたアクセスはできない. 巻き戻しだけできる場合もある. 直接アクセス random access 順番に関係なく任意の位置のバイトやレコードをアクセスできる. UNIX では seek システムコールで読み書きする位置を指定できる. 7 前から順番に読み書きする 順番に関係なく読み書き

8 階層型ファイルシステムとは ディレクトリの中にディレクトリを入れることを許すことによって実現 ディレクトリの中身 2 種類の方法がある. ファイル名と属性がエントリに入っている ファイル名は入っているが, 属性は別に管理され, そこへのポインタがエントリに入っている ファイルの指定方法 パス名により指定する ディレクトリ名とファイル名を / や などの区切り記号つないだもの UNIX / Windows 旧 Mac :

9 絶対パス名と相対パス名 絶対パス名 (absolute path name) ルート ディレクトリからディレクトリのたどるサブディレクトリ名を / などで区切ることにより指定 相対パス名 (relative path name) 作業ディレクトリ (working directory) からたどる / bin sbin usr var home etc tmp ls bin sbin local root hagino passwd grep bin sa15 01.pptx 02.pptx

10 ファイルの読み書きの仕組み UNIX を例に説明 直接システムコールを使ってファイルの読み書きを行なう場合もある 通常は標準入出力ライブラリ経由で利用 アプリケーション 標準入出力ライブラリ OS ファイル関連システムコール バッファ管理 デバイスドライバハードウェア HDD SSD

11 ファイル関連のシステムコール データの読み出し ファイル名 ( パス名 ) read データ 利用開始 open ファイルディスクリプタ データの書き込み write データ 利用終了 close ioctl 設定 データ読み書き位置の変更 seek 位置その他の操作

12 ファイルディスクリプタ open で返される小さな数字 読み書き操作を行うファイルを表す 読み書きの位置を覚えている (read, writeで更新,seekで変更) プロセス毎に管理 数字の意味はプロセスごとに異なる 一つのプロセスでも同じファイルを 2 回 open すると違うファイルディスクリプタ 特別なファイルディスクリプタ 標準入力 0 標準出力 1 標準エラー出力 2

13 標準入出力ライブラリ システムコールの問題点 行単位でのアクセスはできない 小さな単位でアクセスすると効率が悪い 標準入出力ライブラリ アプリケーションからシステムコールへのアクセスを最適化 バッファリングを行う アプリケーション fopen, fclose, fgetc, fputc, fgets, fputs 標準入出力ライブラリ バッファ open, close, read, write システムコール

14 標準入出力ライブラリの使い方 文字の読み出し ファイル名 ( パス名 ) fgetc 1 文字 1 行の読み出し fopen gets 1 行 利用開始利用終了 fclose fprintf 値の文字への変換値 FILE 構造体 fputs 1 行 fputc 1 行の書き込み 文字から値への変換 fscanf 文字の書き込み 1 文字 値

15 標準入出力ライブラリの実装 fopen FILE *fopen(char *path, char *mode) { FILE *fp; fp = (FILE *)malloc(sizeof(struct FILE)); fp->fd = open(path,...); fp->size = 0; fp->counter = 0; return fp; } FILE 構造体 struct FILE { int fd; char buf[bufsize]; int size; int counter; }; typedef struct FILE FILE; FILE 構造体 アプリケーション fgetc int fgetc(file *fp) { if (fp->counter >= fp->size) { fp->size = read(fp->fd, fp->buf, BUFSIZE); if (fp->size <= 0) return -1; fp->counter = 0; } return fp->buf[fp->counter++]; } size buf バッファ一時データを保存 counter 次どこから読み書きするか システムコール

16 ファイルシステムコールの実装 プロセス管理構造体 ファイルディスクリプタ表 0 1 2 3 4 ファイルディスクリプタ ファイルディスクリプタ ファイルディスクリプタ ファイルディスクリプタ アプリケーション ( プロセス ) が利用 オープンしたファイル毎に存在 ファイルのどこまで読み書きをしたかを記憶 inode ディスクブロック番号 inode ディスクブロック番号 inode (index node) ファイルの管理単位 1 つのファイルには 1 つの inode ファイルの情報を管理 所有者 サイズ ファイルを構成しているブロック ブロックデバイス

17 open の実装 与えられたパス名に対応するファイルディスクリプタを返す namei を呼び出しパス名を inode に変換 プロセス構造体の空きファイルディスクリプタに新しいファイルディスクリプタの構造体へのポインタを設定 int open(char *path, int flags,...) { struct inode *ip; int fd; struct file *fp; ip = namei(path); if (ip) { fp = 新しいファイルディスクリプタの構造体を作成 ; fp->inode = ip; fp->offset = 0; fp->refcount = 1; fd = proc の未使用ファイルディスクリプタ ; proc->file[fd] = fp; return fd; } else return -1; } file 構造体 struct file { struct inode *inode; long offset; int refcount; };

18 namei ディレクトリの中に指定された名前のエントリが存在するかどうかを調べその inode を返す struct inode *namei(char *path) { struct inode *dp; if (*path == / ) { dp = proc->root_directory; path++; } else dp = proc->current_working_directory; while (*path) { name = path から次の / までの部分を取り出す ; dp = lookup(dp, name); } return dp; }

19 ファイルの実装方法 ファイルはディスク上の複数のブロックから構成 ファイル毎に利用しているブロック番号を記録する必要がある UNIX では inode により管理 FAT ファイルシステムでは FAT が管理 inode 構造体 ブロックデバイス上のファイルシステム struct inode { short mode; int uid int gid; long size;... int atime; int mtime; int ctime;... int direct[12]; int indirect[3]; }; 所有者 サイズ 変更日付 inode データブロック 直接参照ブロックの番号 (12 個 ) 間接参照ブロック番号 (3 個 ) inode データブロック データブロック

20 直接参照と間接参照 inode から直接参照できるブロックは 12 個のみ 1 ブロック 512 バイトの場合 512 12=6KB 以下のファイル 間接参照ではブロックの配列のブロックを記録 inode 情報 直接 1 直接 2 データ データ 間接ブロック データ 間接ブロック データ データ データ 直接 12 間接 1 間接 2 間接 3 データ 間接ブロック 間接ブロック データ データ

21 ブロック番号の計算 ファイルのオフセットからブロック番号を計算 read, write ではオフセットからブロック番号を計算し, そのブロックにアクセスする int balloc(struct inode *ip, long offset) { struct buf *bp; int i; blk = (offset + BLKSIZE - 1) / BLKSIZE; if (blk < 12) return ip->direct[blk]; blk -= 12; blocks = BLKSIZE/sizeof(int); for (i = 0; i < 3; i++) { if (blk < blocks) break; blk -= blocks; blocks *= BLKSIZE/sizeof(int); } bp = getblock(ip->indirect[i]) while (i-- > 0) { blocks /= BLKSIZE/sizeof(int); bp = getblock(bp->buf[blk/blocks]); blk %= blocks; } return bp->buf[blk]; }

22 バッファリング 要求がある度にディスクからデータを読み込んでいたのでは効率が悪い 一度読み込んだデータはメモリ上でキャッシュとして記憶 2 回目以降はキャッシュから読み込む 書き込みもある程度変更がたまってから一挙に書き出す バッファのハッシュ表 バッファ バッファ バッファ バッファバッファバッファ buf 構造体 struct buf { struct buf *next, *prev; struct buf *queue_next, *queue_prev; struct inode *inode; int dirty; int blkno; char buf[blksize]; }; struct buf buffers[hash]; 利用頻度

23 ディスクのフォーマット 新しいディスクを使うときにはフォーマット ( 初期化する ) ディスク上のファイルシステムスーパーブロック inode 未使用ブロックのリスト ディスク全体の情報を管理 inode が集められている 未使用のブロックの番号をリストあるいはビットマップとして管理 データブロック 実際のデータが入る

24 まとめ ファイルシステム UNIX のファイルシステムを例 システムコールと標準入出力ライブラリ 標準入出力ライブラリの実装 ファイルディスクリプタ ファイルシステムの実装 inode 直接参照ブロックと間接参照ブロック