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

Slides:



Advertisements
Similar presentations
メモリマップドファイル オペレーティングシステム. 今日の流れ (12/10) ディスクの話の残り  ディスクを高速に使う工夫 メモリとディスクの簡単なまとめ メモリマップト・ファイル (mmap)
Advertisements

メモリマップドファイル オペレーティングシステム. 今日の流れ (12/10) ディスクの話の残り  ディスクを高速に使う工夫 メモリとディスクの簡単なまとめ メモリマップト・ファイル (mmap)
オペレーティングシステム (仮想記憶管理)
情報検索概説II 第8回 パソコン組み立てと記憶装置 1999/11/25.
計算機工学III オペレーティングシステム #14 ファイル: より進んだファイルシステム 2006/07/21 津邑 公暁
ファイルキャッシュを考慮したディスク監視のオフロード
Ibaraki Univ. Dept of Electrical & Electronic Eng.
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第6回 仮想記憶とページング ページング ページ取り出し方式 ページ置き換え方式 中間テスト(40分)
メモリ管理(1).
オペレーティングシステム 第10回 仮想記憶管理(1)
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
記 憶 管 理(1) オペレーティングシステム 第9回.
基本情報技術概論(第12回) 埼玉大学 理工学研究科 堀山 貴史
入 出 力 管 理 オペレーティングシステム 6/26/09.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
~補助記憶装置~  主記憶装置に記憶されるデータは,パソコンの電源を切ると記憶内容が消えてしまう。また,容量にも限界があるので,補助記憶装置にデータを記憶させる。補助記憶装置はパソコンの電源を切っても記憶内容は消えない。補助記憶装置の内容は主記憶装置上で利用することができる。 電源OFF 電源OFF.
計算機システム概論・4回目 本日のトピック:メモリの管理と仮想記憶 メモリ管理におけるOSの役割 メモリの割当方法について
オペレーティングシステム 第11回 仮想記憶管理(2)
第13回 プログラミングⅡ 第13回
ファイルシステムAPIと メモリマップドファイル
オペレーティングシステム (OSの機能と構造)
記 憶 管 理(2) オペレーティングシステム 第10回.
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
OSが乗っ取られた場合にも機能するファイルアクセス制御システム
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
オペレーティングシステム 第12回 仮想記憶管理(3)
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
第8回入出力制御 デバイスコントローラ ポーリングと割込み 入出力の方式 PIO DMA 入出力のためのソフトウェア技法.
型付きアセンブリ言語を用いた安全なカーネル拡張
イベント通知機構・メモリ保護API.
オペレーティングシステム (仮想記憶管理)
プログラミング 2 ファイル処理.
第10回 ファイル管理 論理レコードと物理レコード アクセス方式 ユーザから見たファイルシステム 補助記憶装置の構成
VM専用仮想メモリとの連携による VMマイグレーションの高速化
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
実行時情報に基づく OSカーネルのコンフィグ最小化
仮想メモリを用いた VMマイグレーションの高速化
プログラミング論 ファイル処理 (中級編)
オペレーティングシステム イントロダクション
Ibaraki Univ. Dept of Electrical & Electronic Eng.
オペレーティングシステムJ/K (仮想記憶管理)
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第4回 ファイル入出力方法.
オペレーティングシステム (ファイル) 2009年11月9日
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
オペレーティングシステム (OSの機能と構造)
プログラミング演習I 2003年7月2日(第11回) 木村巌.
第4回 メモリ管理 主記憶(メインメモリ)の管理 固定区画方式と可変区画方式 空き領域の管理 スワッピング.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
Mondriaan Memory Protection の調査
アルゴリズムとデータ構造1 2009年6月15日
オペレーティングシステム (ファイル) 2006年11月16日
オペレーティングシステム (ファイル) 2008年11月17日
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
L4-Linux のメモリ管理における問題点とその解決策
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Presentation transcript:

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

