問題タブ [mmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2875 参照

linux-kernel - 4GBを超える(スパース)ファイルでENOMEMを使用するとCOW mmapが失敗するのはなぜですか?

これは、2.6.26-2-amd64 Linuxカーネルで、コピーオンライトセマンティクス(PROT_READ | PROT_WRITEおよびMAP_PRIVATE)を使用して5GBファイルをmmapしようとしたときに発生します。4GB未満のファイルのマッピング、またはPROT_READのみを使用したファイルは正常に機能します。この質問で報告されているように、これはソフトリソース制限の問題ではありません。仮想制限サイズは無制限です。

これが問題を再現するコードです(実際のコードはBoost.Interprocessの一部です)。

そしてここに何が起こるかです:

これは、nosによって尋ねられた、関連するstrace(新しくコンパイルされた4.5.20)の出力です。

0 投票する
1 に答える
3386 参照

macos - OSX でバッキング ファイルを使用せずにメモリ マップト ファイルを作成するにはどうすればよいですか?

データにアクセスするための基本的な手段としてファイル記述子を使用するライブラリを使用したいと考えています。パフォーマンス上の理由から、このライブラリの関数を使用する前にファイルをディスクにコミットする必要はありません。

その場で (大きな) データ BLOB を作成し、ライブラリを呼び出してサーバーに送信したいと考えています。現状では、ファイルをディスクに書き込んで開き、FD をライブラリに渡し、終了するのを待ってから、ディスク上のファイルを削除する必要があります。必要に応じて BLOB を再作成できるため (また、過度の仮想メモリ ページングが発生するほど BLOB は大きくないため)、BLOB をディスクに保存しても何も得られず、パフォーマンスが大幅に低下します。

メモリ マップされたエンティティとしてのみ存在するデータ ブロックに FD を割り当てることはできますか?

0 投票する
2 に答える
6701 参照

c++ - GDBはmmap()されたカーネル割り当てメモリにアクセスできませんか?

GDBとカーネルスペースに割り当てられたいくつかのバッファで問題が発生しています。バッファは、メモリの連続ブロックを割り当てることになっているカーネルモジュールによって割り当てられ、次に、mmap()呼び出しを介してメモリがユーザースペースにマップされます。ただし、GDBはいつでもこれらのブロックにアクセスできないようです。たとえば、GDBでブレークポイントに到達した後:

ただし、/ proc // smapsでアプリケーションの現在マップされているメモリ領域を見ると、次のことがわかります。

私がこれを調べている理由は、実行中のある時点で、このバッファアドレス(または同様の方法で割り当てられた別のアドレス)がSIGSEGVを引き起こすためです。

このセグメンテーション違反は、クラッシュするまでバッファが頻繁に使用されていたにもかかわらず発生し、/ proc//smapsファイルはこのバッファが上記のようにマップされていることを示しています。

なぜこれが発生するのか、そしてマッピングが/ procでは有効であるように見えるが、GDBでは決して有効ではないのかについて私は完全に途方に暮れています。

0 投票する
2 に答える
6524 参照

c - mmap は何をしますか?

このコード行は何をしますか?

0 投票する
2 に答える
834 参照

winapi - Win32 メモリ マップ ファイルの部分的なマップ解除

ネイティブの Win32 環境で動作させるために必要なコード (変更できない) がいくつかあります。このコードはmmap()とを呼び出すので、 、 などmunmap()を使用してこれらの関数を作成し、同じことを実現しました。最初はこれで問題なく動作し、コードは期待どおりにファイルにアクセスできます。残念ながら、コードはファイルの不要になった選択部分に進みます。CreateFileMapping()MapViewOfFile()munmap()

残念ながら、マップされた範囲の中央にポインターを渡すと、マッピングUnmapViewOfFile()全体が破棄されます。さらに悪いことに、これが部分的なマップ解除要求であることを検出して無視する方法がわかりません。

範囲を呼び出してみVirtualFree()ましたが、当然のことながら、これにより ERROR_INVALID_PARAMETER が生成されます。

部分的なマッピング解除を検出して無視できるように、静的/グローバル変数を使用してすべての開いているメモリ マッピングを追跡する必要があると考え始めていますが、より良いアイデアがあることを願っています...

編集:

上記で十分に明示的ではなかったため、 UnMapViewOfFile のドキュメントはその関数の動作を正確に反映していません。

ビュー全体のマッピングを解除して断片を再マッピングすることは、適切な解決策ではありません。新しいマッピングのベース アドレスを提案することしかできず、それを実際に制御することはできないからです。don'tのセマンティクスでmunmap()は、まだマップされている部分のベース アドレスを変更できません。

私が本当に必要としているのは、既にマップされているメモリ領域のベース アドレスとサイズを見つける方法です。

edit2:問題をそのように言い直すと、VirtualQuery()関数で十分であるように見えます。

0 投票する
2 に答える
3903 参照

atomic - メモリ マップされたファイルと単一ブロックのアトミック書き込み

通常の IO API を使用して 1 つのファイルを読み書きすると、書き込みはブロック単位でアトミックであることが保証されます。つまり、私の書き込みが 1 つのブロックのみを変更する場合、オペレーティング システムは、ブロック全体が書き込まれるか、まったく書き込まれないことを保証します。

メモリ マップト ファイルで同じ効果を得るにはどうすればよいですか?

メモリ マップされたファイルは単なるバイト配列であるため、バイト配列を変更すると、オペレーティング システムはいつ書き込みが「完了」したと見なされるかを知る方法がないため、(可能性が低いとしても) メモリをスワップ アウトする可能性があります。ブロック書き込み操作の途中で、実際には半分のブロックを書き込みます。

ある種の「クリティカル セクションに入る/残す」、または書き込み中にファイルのページをメモリに「固定」する方法が必要です。そのようなものは存在しますか?もしそうなら、それは一般的なPOSIXシステムとWindowsで移植可能ですか?

0 投票する
1 に答える
493 参照

linux - データをコピーせずに大きな mmap() ファイルにページを挿入する

mmap() で開いた大きな (マルチ GB) ファイルの先頭近くに空白ページを挿入する方法があるかどうか疑問に思っています。最後に 1 つか 2 つのページを追加し、memcpy() を使用してすべてを前に進めることは明らかに可能ですが、これはすべてのページを汚し、最終的にディスクにフラッシュするときに非常に長い時間を必要とします。

ソリューションには、カスタマイズされたファイルシステムとページテーブルの手動操作との間の複雑な調整が必要になると思います.inodeにブロックを追加し、これを反映するためにVMM内のキャッシュされたページを何らかの方法で更新し、ページテーブルを何らかの方法でスウィズルしますマッチ。これは自明ではないように聞こえるので、もっと良い方法があるのではないかと思います。

これは、Linux でのメモリとファイル操作に関するやや深い質問を意図したものですが、他のシステムでこれがどのように行われるかを聞いてうれしいです。コピーをより効率的にする回避策には特に興味はありませんが、再マッピングが必要でディスク IO を回避する手法は良い出発点になるでしょう。

0 投票する
1 に答える
3748 参照

linux - Linuxメモリマップトファイルは多くの物理メモリを予約します

Linuxでのメモリマッピングとメモリ消費量の増加に関して、複数のスレッドで説明されている問題があります。

LinuxまたはMacOSXで1GBのファイルを開き、を使用してメモリにマップすると

マップされたメモリを順番に読み取ると、posix_madviseを使用しましたが(読み取りプロセス中に何度も呼び出された場合でも)、プログラムはますます多くの物理メモリを使用します。

成功せずに。:-(

私は試した:

  • 異なるフラグMMAP_RANDOM、MMAP_DONTNEED、MMAP_NORMALが成功しなかった
  • mmapを呼び出す前後のposix_fadvise(me.file.handle、0、capacity(me)、POSIX_FADV_DONTNEED)->成功しません

MacOSXで動作します!!! 組み合わせると

常駐メモリが16M未満です(16mioステップ後に定期的にmsyncを呼び出しました)。

しかし、Linuxでは何も機能しません。Linuxでの私の問題について、誰かがアイデアやサクセスストーリーを持っていますか?

乾杯、デビッド

0 投票する
2 に答える
553 参照

c - ネットワーク経由で mmap の読み取りと書き込みをプロキシするにはどうすればよいですか?

組み込み ARM システムで mmap されたデバイスを制御するソフトウェアに取り組んでいますが、利用可能なデバッグ ツールと開発ツールでは不十分な状況に遭遇しました。つまり、valgrind やハイエンドのスレッド プロファイラなどのインストルメンテーション ツールは使用できません。

私がやりたいことは、x86 マシンでコードをコンパイルし、同じサイズを使用してメモリの「ダミー」セグメントを mmap し、ネットワークを介してこれらの読み取り/書き込みを組み込みマシンにプロキシし、それに応じて応答できるようにすることです。

これにはクライアント/サーバーメカニズムが必要になる可能性が高く、非常に遅くなることがわかっていますが、このオプションを使用することの利点は、x86 開発ツールを使用して計測するために、mmap インターフェイス自体 (非同期イベント処理、スレッド管理) の外部のメカニズムを利用できるようにすることです。非常に便利。

シミュレーション用の ASIC 開発でこの手法について聞いたことがありますが、この機能を提供するものを使用したことはありません。ここでの重要な点は、大量のものを書き直さなくても、またはハードウェア処理ロジックを含むカーネル モジュールを作成しなくても、両方のプラットフォームで同じコードを使用したいということです。mmap を使用して、すべてのデバイス制御ロジックをユーザーランドに保持したい

0 投票する
1 に答える
1481 参照

linux-device-driver - デバイスドライバーで複数のページを持つ mmap を実装する

ユーザーがユーザー空間にマップできるようにしたい RAM のバッファーを使用するデバイス ドライバーがあります。nopages の使用について説明しているhttp://lwn.net/images/pdf/LDD3/ch15.pdfを読みましたが、その例では単一のページのみを使用しており、使用回数を調整して複数のページで機能させることができると書かれています。それがどのように機能するのかわかりません。get_free_page を順序 0 (つまり 1 つの空きページ) で使用してバッファーを割り当てますが、私のバッファーは 2 ページの長さです。

使用回数は何と関係がありますか? 私が理解していることから、最初のページのみがカウントされます。