55
フフフフフフフフ API フ フフフフフフフフフフフ

ファイルシステム API と メモリマップドファイル

Embed Size (px)

DESCRIPTION

ファイルシステム API と メモリマップドファイル. ファイルシステムの役割 (1). 様々な種類の 2 次記憶装置へ , 簡便で 効率的で 安全で 統一的な ( 装置によらない ) 読み書き手段を提供する. メモリ. メモリ. メモリ. ファイルシステムの役割 (2). 電源を切っても失われない情報の ( ほとんど唯一の ) 格納場所 メモリの内容は電源を切ると失われる プロセス間で情報を共有する自然な場所 プロセス間でメモリは分離されていた. ファイル. OS がない状態での 2 次記憶. - PowerPoint PPT Presentation

Citation preview

Page 1: ファイルシステム API と メモリマップドファイル

ファイルシステム API とメモリマップドファイル

Page 2: ファイルシステム API と メモリマップドファイル

ファイルシステムの役割 (1)

様々な種類の 2 次記憶装置へ ,• 簡便で• 効率的で• 安全で• 統一的な ( 装置によらない )

読み書き手段を提供する

Page 3: ファイルシステム API と メモリマップドファイル

ファイルシステムの役割 (2)

電源を切っても失われない情報の ( ほとんど唯一の ) 格納場所• メモリの内容は電源を切ると失われる

プロセス間で情報を共有する自然な場所• プロセス間でメモリは分離されていた

メモリ メモリ メモリ

ファイル

Page 4: ファイルシステム API と メモリマップドファイル

OS がない状態での 2 次記憶 ハードディスク (HDD), Solid State Drive (SSD),

USB メモリ , etc.• 固定サイズの「ブロック」の集合 ( 典型 : 512B, 1KB)• ブロックのアドレス : ( シリンダ , トラック , セク

タ ) または全ブロックの通し番号 (LBA)• 読み書きのインタフェース

• I/O コマンド ( 特権命令 ) 発行• 終了通知の割り込み

HDD SSDhttp://blog.dubspot.com/dj-producer-tools-ssds-solid-state-drives-wave-of-the-future-should-you-get-one/

Page 5: ファイルシステム API と メモリマップドファイル

OS が提供する抽象化 : ファイル

ファイル名 ( パス名 )• ややこしいアドレスではなく自由な文字列

各ファイルをバイト配列として簡便に読み書き ファイル名 , オフセット 記憶場所• キャッシュを用いた効率的アクセス

ファイルの作成,伸長• 空き領域確保

ファイルの所有者,読み書き権限• 単一のデバイスを安全に共有・分離

Page 6: ファイルシステム API と メモリマップドファイル

API : 基本概念 開く (open)

• 権限の検査,以後の読み書き準備 逐次的な読み書き (read/write) 位置あわせ (seek; 頭出し ) メモリマップドファイル ( 後述 ) 閉じる (close)open

r/w seek

Page 7: ファイルシステム API と メモリマップドファイル

Unix API

int fd = open(path, access); int m = read(fd, buf, n); int m = write(fd, buf, n); off_t o’ = lseek(fd, o, from); int err = close(fd);

Page 8: ファイルシステム API と メモリマップドファイル

Windows API

HANDLE h = CreateFile(path, access, …); BOOL ok = ReadFile(h, buf, n, &m, …); BOOL ok = WriteFile(h, buf, n, &m, …); DWORD o’ = SetFilePointer(h, o1, &o2, from); BOOL ok = CloseHandle(h);

Page 9: ファイルシステム API と メモリマップドファイル

C 言語の標準ライブラリ API (1)

FILE * fp = fopen(path, mode); size_t sz’ = fread(buf, sz, n, fp); size_t sz’ = fwrite(buf, sz, n, fp); int fseek(fp, o, from); int c = fgetc(fp); int c’ = fputc(c, fp);

