[解決済み】ファイルアクセスにmmapを使用するのはどんな場合ですか?
質問
POSIX環境では、ファイルにアクセスする方法が少なくとも2つ用意されています。 一つは標準的なシステムコール
open()
,
read()
,
write()
というオプションもあります。
mmap()
を使用して、ファイルを仮想メモリにマッピングします。
どのような場合にどちらを使うのが望ましいのでしょうか? また、2つのインターフェイスを搭載するメリットは何でしょうか?
どのように解決するのですか?
mmap
は、複数のプロセスが同じファイルから読み取り専用でデータにアクセスする場合に最適です。これは、私が書いているようなサーバーシステムでよくあることです。
mmap
を使用すると、すべてのプロセスが同じ物理メモリページを共有することができ、多くのメモリを節約することができます。
mmap
また、オペレーティングシステムがページング操作を最適化することも可能です。 例えば、2つのプログラムを考えてみましょう。
A
を読み込むと
1MB
で作成したバッファに
malloc
というプログラムBと
mmaps
1MBのファイルをメモリに格納します。 もしオペレーティングシステムが
A
のメモリーを再利用する前に、バッファーの内容をスワップに書き込まなければなりません。 で
B
の場合、変更されていないすべての
mmap
d ページは、OS が既存のファイルから復元する方法を知っているので、すぐに再利用することができます。
mmap
を元にしたものです。 (OSはどのページが変更されていないかを検出するために、最初に書き込み可能な
mmap
d ページを読み取り専用とし
セグメンテーション違反
と同じように
コピーオンライト
の戦略)。
mmap
にも有効です。
プロセス間通信
. 以下のことが可能です。
mmap
を通信が必要なプロセスで読み取り/書き込みとして使用し、同期プリミティブを使用します。
mmap'd
領域(これが
MAP_HASSEMAPHORE
フラグはそのためのものです)。
一箇所
mmap
が厄介なのは、32ビットマシンで非常に大きなファイルを扱う必要がある場合です。 これは
mmap
は、マップされるファイルの全範囲を収めるのに十分な大きさの連続したアドレスブロックを、プロセスのアドレス空間から見つけなければなりません。 これは、アドレス空間が断片化した場合に問題となります。例えば、2 GB のアドレス空間が空いていても、その中の個々の範囲が 1 GB のファイルマッピングに適合しないことがあります。 この場合、ファイルを小さく分割してマッピングしなければならないかもしれません。
もう一つの厄介な点は
mmap
を読み書きの代わりに使う場合、ページサイズのオフセットでマッピングを開始しなければなりません。 もし、あるデータをオフセット
X
と互換性があるように、そのオフセットを修正する必要があります。
mmap
.
そして最後に、read / writeは、あなたが
できる
は、ある種のファイルを扱うことができます。
mmap
のようなものには使用できません。
パイプ
と
タイ
.
関連
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み] ファイルが使用中であるかどうかを確認する方法はありますか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない
-
[解決済み】C++で大きなバッファをバイナリファイルに高速に書き込むには?
-
[解決済み】mmap()とブロックの読み込みの比較