ファイルシステムの役割(1) 様々な種類の2次記憶装置へ, 簡便で 効率的で 安全で 統一的な(装置によらない) 読み書き手段を提供する

ファイルシステムの役割(2) 電源を切っても失われない情報の(ほとんど唯一の)格納場所 プロセス間で情報を共有する自然な場所 メモリの内容は電源を切ると失われる プロセス間で情報を共有する自然な場所 プロセス間でメモリは分離されていた メモリ メモリ メモリ ファイル

OSがない状態での2次記憶 ハードディスク(HDD), Solid State Drive (SSD), USB メモリ, etc. 固定サイズの「ブロック」の集合(典型: 512B, 1KB) ブロックのアドレス: (シリンダ, トラック, セクタ)または全ブロックの通し番号(LBA) 読み書きのインタフェース I/Oコマンド(特権命令)発行 終了通知の割り込み http://blog.dubspot.com/dj-producer-tools-ssds-solid-state-drives-wave-of-the-future-should-you-get-one/ HDD SSD

OSが提供する抽象化: ファイル ファイル名(パス名) 各ファイルをバイト配列として簡便に読み書き ファイルの作成,伸長 ややこしいアドレスではなく自由な文字列 各ファイルをバイト配列として簡便に読み書き ファイル名, オフセット  記憶場所 キャッシュを用いた効率的アクセス ファイルの作成,伸長 空き領域確保 ファイルの所有者,読み書き権限 単一のデバイスを安全に共有・分離

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

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);

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);

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);

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);

open/read/write系とfopen/fread/fwrite系の関係 fopen/fread/fwrite系: (結局はopen etc.を呼び出す)ライブラリ 違い1: 書式付入出力(fprintf, fscanf)など高機能なIOのサポート 違い2: バッファリングを行う 複数回のfwriteをメモリ上に保持して一度のwriteシステムコールで書き込む 一度のreadシステムコールで大量に読み込んで以降の複数回のfreadに答える

バッファリング fwrite fwrite fwrite fwrite fwrite fwrite fwrite write

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

ファイルシステム実装の概要 アドレス変換 読み出し 書き込み 論理的な位置ファイル名, ファイル内オフセット ディスク内の位置(シリンダ,ヘッド,セクタまたはLBA)へ変換 読み出し アドレス変換+ブロックの読み出し 書き込み 必要に応じて空きブロックを割り当てる アドレス変換+ブロックへの書き込み

基本事項 2次記憶のランダムアクセスは遅い 典型的な「遅延」(最小単位の読み書き時間) HDDが遅い理由 回転 SSDの書き込みが遅い理由 書き込みのverify, 書き込みの単位が大きい 読み出し 書き込み HDD O(10-2 s) SSD O(10-5 s) 主記憶 O(10-7 s)

ディスクのアクセス時間 メモリに比べると圧倒的に遅い 一定オーバーヘッド(HDDの位置あわせ,回転待ちなど)が大部分を占める 完了時間 数ms データ要求量

OSが備えている,ディスクの遅さへの対処 キャッシュ・遅延書き込み 先読み(prefetch) ディスクスケジューリング(HDD) 空き領域管理・連続割り当て

キャッシュ 一度アクセスされたファイル断片をメモリに保存 効果 複数回同じ断片を読み書きする場合, (うまくいけば)2回目以降のディスクI/Oが不要 書き込みをメモリ上にいったん蓄え, 大きな単位で書き込む メモリが (アプリケーションによるメモリ割り当て要求,別のファイル読み書きによって)あふれた時に捨てられる(LRU)

readの動作 (1) 2次記憶 キャッシュ(I/O) (read時点でキャッシュにあれば実行されない) アドレス空間 物理メモリ (2) キャッシュ プロセスメモリへのメモリ間転送 キャッシュ