Page 10: ファイルシステム API と メモリマップドファイル

C 言語の標準ライブラリ API (2)

char * s’ = fgets(s, sz, fp); int ok = fputs(s, fp); fscanf(fp, “%d”, &x); /* 例 */ fprintf(fp, “%d”, x); /* 例 */ int err = fclose(fp);

Page 11: ファイルシステム API と メモリマップドファイル

open/read/write 系と fopen/fread/fwrite 系の関係

open/read/write 系 : システムコール fopen/fread/fwrite 系 : ( 結局は open etc. を呼び

出す ) ライブラリ• 違い 1: 書式付入出力 (fprintf, fscanf) など高機能な

IO のサポート• 違い 2: バッファリングを行う

• 複数回の fwrite をメモリ上に保持して一度のwrite システムコールで書き込む

• 一度の read システムコールで大量に読み込んで以降の複数回の fread に答える

Page 12: ファイルシステム API と メモリマップドファイル

バッファリングfwrite

fwritefwrite

fwritefwritefwritefwrite

write

Page 13: ファイルシステム API と メモリマップドファイル

ファイルシステムの実装と性能

Page 14: ファイルシステム API と メモリマップドファイル

ファイルシステム実装の概要 アドレス変換

• 論理的な位置ファイル名 , ファイル内オフセット ディスク内の位置 ( シリンダ,ヘッド,セクタまたは LBA) へ変換

読み出し• アドレス変換 + ブロックの読み出し

書き込み• 必要に応じて空きブロックを割り当てる• アドレス変換 + ブロックへの書き込み

Page 15: ファイルシステム API と メモリマップドファイル

基本事項 2 次記憶のランダムアクセスは遅い 典型的な「遅延」 ( 最小単位の読み書き時間 )

HDD が遅い理由 回転 SSD の書き込みが遅い理由

• 書き込みの verify, 書き込みの単位が大きい

読み出し 書き込み

HDD O(10-2 s) O(10-2 s)

SSD O(10-5 s) O(10-2 s)

主記憶 O(10-7 s) O(10-7 s)

Page 16: ファイルシステム API と メモリマップドファイル

ディスクのアクセス時間 メモリに比べると圧倒的に遅い 一定オーバーヘッド (HDD の位置あわ

せ,回転待ちなど ) が大部分を占める

データ要求量

完了時間

数 ms

Page 17: ファイルシステム API と メモリマップドファイル

OS が備えている,ディスクの遅さへの対処

キャッシュ・遅延書き込み 先読み (prefetch) ディスクスケジューリング (HDD) 空き領域管理・連続割り当て

Page 18: ファイルシステム API と メモリマップドファイル

キャッシュ 一度アクセスされたファイル断片をメモリに保存

効果• 複数回同じ断片を読み書きする場合 , ( うまくいけば )2 回目以降のディスク I/O が不要

• 書き込みをメモリ上にいったん蓄え , 大きな単位で書き込む

メモリが ( アプリケーションによるメモリ割り当て要求,別のファイル読み書きによって ) あふれた時に捨てられる (LRU)

Page 19: ファイルシステム API と メモリマップドファイル

先読み近い将来アクセスが予想される部分を事前に読み込んでおく• 1 度のヘッドの位置あわせ + 回転待ちでた

くさんのデータを読む近い将来のアクセスなんてわかるのか ?

• 実際には先頭からの順次アクセス (sequential scan) に対して発動されるのが典型

Page 20: ファイルシステム API と メモリマップドファイル

ファイルキャッシュとプリフェッチの効果測定

適当な大きさのファイル作成 キャッシュからデータを追い出す同じファイルを複数回読み出して,

「時間 vs 読み出し量」測定• 1 回目と 2 回目の違い ( キャッシュ )• 逐次読み出し vs ランダム読み出し• 一度に行う読み出し量の違いによる変化

Page 21: ファイルシステム API と メモリマップドファイル

