問題タブ [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.
free - malloc の実装は解放されたメモリをシステムに返しますか?
メモリの割り当てと割り当て解除が頻繁に行われる、寿命の長いアプリケーションがあります。malloc
解放されたメモリをシステムに返す実装はありますか?
この点で、次の動作は何ですか。
- ptmalloc 1、2 (glibc のデフォルト) または 3
- dlmalloc
- tcmalloc (Google スレッドの malloc)
- solaris 10-11 のデフォルトの malloc および mtmalloc
- FreeBSD 8 デフォルトの malloc (jemalloc)
- 買いだめマロック?
アップデート
malloc
日中と夜間でメモリ消費量が大きく異なるアプリケーションがある場合 (例)、解放されたメモリをシステムに戻すよう強制できますか?
そのような戻りがなければ、解放されたメモリは何度もスワップアウトされますが、そのようなメモリにはゴミしか含まれていません。
c - この例でremap_file_pages()が失敗するのはなぜですか?
次のCコードは、Linux2.6.30.5-43.fc11.x86_64で発生している問題を示しています。
これは常に失敗し、remap_file_pages()は-1を返し、errnoはEINVALに設定されます。カーネルソースを見ると、remap_file_pages()で失敗する可能性のあるすべての条件を確認できますが、私の例には当てはまらないようです。どうしたの?
mmap - mmapはディスク上のファイルに書き込みます(同期/非同期)
mmapの機能について質問があります。カーネルがディスク上のマップされたファイルへのデータの永続化を処理する非同期モードでmmapを使用する場合、前の更新で後の更新を上書きすることは可能ですか?
時間Tで、ディスク上のファイルにメモリマップされているメモリ内の場所を変更し、時間T+1でメモリ内の同じ場所を変更するとします。ファイルへの書き込みは同期的ではないため、カーネルが最初に時間T + 1で変更を取得し、次に時間Tで変更を取得して、メモリマップトファイルに不整合が生じる可能性はありますか?
mmap - メモリ マッピングとファイル I/O
1GB マシンでサイズ 10GB のファイルをメモリ マップし、ファイル I/O をトリガーした場合、要求されたデータが物理メモリにないことを確認した後、フェッチされたデータは mmap の対応する仮想アドレスにマップされますか? ?
mmap を使用して同じ場所にアクセスすると、再度 i/o が実行されますか (または、ファイル i/o を使用してフェッチされたデータが使用されますか)
前もって感謝します、
ゴクル。
multithreading - オフセットを使用せずにポインタを共有メモリに格納することは可能ですか?
共有メモリを使用する場合、各プロセスは、共有領域をそれぞれのアドレス空間の異なる領域にマップすることがあります。これは、共有領域内にポインタを格納する場合、共有領域の開始位置のオフセットとして格納する必要があることを意味します。残念ながら、これはアトミック命令の使用を複雑にします (例えば、ロックフリーのアルゴリズムを書こうとしている場合))。たとえば、単一のライターによって作成された、共有メモリ内に多数の参照カウント ノードがあるとします。ライターは、正の参照カウントを持つ有効なノードを指すように、ポインター 'p' を定期的にアトミックに更新します。リーダーは、最初の要素が参照カウントであるノード (構造体) の先頭を指しているため、「p」にアトミックに書き込みたいと考えています。p は常に有効なノードを指しているため、ref カウントのインクリメントは安全であり、'p' の逆参照や他のメンバーへのアクセスを安全に行うことができます。ただし、これはすべて、すべてが同じアドレス空間にある場合にのみ機能します。ノードと「p」ポインタが共有メモリに格納されている場合、クライアントは競合状態になります。
- x = p を読む
- y = x + オフセット
- y で refcount をインクリメントする
ステップ 2 で、p が変更され、x が有効なノードを指しなくなる場合があります。私が考えることができる唯一の回避策は、オフセットではなく実際のポインターを mmap された領域に格納できるように、すべてのプロセスが共有メモリをマップする場所に同意するよう強制することです。それを行う方法はありますか?mmap のドキュメントに MAP_FIXED がありますが、安全なアドレスを選択する方法がわかりません。
編集: x86 でインライン アセンブリと 'lock' プレフィックスを使用すると、「値 Z によるオフセット Y で ptr X をインクリメントする」ことは可能でしょうか? 他のアーキテクチャの同等のオプション? 多くのアセンブリを書いていません。必要な指示が存在するかどうかわかりません。
c - mmapされたアドレスが正しいかどうかを確認します
私は、FreeBSD8.0とLinuxでも実行されるべき高負荷のデーモンを書いています。デーモンの主な目的は、識別子によって要求されたファイルを渡すことです。識別子は、dbへの要求を介してローカルファイル名/ファイルサイズに変換されます。次に、順次mmap()
呼び出しを使用して、。を使用してファイルブロックを渡しますsend()
。
ただし、dbのファイルサイズとファイルシステムのファイルサイズが一致しない場合があります(realsize <dbのサイズ)。この状況では、すべての実際のデータブロックを送信し、次のデータブロックがマップされると、mmapはエラーを返さず、通常のアドレスだけを返します(errno変数もチェックしました。mmap後はゼロになります)。そして、デーモンがこのブロックを送信しようとすると、セグメンテーション違反が発生します。(この動作は、FreeBSD 8.0 amd64で確実に発行されます)
stat()
私は、電話でサイズを確認するために、開く前に安全なチェックを使用していました。ただし、実際の生活では、まれな状況でセグメンテーション違反が発生する可能性があることがわかります。
だから、私の質問は、ポインターを逆参照する前に、ポインターがアクセス可能かどうかを確認する方法がありますか?gdbでコアを開いたとき、gdbは指定されたアドレスが範囲外であると言います。おそらく誰かが提案できる別の解決策があります。
python - PythonのシェルフモジュールはメモリマップドIOを使用しますか?
shelve
PythonのモジュールがメモリマップドIOを使用しているかどうか誰かが知っていますか?
多分その質問は少し誤解を招くです。私shelve
はそれがその汚い仕事をするために基礎となるdbmスタイルのモジュールを使用していることを理解しています。基盤となるモジュールが使用する可能性はどのくらいmmap
ですか?
私はデータストアのプロトタイピングを行っています。時期尚早の最適化は一般的に眉をひそめていることに気づきますが、これは私の設計に伴うトレードオフを理解するのに本当に役立ちます。
c++ - mmap を使用して STL タイプを指すには?
char ポインターに型キャストされた mmap があります
char *ptr;
ptr = (char *)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
これは私の以前のコードでした。しかし、要件が変更されたため、char * の代わりにマップを使用したいと考えています。
今、私のマップは map < int, string > i_s_map; として宣言されています。
マップを指すように mmap 呼び出しを変更するにはどうすればよいですか?
c++ - mmap でのキャッシング
C ++で単純なポインター演算を使用して、非常に大きなファイルから読み取るためにmmap呼び出しを使用しています。問題は、データの小さなチャンク (KB のオーダー) を複数回読み取ると、各読み取りに前の読み取りと同じ時間がかかることです。要求を満たすためにディスクがアクセスされているかどうか、または最初の呼び出しの後の呼び出しで要求がメイン メモリ (ページ キャッシュ) から処理されているかどうかを確認するにはどうすればよいですか。
python - Python2.6でmmap関連の関数を実行するとエラーが発生します
http://docs.python.org/library/mmap.htmlから次のコードを実行しようとしました
しかし、エラーが発生しました。
これの何が問題になっていますか?Snow Leopard/Macでpython2.6を使用しています。