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

Slides:



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

Linuxを組み込んだマイコンによる 遠隔監視システムの開発
情報検索概説II 第8回 パソコン組み立てと記憶装置 1999/11/25.
計算機工学III オペレーティングシステム #14 ファイル: より進んだファイルシステム 2006/07/21 津邑 公暁
Ibaraki Univ. Dept of Electrical & Electronic Eng.
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第6回 仮想記憶とページング ページング ページ取り出し方式 ページ置き換え方式 中間テスト(40分)
メモリ管理(1).
オペレーティングシステム 第10回 仮想記憶管理(1)
記 憶 管 理(1) オペレーティングシステム 第9回.
入 出 力 管 理 オペレーティングシステム 6/26/09.
物理実験 I 情報実験第9回 2004/12/10 小西 丈予 2003/12/12 中神 雄一
物理実験 I 情報実験第9回 Modified 2005/12/2 徳永 義哉Original 2003/12/12 中神 雄一
計算機システム概論・4回目 本日のトピック:メモリの管理と仮想記憶 メモリ管理におけるOSの役割 メモリの割当方法について
オペレーティングシステム 第11回 仮想記憶管理(2)
データ構造とアルゴリズム 第10回 mallocとfree
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
第13回 プログラミングⅡ 第13回
ファイルシステムAPIと メモリマップドファイル
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
オペレーティングシステム (OSの機能と構造)
記 憶 管 理(2) オペレーティングシステム 第10回.
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
(original Takagi & Saito, 2007)
メモリ暗号化による Android端末の盗難対策
小型デバイスからのデータアクセス 情報処理系論 第5回.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
オペレーティングシステム 第12回 仮想記憶管理(3)
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ファイルシステムAPIと メモリマップドファイル
型付きアセンブリ言語を用いた安全なカーネル拡張
イベント通知機構・メモリ保護API.
第10回 ファイル管理 論理レコードと物理レコード アクセス方式 ユーザから見たファイルシステム 補助記憶装置の構成
マルチスレッド処理 マルチプロセス処理について
VM専用仮想メモリとの連携による VMマイグレーションの高速化
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
仮想メモリを用いた VMマイグレーションの高速化
オペレーティングシステム イントロダクション
Ibaraki Univ. Dept of Electrical & Electronic Eng.
アルゴリズムとデータ構造 補足資料4-1 「メモリと配列」
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
オペレーティングシステムJ/K (仮想記憶管理)
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
オペレーティングシステム (ファイル) 2009年11月9日
オペレーティングシステム i386アーキテクチャ(1)
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
オペレーティングシステム (OSの機能と構造)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習I 2003年7月2日(第11回) 木村巌.
第4回 メモリ管理 主記憶(メインメモリ)の管理 固定区画方式と可変区画方式 空き領域の管理 スワッピング.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
Mondriaan Memory Protection の調査
オペレーティングシステム (ファイル) 2006年11月16日
オペレーティングシステム (ファイル) 2008年11月17日
SMP/マルチコアに対応した 型付きアセンブリ言語
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
コンパイラ 2012年10月11日
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
L4-Linux のメモリ管理における問題点とその解決策
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Presentation transcript:

メモリマップドファイル オペレーティングシステム

今日の流れ (12/10) ディスクの話の残り  ディスクを高速に使う工夫 メモリとディスクの簡単なまとめ メモリマップト・ファイル (mmap)

ディスク (ハードディスク, DVDなど)  電源を切っても消えない  物理的にはシリンダ・ブロックに分かれている  OSによって抽象化され,ファイル単位でデータ を管理できる アクセスはメモリに比べて遅い  →高速化する工夫 ディスクについて (前回の続き)

連続した領域への割り当て 一度に読み出すのに都合の良いブロック (例: 同じシリンダ(円周)内の全ブロック)に ファイルの連続した領域を割り当てる  cf. いわゆる「デフラグツール」 先読みの効果を大きくする fruit.txt ディスク上では 断片化している OS上では 一つのファイル “デフラグ”によって 連続領域に割り当て

ディスクスケジューリング アクセスすべきブロックを並び替えて,少な いヘッドの動きで一度に読む  1,5,3,6というリクエストが来ても,1,3,5,6と 並べ替えて読み,ヘッドの動きを少なくする 赤(1) 黄(5) 緑(3) 青(6) 元々のリクエスト: 赤(1) 黄(5) 緑(3) 青(6) 赤(1) 緑(3) 黄(5) 青(6) リクエスト処理順: 赤(1) 緑(3) 黄(5) 青(6) 読み取りヘッド

Agenda ディスクの話の残り メモリとディスクの簡単なまとめ  仮想メモリ  ディスクキャッシュ メモリマップド・ファイル (mmap)

OSによるデバイスの抽象化 CPU ディスク メモリ ネットワーク プロセ ス ファイルシステム論理メモリ空間 char[256] hello.c intdouble fruit.txt ソケットAPI デバイスCPUメモリディスクネットワーク OSの見せ方プロセス スレッド 論理メモリ空間 変数 ファイルシステム ファイル TCP/IP ソケット 実際のデバイスOSによる抽象化