連続した領域への割り当て 一度に読み出すのに都合の良いブロッ

ク ( 例 : 同じシリンダ (円周 ) 内の全ブロック ) にファイルの連続した領域を割り当てる• cf. いわゆる「デフラグツール」

先読みの効果を大きくする

Page 22: ファイルシステム API と メモリマップドファイル

HDD の IO スケジューリング アクセスすべきブロックを並び替えて,少ないヘッドの動きで一度に読む

リクエストのヘッド位置 ( シリンダ )

リクエストの到着順

Page 23: ファイルシステム API と メモリマップドファイル

メモリマップドファイルファイルシステムと仮想記憶の

連携

Page 24: ファイルシステム API と メモリマップドファイル

アドレス空間

メモリマップドファイル ファイルを明示的な read/write ではなく

「あたかもメモリの様に」読み書きする API

Page 25: ファイルシステム API と メモリマップドファイル

メモリマップドファイル : Unix API

fd = open(file, access);a’ = mmap(a, n, prot, share, fd, offset);• 意味 : “file の offset バイトから始まる n バ

イトを,アドレス [a’, a’ + n) で access可能にする”• a 0 a’ = a ( 空いていれば )• a = 0 a’ は OS が選ぶ

a’

a’+n offset

offset+n

Page 26: ファイルシステム API と メモリマップドファイル

プライベート / 共有マッピング

パラメータ share• 複数のプロセスが同じファイルを mmap した場合

の挙動を指定• share = MAP_PRIVATE

• プロセスごとに別のコピーを見る• 書き込み結果はファイルに反映されず,プロセ

ス間でも共有されない• share = MAP_SHARED

• 書き込み結果はプロセス間で共有され,ファイルにも反映される

Page 27: ファイルシステム API と メモリマップドファイル

メモリマップドファイル : Windows API

h = CreateFile(file, access, …);m = CreateFileMapping(h, …);a’ = MapViewOfFileEx(m, prot, offset1, offset2, n, a);

prot = FILE_MAP_COPY でMAP_PRIVATE と似た効果を持つ

Page 28: ファイルシステム API と メモリマップドファイル

メモリマップドファイルの用途 (1)

ファイルの読み書き• あたかも mmap がファイルの中身すべてを

メモリに読んできているかのように動作する

• 書き込みが適宜ファイルに反映される(MAP_SHARED)

特に , ファイルへの「ランダム」アクセスを行う簡便な手段

Page 29: ファイルシステム API と メモリマップドファイル

メモリマップドファイルの用途 (2)

メモリの割り当て• sbrk (Unix) や VirtualAlloc (Win32) に代わるメモ

リ割り当て手段• Unix : fd = –1, flags に MAP_ANONYMOUS を渡す , または特別なファイル /dev/zero をMAP_PRIVATE で mmap すると,特定のファイルに結びついていないメモリ領域を得る

• Win32 : INVALID_HANDLE_VALUE をCreateFileMapping に渡すと同様の効果

Page 30: ファイルシステム API と メモリマップドファイル

メモリマップドファイルの用途 (3)

プロセス間共有メモリ• 同じファイルの同じ部分を複数のプ

ロセスが MAP_SHARED で読み書きすれば更新が互いに反映される

プロセス Aアドレス空間

プロセス Bアドレス空間

物理メモリ

Page 31: ファイルシステム API と メモリマップドファイル

メモリマップドファイルの仕組み (1)

mmap/MapViewOfFile etc. の実行時にファイルの中身をすべて読むわけではない

あるページが初めてアクセスされた際に,ページフォルトが発生 OS が対応するファイルから内容を読み込む

ページへの書き込み 適当なタイミングで元のファイルに反映

Page 32: ファイルシステム API と メモリマップドファイル

メモリマップドファイルの仕組み (2)

OS にとっては,メモリ管理 (仮想記憶 ) 機構の自然な延長• メモリの退避場所としてページング / スワップ領域の変わりに通常のファイルを使うだけ

