問題タブ [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.
ipc - mmap はプロセス間で通信するための最良の方法ですか?
ファイルを使用して、Python と Ruby スクリプトの間で通信します。しかし、mmap があります。ここに私の質問があります。
- mmapで同じこと(プロセス間の通信)を行うことはできますか?
- mmap は、物理ファイルよりもどのような利点がありますか? スピードアップ?
- 2 つのプロセス間で通信する最も簡単な方法は何ですか?
- 2 つのプロセス間で通信する最速の方法は何ですか?
c - mmap の配置と粒度
mmapの仕様に混乱しています。
mmappa
のリターンアドレスとする(仕様と同じ)
pa = mmap(addr, len, prot, flags, fildes, off);
私の意見では、関数呼び出しが成功した後、次の範囲が有効です
[ パ、パ+レン )
私の質問は、次の範囲がまだ有効かどうかです。
[ round_down(pa, pagesize) , round_up(pa+len, pagesize) )
[ base, base + size ] 略して
つまり、次のようになります。
base
常にページ境界に配置されていますか?- 常にページサイズの
size
倍数ですか(つまり、粒度はページサイズです)?
ご協力いただきありがとうございます。
この段落で暗示されていると思います:
off引数は、_SC_PAGESIZE または _SC_PAGE_SIZE が渡されたときにsysconf()によって返される値に従って位置合わせおよびサイズ設定されるように制約されます。MAP_FIXED が指定されている場合、アプリケーションは、引数addrもこれらの制約を満たしていることを確認する必要があります。実装は、ページ全体でマッピング操作を実行します。したがって、引数 len はサイズまたはアラインメントの制約を満たす必要はありませんが、実装では、範囲 [pa,pa+len) で指定された部分ページをすべてのマッピング操作に含める必要があります。
しかし、よくわかりませんし、POSIX の経験もあまりありません。
- もっと明確で決定的な証拠を見せてください
- または、POSIX をサポートし、動作が異なるシステムを少なくとも 1 つ表示してください。
ありがとうございます。
linux - ユーザーとカーネルスペース間でのデータのコピーを避け、その逆も同様です。
TCP/IPに代わる並列計算用のアクティブメッセージングプロトコルを開発しています。私の目標は、パケットの遅延を減らすことです。環境はLANであるため、TCP / IPをより単純なプロトコルに置き換えて、パケットの遅延を減らすことができます。私はデバイスドライバーを作成しておらず、TCP/IPスタックをより単純なものに置き換えようとしています。ここで、パケットのデータをユーザースペースからカーネルスペースに、またはその逆にコピーすることを避けたかったのです。mmap()について聞いた。これを行うための最良の方法ですか?はいの場合、いくつかの例へのリンクを提供できれば便利です。私はLinux初心者です、そして私は本当にあなたの助けに感謝します..ありがとう...
ありがとう、バラ
python - fcntlロックを使用した共有mmap調整?
(Linuxまたは他のUNIXライクなシステムからの)共有メモリに使用する場合、マッピングへのアクセスを調整するために使用(または機能)mmap()
することは可能(および移植可能)ですか?fcntl()
flock()
lockf()
このSOの質問への回答は、それが機能するはずであることを示唆しているようです。
私が念頭に置いているのは、共有メモリをプロセス/ページマップで構造化して、ロックの競合を最小限に抑えることです。プロセスはそれぞれのページで同時に動作する可能性があり、プロセス/ページのマッピングを更新するときにのみロックを取得する必要があります。(所有されていないページからの読み取りアクセスには、シリアル番号の確認、目的のデータのコピー、およびそのブロックのシリアル番号が変更されていないことの検証が含まれます)。
概念的には、このファイルマッピングを共有する各プロセスは、を実行しmmap()
、その中の空きブロックを見つけ、プロセス/ページ領域へのロックを取得し、それを独自の割り当てで更新し、ロックを解放してから、楽しく作業を続けます。どのプロセスでも、古いマッピングを検索し(kill()
シグナルとしてゼロを使用)、プロセス/ページテーブルのマッピングをクリーンアップできます。
(大まかに言えば、私はLinux上でPythonの共有メモリを使用する生産者/消費者処理エンジンをいじっています。ソリューションがBSDや他のプログラミング言語に移植可能であることを望んでいます---サポートがあればmmap()
に必要なインターフェイスfcntl()
、flock()
またはlockf().
ロックの競合を測定して同期の失敗を検出する方法を示す疑似コードにも興味があります。それぞれのオブジェクトを使用したスレッド化とマルチプロセッシングQueue()
が、実装するための最も簡単な方法であることを認識しています。 Pythonプロデューサー/コンシューマー処理モデル)。
c - メモリをファイル記述子 (逆 mmap) にマップするシステムコール?
ファイル記述子を必要とするいくつかの既存の関数を使用できるように、メモリをファイル記述子にマップできるようにしたいと考えています。これが本質的に私が探しているものです:
これを実現するために、どのシステム コールを使用できますか?
c - Mmapと構造
セマフォを使用して、プロセス間の通信を含むいくつかのコードを処理しています。私はこのような構造を作りました:
そのように使用します(メインアプリと下位プロセスで同じ)
sem_関数の1つを使用するとすべて問題ありませんが、次のようなことをしようとすると
動作しません。おそらくポインタに何か問題がありましたが、ほとんどすべてを試しましたが、何も機能していないようです。プロセス間で変数や構造などを共有するためのより良い方法があるのではないでしょうか。残念ながら、ブーストなどを使用することは許可されていません。コードは教育目的であり、可能な限りシンプルに保つことを目的としています。
c - 1TBのスパースファイルでMmap()がENOMEMで失敗するのはなぜですか?
私はopenSUSE11.2x86_64で大きなスパースファイルを扱ってきました。1TBのスパースファイルをmmap()しようとすると、ENOMEMで失敗します。テラバイト単位でマップするには64ビットのアドレス空間で十分だと思いましたが、そうではないようです。さらに実験すると、1GBのファイルは正常に機能しますが、2GBのファイル(およびそれより大きいファイル)は失敗します。どこかに微調整する設定があるのではないかと思いますが、大規模な検索では何も見つかりません。
問題を示すサンプルコードを次に示します-手がかりはありますか?
java - VM障害を引き起こすJavaマップ/nio/ NFSの問題:「コンパイルされたJavaコードでの最近の安全でないメモリアクセス操作で障害が発生しました」
java.nioのMappedByteBufferを使用してそれぞれ数GBのファイルを読み取る特定のバイナリ形式(興味がある場合はnfdump )のパーサークラスを作成しました。バイナリ形式は、一連のヘッダーとほとんどが固定サイズのバイナリレコードであり、nextRecord()を呼び出すことによって呼び出されたものにフィードされます。nextRecord()は、ステートマシンをプッシュし、完了するとnullを返します。それはうまく機能します。開発マシンで動作します。
私の本番ホストでは、数分または数時間実行できますが、常に「java.lang.InternalError:コンパイルされたJavaコードでの最近の安全でないメモリアクセス操作で障害が発生しました」をスローし、Map.getIntの1つを指しています。 、getShortメソッド、つまりマップの読み取り操作。
マップを設定する議論の余地のない(?)コードは次のとおりです。
次に、さまざまなmap.get *メソッドを使用して、ファイルの終わりに到達してマップを閉じる前に、shorts、ints、longs、およびその他のバイトシーケンスを読み取ります。
開発ホストで例外がスローされるのを見たことがありません。しかし、私の本番ホストと開発の違いの重要な点は、前者では、NFSを介してこれらのファイルのシーケンスを読み取っているということです(おそらく最終的には6〜8 TB、まだ成長しています)。私の開発マシンでは、ローカルでこれらのファイルの選択肢が少なくなっています(60GB)が、本番ホストで爆発した場合、通常は60GBのデータに到達するかなり前です。
両方のマシンはjava1.6.0_20-b02を実行していますが、本番ホストはDebian / lennyを実行していますが、開発ホストはUbuntu/karmicです。それが違いを生むとは思いません。どちらのマシンにも16GBのRAMが搭載されており、同じJavaヒープ設定で実行されています。
私のコードにバグがある場合、JVMには十分なバグがあり、適切な例外をスローしないと考えています。しかし、これは、NFSとmmapの間の相互作用による、特定のJVM実装のバグであり、公式に修正された6244515の再発である可能性があります。
私はすでに「load」呼び出しを追加して、MappedByteBufferにその内容をRAMにロードするように強制しようとしました。これは、私が行った1回のテスト実行でエラーを遅らせるように見えましたが、それを防ぐことはできませんでした。または、クラッシュする前に最も長くかかったのは偶然かもしれません!
これまで読んだことがあり、以前にjava.nioでこの種のことを行ったことがある場合、あなたの本能は何でしょうか?今のところ私のものはnioなしでそれを書き直すことです:)
c++ - 対応するストリームを書き換えずにstreambufから派生
数日前、私は先読みstreambuf
を使用するサブクラスを作成するのが楽しいだろうと決めました。mmap
私のSTL(SGI)がどのように実装され、が含まれているfilebuf
ことに気づいたかを調べました。したがって、から継承することは問題外です。basic_filebuf
FILE*
basic_filebuf
だから私はから継承しましたbasic_streambuf
。それから私は自分mmapbuf
をfstreamにバインドしたかった。
私がしなければならない唯一のことはfilebuf
...の暗黙のインターフェースをコピーすることだと思いましたが、それは明らかな間違いでした。SGIでは、basic_fstream
を所有していbasic_filebuf
ます。を呼び出しbasic_filestream.std::::ios::rdbuf( streambuf* )
ても、ファイルストリームはそれを完全に無視し、独自のを使用しfilebuf
ます。
だから今、私は少し混乱しています...確かに、私は自分自身を作成することができます、mmfstream
それは正確なコピー/貼り付けになりますfstream
が、それは実際にはDRY指向ではないように聞こえます。
私が理解できないのは、なぜfstream
これほど緊密に結合されているので、 ?filebuf
以外のものを使用できないのかということです。filebuf
ストリームとbufsを分離することの全体的なポイントは、異なるバッファーを持つストリームを使用できることです。
ソリューション:
=>filestream
の暗黙のインターフェースに依存する必要がありますfilebuf
。つまり、fstreamはstreambufクラスによってテンプレート化する必要があります。これにより、の暗黙的なインターフェイスfstream
を実装している限り、誰もが独自のstreambufサブクラスをに提供できるようになります。問題:テンプレートテンプレートパラメーターとして使用しているときにテンプレートセレクターが破損するため、にfilebuf
テンプレートパラメーターを追加できません。fstream
fstream
=>filebuf
追加の属性のない純粋な仮想クラスである必要があります。そのため、すべてのFILE*ガベージを実行せずに継承できます。
このテーマに関するあなたの考えは?
php - PHP スクリプトは mmap/munmap を実行し続けます
私の PHP スクリプトにはループが含まれており、これはポインターのエコーと逆参照 ($tab[$othertab[$i]]-> など) を行うだけです。
このスクリプトが非常に遅くなる (以前よりも 50 倍遅くなるなど) 昨日まではうまく機能していました。
strace を使用した後、90% の確率でスクリプトが mmap/munmap を実行することがわかりました。以下は、strace ログのランダムな部分です。
strace -c コマンドの結果は次のとおりです。
PHPスクリプトは次のとおりです。
このスクリプトだけが遅く、同じサーバー/ドメイン/ディレクトリ上の他のすべてのスクリプトはうまく機能します。他のサーバーでは、同じスクリプトが正常に機能します。スクリプトは、実行時に最大 90% の CPU を使用します。
何か案は?