OSは柔軟にメモリとディスクを組み合わせる  物理メモリ: 速い・高価・揮発性 →頻繁にアクセスするデータに適する  ディスク: 遅い・安価・不揮発性 →広大な空間を必要とするデータに適する 仮想メモリ:「メモリに見えて実はディスク」 File Cache:「ディスクに見えて実はメモリ」 メモリとディスク ディスク上のスワップファイル 物理メモリ ファイルシステム hello.c アドレス空間 char[256] int[8]int char[512] 物理メモリ上の ファイルキャッシュ ディスク fruit.txt

物理メモリより大きなアドレス空間を提供  頻繁にアクセスされるページは物理メモリ上  物理メモリ上に無い番地にアクセスすると, ページフォルト(Page Fault)が発生して ディスクからメモリにデータが読み込まれる 仮想メモリ:ディスクを用いてメモリを拡張 ディスク上 A BC D EF ディスクから メモリにDが コピーされる Dにアクセス Page Fault アドレス空間 A BC D EF メモリ上 アドレス空間

ファイルの一部をメモリ上にキャッシュ  アクセスしたファイルをメモリ上にキャッシュ  2回目からはキャッシュに対しアクセス 2回目はメモリコピーと同じアクセス速度になる File Cache: メモリを用いてディスクを高速化 f =open(hello.c); read(f, buf); メモリに キャッシュされる ファイルを読み込み hello.c … read(f, buf2); キャッシュが 読み書きされる 2回目のアクセスは高速 hello.c アドレス空間 buf[256] アドレス空間 時々 同期される

Agenda ディスクの話の残り メモリとディスクの簡単なまとめ メモリマップド・ファイル(Mmap)  使い方  ファイルをメモリみたいにアクセス  共有マッピングでプロセス間でデータの共有  メモリ確保 (mallocの実体?)  仕組み  プライベートマッピングの最適化  mmapの利用価値

ファイルAPIはstream(流れ)志向  read()は前の読み出し位置を覚えている メモリはランダムアクセス志向  いつでも配列の任意の場所を読み書きできる ファイルAPI 開く読み込み書き込み メモリmalloc(128) int A[10]; i A[3] i = 10 A[10] = 128 ファイルopen()read() seek() write() seek() ネットワークsocket, connectrecv()send()

例:大きな辞書ファイルを引く seek(), read()を繰り返してもいいが面倒 ファイルをメモリのように扱えると便利 →メモリマップドファイル (mmap) ファイルをランダムアクセスしたい場合 ファイルシステム dict.txt アドレス空間 read() A[0] A[200] seek() f = open(dict.txt); read(f, buf); /* do something */ seek(10); read(f, buf); /* do something */ seek(200); read(f, buf); /* do something */ A[0]; /* do something */ A[10]; /* do something */ A[200]; /* do something */ read() A[10]

メモリマップドファイル 基本:ファイルを明示的なread/writeではなく 「あたかもメモリの様に」読み書きするAPI ファイルシステム dict.txt 論理アドレス空間 fd=open(“dict.txt”...); A=mmap(.., fd,..); /* do something */ s = A[100];

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が選ぶ メモリマップドファイル: Unix API ファイルシステム 論理アドレス空間 a’ a’+noffset offset+n

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

プライベートマッピング 同じファイルをマップした際,複数のプロセ スが独立した領域を持つ 論理アドレス空間 プロセ ス dict.txt 論理アドレス空間 プロセ ス dict.txt 2つのプロセスは 別々の物理メモリを見ている (※後述するが, 実際には同じ場合もある)

共有マッピング 同じファイルをマップした際,複数のプロセ スが共通の物理メモリを参照できる  書き込んだデータが共有される 論理アドレス空間 プロセス 1 dict.txt 論理アドレス空間 プロセス 2 2つのプロセスは 同じ物理メモリを見ている dict.txt

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

brk (Unix)やVirtualAlloc (Win32)に代わる メモリ割り当て手段になっている  Unix: 特別なファイル/dev/zeroを MAP_PRIVATEでmmapすると,特定のファイ ルに結びついていないメモリ領域を得る  Win32: INVALID_HANDLE_VALUEを CreateFileMappingに渡すと同様の効果  malloc()の中で使われている mmap()によるメモリの割り当て

Agenda ディスクの話の残り メモリとディスクの簡単なまとめ メモリマップド・ファイル(Mmap)  使い方  仕組み  プライベートマッピングの最適化  mmapの利用価値

mmap/MapViewOfFile etc.の実行時にファ イルの中身をすべて読むわけではない mmapシステムコール内の動作: アドレス空間記述表へ,新たにmmapされた 領域を記録する(だけ)  まだ物理メモリは割り当てない メモリマップドファイルの仕組み(1) dict.txt ?

mmapされたページが初めてアクセスされた 際に,ページフォルトが発生  OSがファイルから内容を読み込む ページへの書き込み  適当なタイミングで元のファイルに反映 メモリマップドファイルの仕組み(2) dict.txt アクセス Page Fault を受けて 読み込み 適宜書き込み