先読み 近い将来アクセスが予想される部分を事前に読み込んでおく 近い将来のアクセスなんてわかるのか? 1度のヘッドの位置あわせ + 回転待ちでたくさんのデータを読む 近い将来のアクセスなんてわかるのか? 実際には先頭からの順次アクセス(sequential scan)に対して発動されるのが典型

ファイルキャッシュとプリフェッチの効果測定 適当な大きさのファイル作成 キャッシュからデータを追い出す 同じファイルを複数回読み出して,「時間 vs 読み出し量」測定 1回目と2回目の違い(キャッシュ) 逐次読み出し vs ランダム読み出し 一度に行う読み出し量の違いによる変化

連続した領域への割り当て 一度に読み出すのに都合の良いブロック(例: 同じシリンダ(円周)内の全ブロック)にファイルの連続した領域を割り当てる cf. いわゆる「デフラグツール」 先読みの効果を大きくする

HDDのIOスケジューリング アクセスすべきブロックを並び替えて,少ないヘッドの動きで一度に読む リクエストのヘッド位置(シリンダ) リクエストの到着順

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

メモリマップドファイル ファイルを明示的なread/writeではなく「あたかもメモリの様に」読み書きする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

プライベート/共有マッピング パラメータshare 複数のプロセスが同じファイルをmmapした場合の挙動を指定 share = MAP_PRIVATE プロセスごとに別のコピーを見る 書き込み結果はファイルに反映されず,プロセス間でも共有されない share = MAP_SHARED 書き込み結果はプロセス間で共有され,ファイルにも反映される

メモリマップドファイル: Windows API h = CreateFile(file, access, …); m = CreateFileMapping(h, …); a’ = MapViewOfFileEx(m, prot, offset1, offset2, n, a); prot = FILE_MAP_COPYでMAP_PRIVATEと似た効果を持つ

メモリマップドファイルの用途(1) ファイルの読み書き あたかもmmapがファイルの中身すべてをメモリに読んできているかのように動作する 書き込みが適宜ファイルに反映される(MAP_SHARED)  特に, ファイルへの「ランダム」アクセスを行う簡便な手段

メモリマップドファイルの用途(2) メモリの割り当て sbrk (Unix)やVirtualAlloc (Win32)に代わるメモリ割り当て手段 Unix : fd = –1, flagsにMAP_ANONYMOUSを渡す, または特別なファイル/dev/zeroをMAP_PRIVATEでmmapすると,特定のファイルに結びついていないメモリ領域を得る Win32 : INVALID_HANDLE_VALUEをCreateFileMappingに渡すと同様の効果

メモリマップドファイルの用途(3) プロセス間共有メモリ 同じファイルの同じ部分を複数のプロセスがMAP_SHAREDで読み書きすれば更新が互いに反映される プロセスA アドレス空間 物理メモリ プロセスB アドレス空間

メモリマップドファイルの仕組み(1) mmap/MapViewOfFile etc.の実行時にファイルの中身をすべて読むわけではない あるページが初めてアクセスされた際に,ページフォルトが発生  OSが対応するファイルから内容を読み込む ページへの書き込み  適当なタイミングで元のファイルに反映

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

mmap動作図 物理メモリ 論理(仮想)アドレス空間 a’ offset a’+n offset+n

メモリマップドファイルの仕組み(2) ページフォルト処理(復習) アドレス a へのアクセスでページフォルト発生 aは割り当てら れている? N (OSの)保護違反 Y アドレス空間記述表を参照 保護属性OK? N (OSの)保護違反 Y aを含む論理ページに対する 物理ページ割り当て

物理ページ割り当て Y N Y 未使用中の物理ページを見つける 初めてのアクセス? N 2次記憶(スワップ領域,ページング領域)からページ内容を読み込み(ページイン) Y 割り当てたページを0で埋める スレッドを中断 ページイン終了後 アクセスしたスレッドを再開