Page 33: ファイルシステム API と メモリマップドファイル

メモリマップドファイルの仕組み (2)

ページフォルト処理 (復習 )

a は割り当てられている ?

アドレス a へのアクセスでページフォルト発生

保護属性 OK?

a を含む論理ページに対する物理ページ割り当て

(OS の ) 保護違反

(OS の ) 保護違反

N

N

Y

Y

アドレス空間記述表を参照

Page 34: ファイルシステム API と メモリマップドファイル

Y 物理ページ割り当て

初めてのアクセス ?

未使用中の物理ページを見つける

割り当てたページを 0 で埋める スレッドを中断

アクセスしたスレッドを再開

ページイン終了後

Y

N 2次記憶 (スワップ領域,ページング領域 )からページ内容を読み込み (ページイン )

Page 35: ファイルシステム API と メモリマップドファイル

Y 物理ページ割り当て

初めてのアクセス ?

未使用中の物理ページを見つける

割り当てたページを 0 で埋める スレッドを中断

アクセスしたスレッドを再開

ページイン終了後

Y

N 2次記憶 (スワップ領域,ページング領域 )からページ内容を読み込み (ページイン )

ファイルマップされた領域 ?

対応するファイルからページ内容を読み込み (ページイン )

Y

Page 36: ファイルシステム API と メモリマップドファイル

mmap システムコール内の動作

アドレス空間記述表へ,新たに mmapされた領域を記録する (だけ )• 後の page fault 時に実際の IO を発動する

Page 37: ファイルシステム API と メモリマップドファイル

mmap と read の性能挙動観察 大きなファイルの全内容を次の二通り

の方法で大きな配列に読み込む• malloc してその領域に read• mmap

Page 38: ファイルシステム API と メモリマップドファイル

メモリマップドファイルが有効な場面 (1)

大きなファイルの一部だけをランダムアクセスする場合• すべてをメモリマップするだけで後はメモリの

読み書きと同じようにアクセスできる• 実際のファイルへのアクセスは個々のページ

を初めて触るまで行われない (cf. read の場合 )

• 実はプログラムコード ( 特にライブラリ ) はメモリマップドファイルを利用して共有されている

Page 39: ファイルシステム API と メモリマップドファイル

まめ知識 strace : Linux でプロセスが発している

システムコールの列を表示 strace コマンド名

Page 40: ファイルシステム API と メモリマップドファイル

プライベート / 共有マッピングの違い (1)プロセス A

アドレス空間

プロセス Bアドレス空間

プロセス Cアドレス空間

物理メモリ

共有マッピング

プロセス Aアドレス空間

プロセス Bアドレス空間

プロセス Cアドレス空間

物理メモリ

プライベートマッピング

Page 41: ファイルシステム API と メモリマップドファイル

プライベート / 共有マッピングの違い (2)

プライベート (Unix mmap のMAP_PRIVATE) : • ( 基本的には ) マッピングの数だけ物理メ

モリを消費 共有 (Unix mmap の MAP_SHARED) :

• すべてのマッピングで物理メモリを共有

(意味の違いを度外視すれば ) 共有のほうが物理メモリの利用効率が良い

Page 42: ファイルシステム API と メモリマップドファイル

OS 内部のマッピングの最適化

読み出し専用マッピング Copy-on-write マッピング考え方 : 可能な限りマッピング (物理

メモリ ) を共有する

Page 43: ファイルシステム API と メモリマップドファイル

読み出し専用マッピング 当然ながら常に ( プライベートマッピ

ングであっても )物理メモリを共有できる

典型的使用場面• プログラム開始時にプログラムテキスト

を読み出すために使われている

Page 44: ファイルシステム API と メモリマップドファイル

Copy-on-write マッピング (1)

書き込み可でマップされた領域も,実際に書き込まれるまでは物理メモリを共有しておく• (ページテーブル, TLB の ) 保護属性を