OSにとっては,メモリ管理(仮想記憶)機構 の自然な延長  メモリの退避場所としてスワップ領域の 代わりに通常のファイルを使うだけ メモリマップドファイルの仕組み(3) アドレス空間 物理メモリ SWAP アドレス空間 dict.txt 物理メモリ dict.txt 仮想メモリ メモリマップドファイル char[256] int List ディスク上の スワップファイル ディスク上の ファイル アクセス Page Fault

Y ページフォルト処理 (復習) アドレス a へのアクセスで ページフォルト発生 aを含む論理ページに対する 物理ページ割り当て (OSの)保護違反 N N Y aは割り当て済み? 保護属性OK? アドレス空間 記述表を参照 アドレス空間 記述表を参照 次のスライドでは ここを詳しく説明

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

大きなファイルの全内容を次の二通りの方法 でアクセス  mallocとreadでファイル全体に相当する内容を 読み込んで、アクセス  mmapして配列のようにアクセス  両方の手法で2回ずつ読み込み デモ: mmapとreadの性能挙動観察

Agenda ディスクの話の残り メモリとディスクの簡単なまとめ メモリマップド・ファイル(Mmap)  概要  仕組み  プライベートマッピングの最適化  読み出し専用マッピング  Copy-on-writeマッピング  mmapの利用価値

共有: 全てのマッピングで物理メモリを共有 プライベート: マッピングの数だけ物理メモリを消費  プライベートマッピングは(そのままだと)共有マッピング に比べて物理メモリの利用効率が悪い プライベート/共有マッピングの違い 物理メモリ file プロセスC アドレス空間 共有マッピングプライベートマッピング プロセスB アドレス空間 プロセスA アドレス空間 物理メモリ file プロセスC アドレス空間 プロセスB アドレス空間 プロセスA アドレス空間

考え方: 可能な限り物理メモリを共有する  読み出し専用マッピング  明示的に「読み出し専用」としてマッピング  “Copy-on-write”マッピング  書き込みが起こったらはじめてコピーする OSのプライベートマッピング最適化

読み出し専用マッピング 利用者が読み出し専用であることを指定する  書き込みが起こらないので,プライベートマッ ピング間で常に物理メモリを共有できる 典型的使用場面  プログラム開始時にプログラムテキストを読み 出すために使われている

コピーを作らないといけない場面で,実際に 書き込みが起こるまでコピーをしない  mmap()でのプライベートマッピング  fork()でのメモリコピー  PHPやPythonでの値渡しの変数 Copy-on-write

書き込み可でマップされた領域も,実際に書き込ま れるまで物理メモリを共有しておく  保護属性を「書き込み不可」にしておく (ページテーブル,TLB上で) 最初に書き込みが起きた時にCPU保護例外が発生  ここでOSが新しい物理ページを割り当て,コピーを作る Copy-on-writeマッピング 物理メモリ file 書き込み発生前 プロセスB アドレス空間 プロセスA アドレス空間 物理メモリ file プロセスB アドレス空間 プロセスA アドレス空間 write 発生 コピー 書き込み発生後

fork : アドレス空間のコピー pid = fork(); if (pid == 0) { /* child */ …; execve(“/bin/ls”, …); } else { /* parent */ …; } 応用: Copy-on-writeによる高速fork(1) ls fork exec

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

Agenda ディスクの話の残り メモリとディスクの簡単なまとめ メモリマップド・ファイル(Mmap)  使い方  仕組み  プライベートマッピングの最適化  mmapの利用価値

大きなファイルの一部だけをランダムアクセ スする場合  実はプログラムコード(特にライブラリ)はメモリ マップドファイルを利用して共有されている  printfやmallocが含まれるlibc.soなど  straceで観察してみよう メモリマップドファイルの利用価値 (1) strace: Linuxでプロセスが 呼んだシステムコールを表示 $ strace strace: Linuxでプロセスが 呼んだシステムコールを表示 $ strace execve("./a.out", ["./a.out"], [/* 27 vars */]) = 0 … open("/lib/libc.so.6", O_RDONLY) = 3 … mmap(NULL, 20466, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2af2c3b88000

多数のプロセスが大きなファイルをアクセス する場合  共有マッピング : 常に物理ページが共有される  プライベートマッピング : 書き込まれるまで物 理ページが共有される malloc()したメモリにread()でデータを読み 込む場合よりもメモリの節約になる  さらに,メモリコピーが発生しない分高速 メモリマップドファイルの利用価値 (2)

二つのプロセスA, Bが同じファイルをread() する場合と,mmap()する場合を比較 malloc & read() mmap() read vs. mmap 物理メモリ file プロセスB アドレス空間 プロセスA アドレス空間 物理メモリ file プロセスB アドレス空間 プロセスA アドレス空間 コピー ファイル キャッシュ buf = malloc(SIZE); f = open(“dict.txt"); read(f, buf); do_something(buf); buf = malloc(SIZE); f = open(“dict.txt"); read(f, buf); do_something(buf); f = open(“dict.txt"); buf = mmap(0, f, …); do_something(buf); f = open(“dict.txt"); buf = mmap(0, f, …); do_something(buf);