問題タブ [shared-memory]
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.
posix - Posix共有メモリとマップトファイル
このテーマについて少し学んだので、POSIX共有メモリ(shm_open)とPOSIXマップトファイル(mmap)の本当の違いは何でしょうか。
どちらも、古いIPCメカニズムではなく、/ dev/tmpfsサブシステムを使用しているようです。
では、共有メモリよりもmmapファイルを使用する利点はありますか?
ありがとう。
c++ - スレッド間でデータを「失う」静的メモリ内のSTL構造
私はpthreadsを使用してマルチスレッドのデモプログラムを作成しています。このプログラムでは、1つのスレッドがデータをSTLキューにロードし、別のスレッドがそこから読み取ります。些細なことですね。残念ながら、キューにプッシュされたデータは消えつつあります。私はマルチスレッドに不慣れではなく、メモリ構造に慣れていません-しかし、これは私を困惑させます。
これらは、キュー自体とそれを保護するミューテックスの宣言です。これらは、クライアントコードに含まれるヘッダーにあります。
プログラムが起動すると、プロセス共有属性を使用してミューテックスが初期化されます。
次に、「プロデューサー」スレッドと「コンシューマー」スレッドを起動し、それらに処理を実行させます。プロデューサースレッドは新しいアイテムをキューにプッシュしてからスリープ状態になります。キューに何かを追加する行は次のとおりです。
次にスリープし、コンシューマスレッドに引き継がせます。ただし、コンシューマスレッドがキュー内のアイテムをチェックすると、キューは魔法のように空になります。
gdbを使用してプログラムをステップスルーしました。以下は私の実行の出力です。プロデューサーがキューに何かを追加する場所を確認できます。キューのサイズを印刷してそこにあることを確認します。コンシューマースレッドへのコンテキストスイッチがあり、キューのサイズをもう一度印刷すると、空になります。見てみな:
だから、何が起こっているのか本当にわかりません。キューはクリティカルセクション(読み取り/書き込みの両方)でのみアクセスされ、キューは静的であり、ヘッダーはマルチインクルードされないようにif-defされます。
私は誰もが提供できるどんな助けにも感謝しています!
openmp - Intel の Cluster OpenMP の類似物
Intel Cluster OpenMP の類似物はありますか? このライブラリは、共有メモリ マシン (SMP や NUMA など) をシミュレートしながら、分散メモリ マシン (イーサネット接続された PC のクラスターなど) で実行します。
このライブラリを使用すると、クラスタ上で直接 openmp プログラムを開始できます。
私は検索します
- 分散クラスターで実行されるマルチスレッド プログラムを可能にするライブラリ
- またはライブラリ (libgomp などの置き換え)。分散クラスターで OpenMP プログラムを実行できるようにします。
- Intel C++ 以外に、openmp プログラムからクラスター コードを生成できるコンパイラー
c++ - boost.interprocess の共有メモリからの memcpy の問題
これは私を欲求不満に駆り立てています。データの読み取り/保存ができる Boost.Interprocess を通じて作成された共有メモリで使用する共有メモリ バッファ クラスを作成しようとしています。機能をテストするために次のように書きました
これを実行すると、データは正常に書き込まれmemcpy
ますが、読み取りループの最初でセグメンテーション違反が発生します。gdb は次のように述べています。
プログラムは信号 EXC_BAD_ACCESS を受信しました。メモリにアクセスできませんでした。理由: __memcpy () のアドレス: 0x0000000000000000 0x00007fffffe007c5 の KERN_INVALID_ADDRESS
(gdb) ここで
#0 0x00007fffffe007c5 in __memcpy () #1 0x0000000100000e45 in main (argc=1, argv=0x7fff5fbff9d0) at try.cpp:36
機能はとてもシンプルで、何が欠けているのかわかりません。どんな助けでも大歓迎です。
python - Python: os.fork を使用したファイル I/0 の改善?
私の問題は非常に単純です。10,000,000 行のデータで満たされた 400MB のファイルがあります。RAM がいっぱいになるのを避けるために、各行を反復処理し、何かを実行して、その行をメモリから削除する必要があります。
私のマシンには複数のプロセッサがあるため、このプロセスを最適化する最初のアイデアは、2 つの異なるプロセスを作成することでした。一度に数行ずつファイルを読み取り、徐々にリストを埋めていきます (リストの 1 つの要素がファイルの 1 行になります)。もう 1 つはこの同じリストにアクセスし、そこから要素を pop() して処理します。これにより、片側から拡大し、反対側から縮小するリストが効果的に作成されます。
言い換えれば、このメカニズムは、2 番目のプロセスがクランチするための行が常に入力されるバッファーを実装する必要があります。しかし、おそらくこれは以下を使用するよりも高速ではありません:
c++ - 共有メモリ内にある場合、pthread ミューテックスはスレッド間で機能しますか?
私はこれを見つけました: 高速プロセス間同期方法
私は、pthread ミューテックスは同じアドレス空間内の 2 つのスレッド間でのみ共有できると信じていました。
そこにある質問/回答は、次のことを暗示しているようです。
2 つの別個のプロセス A と B があるとします。それらには共有メモリ領域 M があります。M に pThread ミューテックスを配置し、A でロックし、B でロックし、A でロック解除できます。B はミューテックスをブロックしなくなります。これは正しいです?2 つの別々のプロセスで pThread ミューテックスを共有できますか?
編集: MacOSX で C++ を使用しています。
c++ - C/++ の読み取り専用共有メモリ内の入力グラフを使用したグラフ アルゴリズム (lib)
これらのグラフでさまざまなグラフアルゴリズムを実行する他のプロセスに対して読み取り専用で、共有メモリを介してグラフを共有するマネージャープロセスが必要です。この問題の調査中に出てきたいくつかの質問をしたいと思います。
読み取り専用の shm で (おそらく独自の) グラフ構造を操作できるグラフ ライブラリはありますか? つまり、アルゴリズムはワークスペースと結果バッファーをローカル プロセス メモリに持つ必要があり、グラフ構造で宣言されたバッファーは使用しません。
私が知っている有名な 2 つのライブラリはigraphとBoostです。私は前者の C インターフェースについてよく知りませんし、Boost はまだ使用したことがありません。このトピックに関する経験はありますか (shm の互換性に関して)?
Boost ドキュメントを見ると、shm をサポートする Boost.Interprocess パッケージがあることがわかります。
- 最初は、mmaped shm (Linux プラットフォーム) で手動で作成した shm を使用することを考えました。Boost はこの方法よりも優れており、推奨されますか?
- Boost Graph ライブラリは、手動の shm または Interprocess と一緒にうまく機能しますか?
これらの質問に関する洞察とは別に、グラフ処理と共有メモリに関するあなたの経験について読んでいただければ幸いです。ありがとう!
linux - sys/shm.hを介した複数の変数の共有
shm.hライブラリを使用して1つの共有メモリブロックを使用して2つの異なる共有を試みています。次の例を作成しました。ここでは、1つの共有メモリブロックが作成され、2つの整数を保持するのに十分な大きさです。次に、それに2つの整数を付加し、2つのプロセスを作成します。最初のプロセスは最初の整数をインクリメントします。次に、2番目のプロセスは2つの整数の値を出力します。しかし、何が起こるかというと、両方の整数が増分されます。
私は何が間違っているのですか?shmライブラリの使い方を学び始めたところです。
これはコードです:
そしてこれは出力です:
私はこれをGentooLinuxで実行しています。
c# - メモリマップファイルを介してインスタンス「ポインタ」を別のプロセスに渡すことは可能ですか?
私は基本的に、.NET 4.0 で、インスタンスをシリアル化せずにプログラム/プロセス間でインスタンスを渡す方法を探しています。
はい、古き良き 100% 安全でないポインターがありません ;)
.NET 4.0 へのメモリ マップト ファイルの新しい統合は、それを使用して「ネイティブに」参照/ポインターを渡すことができる場所を読んで、私を助けると思いました。
しかし、次のようなことをしようとすると
次の ArgumentException が発生します。
MMF を使用して参照を渡すことは可能ですか? そうでない場合、プログラム/プロセスにインスタンスを渡す方法はありますか?
c++ - 共有メモリオブジェクトを作成するためのC++クラステンプレートへのアロケータの追加
要するに、私の質問は次のとおりです。クラスがある場合、たとえばSTLベクトルが提供する方法と同様にMyClass<T>
、クラス定義を変更して、ある場合をサポートするにはどうすればよいですか。MyClass<T, Alloc>
共有メモリのアロケータをサポートするには、この機能が必要です。具体的には、共有メモリにリングバッファを実装しようとしています。現在、次のctorがあります。
ここItemType
で、はバッファの各スロットに配置されるデータのタイプです。
さて、これはメインプログラムからバッファを作成するときに素晴らしい働きをします。
ただし、この場合、バッファ自体は共有メモリに作成されないため、他のプロセスからアクセスできません。私がやりたいのは、次のようなことができるようにすることです
ただし、クラステンプレートに明示的なアロケータを追加する方法がわかりません。