「書き込み不可」にしておく• 最初の書き込み発生時に CPU 保護例外が

発生.この時点で OS が新しい物理ページを割り当て,コピーを作る

Page 45: ファイルシステム API と メモリマップドファイル

Copy-on-write マッピング (2)プロセス A

アドレス空間

プロセス Bアドレス空間

物理メモリ

プロセス Aアドレス空間

プロセス Bアドレス空間

物理メモリ

同一領域へのプライベートマッピング

書き込み

Page 46: ファイルシステム API と メモリマップドファイル

Copy-on-write の別の応用高速 fork (1)

fork : アドレス空間のコピー pid = fork();

if (pid == 0) { /* child */ …; execve(“/bin/ls”, …);} else { /* parent */ …;} ls

fork

exec

Page 47: ファイルシステム API と メモリマップドファイル

Copy-on-write の別の応用 :高速 fork (2)

子プロセス生成 =ページテーブル + アドレス空間記述表のコピー (物理メモリのコピー )• 生成直後は物理メモリを親子で共有• ただし「書き込み不可」に設定しておく

書き込まれたページのみ,書き込まれた時点でコピーを生成していく

子プロセスがやがて execve を実行すると,子プロセスのマッピングは除去される

Page 48: ファイルシステム API と メモリマップドファイル

メモリマップドファイルが有効な場面 (2)

多数のプロセスが大きなファイルをアクセスする場合• 共有マッピング : 常に物理ページが共有され

る• プライベートマッピング : 書き込まれるまで物理ページが共有される

• cf. read の場合 : • 読み込みに使うバッファがプロセス数分• ファイルの読み込みに使うキャッシュ

Page 49: ファイルシステム API と メモリマップドファイル

read vs. mmap (1)

プロセス Aアドレス空間

プロセス Bアドレス空間

物理メモリ

キャッシュ プロセスメモリへのメモリ間転送

カーネル内キャッシュ

二つのプロセス A, B が同じファイルをread する場合

Page 50: ファイルシステム API と メモリマップドファイル

read vs. mmap (2)

同じ状況で mmap が使われた場合プロセス A

アドレス空間

プロセス Bアドレス空間

物理メモリ

Page 51: ファイルシステム API と メモリマップドファイル

OS試験 傾向と対策教える側としてのこだわりポイント

• 言葉の表層だけでなく「具体的に」理解しているか ?

• 例:「仮想記憶」を習った 仕組みを語れるだけでなく , プログラムの性能にどう反映されるのか ? など

Page 52: ファイルシステム API と メモリマップドファイル

重要項目 スケジューリング

• 3つの目標 (公平 , 効率 , 応答性 )並行性

• 頻忙待機はなぜいけないのか ?• 競合状態 , 排他制御 , 条件変数

Page 53: ファイルシステム API と メモリマップドファイル

仮想記憶• なぜ物理メモリを超えてメモリを使えるのか ?• 同じメモリを触るでもコストが全然違う

•触った結果ページフォルトが起きるか否か ?•起きた場合 , diskから読み込みが必要か否か ?

• ページング (ページの入れ替え ) アルゴリズム• 物理メモリを超えて主記憶をバンバン使うプ

ログラムの挙動 ( スラッシング )

Page 54: ファイルシステム API と メモリマップドファイル

ファイル , 特に仮想記憶の連携• キャッシュ

• ファイルがキャッシュにあるか否かで性能が天と地ほど違う

• mmap• ディマンドページングの自然な延長• MAP_SHARED の仕組み

Page 55: ファイルシステム API と メモリマップドファイル

振り返ると重要項目は少ない 要するに大したことは教えていない毎年試験問題を作り続けているがネタは枯渇気味

まだ問題は作っていないがどうせ似たような傾向だろう

過去問と講評は隠すつもりはないが気まぐれとその時の余力で公開したりしなかったりしている