物理ページ割り当て Y Y N Y 未使用中の物理ページを見つける ファイルマップ された領域? 対応するファイルからページ内容を読み込み(ページイン) Y 初めてのアクセス? N 2次記憶(スワップ領域,ページング領域)からページ内容を読み込み(ページイン) Y 割り当てたページを0で埋める スレッドを中断 ページイン終了後 アクセスしたスレッドを再開

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

mmapとreadの性能挙動観察 大きなファイルの全内容を次の二通りの方法で大きな配列に読み込む mallocしてその領域にread

メモリマップドファイルが有効な場面 (1) 大きなファイルの一部だけをランダムアクセスする場合 すべてをメモリマップするだけで後はメモリの読み書きと同じようにアクセスできる 実際のファイルへのアクセスは個々のページを初めて触るまで行われない(cf. readの場合) 実はプログラムコード(特にライブラリ)はメモリマップドファイルを利用して共有されている

まめ知識 strace : Linuxでプロセスが発しているシステムコールの列を表示 strace コマンド名

プライベート/共有マッピングの違い(1) 共有マッピング プライベートマッピング プロセスA アドレス空間 プロセスA アドレス空間 物理メモリ 物理メモリ プロセスB アドレス空間 プロセスB アドレス空間 プロセスC アドレス空間 プロセスC アドレス空間 共有マッピング プライベートマッピング

プライベート/共有マッピングの違い(2) プライベート(Unix mmapのMAP_PRIVATE) : (基本的には)マッピングの数だけ物理メモリを消費 共有(Unix mmapのMAP_SHARED) : すべてのマッピングで物理メモリを共有  (意味の違いを度外視すれば)共有のほうが物理メモリの利用効率が良い

OS内部のマッピングの最適化 読み出し専用マッピング Copy-on-writeマッピング 考え方: 可能な限りマッピング(物理メモリ)を共有する

読み出し専用マッピング 当然ながら常に(プライベートマッピングであっても)物理メモリを共有できる 典型的使用場面 プログラム開始時にプログラムテキストを読み出すために使われている

Copy-on-writeマッピング(1) 書き込み可でマップされた領域も,実際に書き込まれるまでは物理メモリを共有しておく (ページテーブル,TLBの)保護属性を「書き込み不可」にしておく 最初の書き込み発生時にCPU保護例外が発生.この時点でOSが新しい物理ページを割り当て,コピーを作る

Copy-on-writeマッピング (2) プロセスA アドレス空間 プロセスA アドレス空間 物理メモリ 物理メモリ プロセスB アドレス空間 プロセスB アドレス空間 書き込み 同一領域へのプライベートマッピング

Copy-on-writeの別の応用 高速fork (1) pid = fork(); if (pid == 0) { /* child */ …; execve(“/bin/ls”, …); } else { /* parent */ …; } fork exec ls

Copy-on-writeの別の応用: 高速fork (2) 子プロセス生成=ページテーブル+アドレス空間記述表のコピー(物理メモリのコピー) 生成直後は物理メモリを親子で共有 ただし「書き込み不可」に設定しておく 書き込まれたページのみ,書き込まれた時点でコピーを生成していく 子プロセスがやがてexecveを実行すると,子プロセスのマッピングは除去される

メモリマップドファイルが有効な場面 (2) 多数のプロセスが大きなファイルをアクセスする場合 共有マッピング : 常に物理ページが共有される プライベートマッピング : 書き込まれるまで物理ページが共有される cf. readの場合:  読み込みに使うバッファがプロセス数分 ファイルの読み込みに使うキャッシュ

read vs. mmap (1) 二つのプロセスA, Bが同じファイルをreadする場合 キャッシュ プロセスメモリへのメモリ間転送 アドレス空間 プロセスB 物理メモリ キャッシュ プロセスメモリへのメモリ間転送 カーネル内キャッシュ

read vs. mmap (2) 同じ状況でmmapが使われた場合 プロセスA アドレス空間 物理メモリ プロセスB アドレス空間