問題タブ [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.
c++ - ゲームのメッセージ パッシング システムのオプション
ハンドヘルド ハードウェア (Pandora) を対象とした C++ の RTS ゲームに取り組んでいます。参考までに、Pandora には ~600Mhz の単一の ARM プロセッサがあり、Linux を実行します。私たちは優れたメッセージ パッシング システム (内部と外部の両方) に落ち着こうとしていますが、これは私にとって新しい領域です。
私たちが伝えたいメッセージの例を挙げると役立つかもしれません。ユニットは、モデルをメモリにロードするために次の呼び出しを行うことがあります。
sendMessage("model-loader", "load-model", my_model.path, model_id );
その見返りに、ユニットは、特定の model_id のモデル オブジェクトを含むある種のメッセージを期待し、それをグラフィックス システムに渡すことができます。この sendMessage 関数は決して最終的なものではないことに注意してください。メッセージパッシングシステムに関する私の現在の理解を反映しているだけで、おそらく正しくありません:)
私が言えることは、かなり異なる 2 つの選択肢があるということです。1 つは、メッセージをメモリに渡し、外部マシンと対話する必要がある場合にのみネットワークを通過することです。オーバーヘッドが少ないように見えるため、このアイデアは気に入っていますが、ここでの大きな問題は、メッセージ キューでミューテックス ロックを多用する必要があるように思われることです。可能であれば、過剰なロックを避けたいと思います。(アトミック操作に依存してint
) ロックせずに単純なキューを実装するいくつかの方法を読みましたが、これらはキューに対して 1 つのリーダーと 1 つのライターしかないことを前提としています。オブジェクトのキューには多くのライターと 1 つのリーダーがあるため、これは特定のケースでは役に立たないようです。
もう 1 つの選択肢は、ネットワーク層を完全に通過することです。これには、非同期メッセージ パッシングをほとんど無料で取得できるなど、いくつかの楽しい利点があります。また、ローカルで渡すのとまったく同じ呼び出しを使用して、メッセージを他のマシンに渡すことができます。ただし、このソリューションは、おそらく私が完全に理解していないため、間違った方法でこすります:)メッセージを送受信するすべてのオブジェクトにソケットが必要ですか? もしそうなら、これは過剰に思えます。特定のゲームには、何千ものオブジェクトがあります。Pandora のようなややパワー不足のデバイスの場合、そのようなネットワークの悪用がボトルネックになるのではないかと心配しています。しかし、私はまだテストを実行していないので、これは単なる憶測です。
MPI はメッセージ パッシングで人気があるようですが、私たちが求めているものにはやり過ぎのように感じます。このコードは、クラスターに触れたり、重い計算を行う必要はありません。
これを達成するためにどのようなオプションがあるかについての洞察をいただければ幸いです。
delphi - アプリケーションプラグイン
JEDI Plugin テクノロジを使用してアプリケーションにいくつかのプラグインを開発していますが、特にデータベース接続を処理するときに、メモリ共有に関する多くの問題に遭遇します。メイン アプリケーションは FASTMM4 メモリ マネージャーを使用します。プラグインを操作するためのもう少し簡単なフレームワークを知っている人はいますか?
windows - Windows で shm_open をエミュレートする方法は?
私のサービスは、数ビットの情報を保存する必要があります (最低でも 20 ビット程度ですが、それ以上を簡単に利用できます)。
- サービスがクラッシュしたり、異常終了したりしても、サービスの再起動後も保持されます
- 再起動後は持続しません
- わずかなオーバーヘッドで読み取りと更新が可能
この情報をレジストリまたはファイルに保存すると、システムの再起動時に自動的に空になりません。
現在、最新の POSIX システムを使用している場合はshm_open
、 を使用します。これにより、プロセスの再起動後も持続する共有メモリ セグメントが作成されますが、システムの再起動後は持続しませんshm_unlink
。永続データが何らかの形で破損した場合は、それをクリーンアップするために使用できます。
MSDNを見つけました: 名前付き共有メモリの作成と、サービス内での再実装を開始しました。これは基本的CreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")
に の代わりに使用しshm_open("/my_service", O_RDWR, O_CREAT)
ます。
ただし、特にこのページファイルに基づくマッピングの有効期間を中心に、いくつかの懸念があります。MSDN ドキュメントでこれらの質問に対する回答が見つかりませんでした。
- 再起動後もマッピングは維持されますか?
- そうでない場合、開いているすべてのハンドルが閉じられると、マッピングは消えますか?
- そうでない場合、マッピングを削除またはクリアする方法はありますか? 使用中は必要ありません。
再起動後も保持される場合、または参照されていないときに消える場合、または手動でリセットできない場合、この方法は役に立ちません。
これらの点で欠陥を検証または発見できますか、または別のアプローチを推奨できますか?
再起動時に消去されることが保証されているディレクトリがあれば、一時ファイルにデータを保存できますが、それでも理想的ではありません。特定のシステム負荷の下で、ファイルのオープン/書き込みエラーが発生します (まれに、時間の 0.01% 未満ですが、まだ発生しています)、この機能はログ パスで使用されます。ここではこれ以上ファイル操作を紹介したくありません。
macos - なぜSysVまたはPOSIX共有メモリとmmap()を使用するのですか?
OS X 10.4以降では、IPCを使用して子プロセスから親プロセスに大量のデータ(200kb以上)を渡す必要があるため、Unixの共有メモリ、特にSystemVとPOSIXの共有メモリメカニズムを調べました。次に、mmap()をMAP_ANONフラグとMAP_SHAREDフラグとともに使用して、同様のことを実行できることに気付きました(または、通常のファイルが作成されてもかまわない場合は、MAP_SHAREDフラグと一緒に使用できます)。
私の質問は、mmap()だけを使用しない理由はありますか?はるかに単純なようで、メモリは引き続き共有され、MAP_ANONを使用する場合は実際のファイルを作成する必要はありません。親プロセスでファイルを作成してから、子プロセスでfork()およびexec()を実行し、それを子プロセスで使用できます。
質問の2番目の部分は、このアプローチでは不十分であり、SysVまたはPOSIX共有メモリメカニズムを使用する必要がある理由は何でしょうか。
Note that I was planning on doing synchronization using pipes that I need for other communication, i.e. the parent asks for data over the pipe, the child writes it to shared memory, and responds over the pipe that its ready. No multiple readers or writers involved. Portability is not a priority.
security - 不正な共有メモリ読み取りの検出と制御
私は疑問に思っていました-許可されたプログラム以外の場所から共有メモリオブジェクトへのアクセスを制御するための既知の技術はありますか?
たとえば、QがアクセスするプログラムPで使用する共有メモリセグメントを作成し、それを読み取り/書き込みにするとします。Qを使用してアクセスできます。これは、アクセスに必要なアクセス許可(Q)に必要な権限(グループを持つ特定のユーザーとして実行するなど)を付与したためです。
ただし、誰かがプログラムRからこの共有メモリにアクセスする可能性がある場合があると思います-単にそれに接続して変更するだけです。これを停止するには、メモリセグメントを読み取り専用にすることができますが、プログラムRはメモリ内にあるものを読み取ることができます。
私の質問は部分的にあります-
する方法はありますか、
a)Qのみが共有メモリにアクセスできるようにしますか?
b)読み取りがQ以外の誰かによって行われたかどうか、そして誰がそれを行ったかを把握しますか?[これも可能ですか?]ボーナスポイントについては、クロスプラットフォームで実行できますか?[おそらくそうではありませんが、試してみても害はありません:)]
不正なプログラムが共有メモリに接続する可能性があるのはどのような状況ですか?1つの方法は、ユーザーがOSの穴を悪用して、プログラムを開始したユーザーになることができるかどうかだと思います。他のもの?
c++ - 生のブースト::バリアントをシリアル化しても安全ですか?
boost::variantは、それが値型であると主張しています。これは、POD タイプのみが含まれている限り、boost::variant の生の表現を単純に書き出して、後でロードし直すことが安全であることを意味しますか? 同じアーキテクチャで、同じコンパイラと同じバージョンのブーストでコンパイルされたコードによって再ロードされると仮定します。
また、(おそらく) 同様に、boost::variant を共有メモリで使用できますか?
c++ - Symbianの共有メモリの例
2つのプロセス間でメモリを共有したいと思います。残念ながら、グーグルを使用するときに有用な例を見つけることができません。浮かび上がるのは、PIPSの使用方法だけです。ただし、メッセージキューの作成と同様に、別の方法で実行できることを覚えています。誰かが私を正しい方向に向けることができれば素晴らしいでしょう!
どうもありがとう
c++ - 共有メモリ セマフォ
10 個のプロセスが実行されており、それぞれが同じファイルに書き込みます。複数のライターは必要ないので、基本的には、ファイルの書き込みを保護するミューテックス/バイナリ セマフォを探しています。問題は、10 個のプロセス間でセマフォを共有できないことです。そのため、10 個のプロセス間で共有メモリを使用し、セマフォを共有メモリ内に配置して、各プロセスからアクセスできるようにすることを検討しています。
Unix用のC/C++でこれに関するドキュメントを教えてもらえますか? この構造を使用するサンプル コードは素晴らしいでしょう。
ありがとう
c++ - C++ で共有メモリに書き込むにはどうすればよいですか?
共有メモリに書き込み、その内容を win32 API のファイルにダンプしたいと考えています。現在、私はこのコードを持っています:
ただし、31 行目 (sprintf 呼び出し) でエラーが発生します。
lpMapAddress を LPTSTR にキャストしようとしましたが、効果がありません。私は何を間違っていますか?または、それを行うより良い方法はありますか?
c++ - 共有メモリへの書き込み
Win32 APIを使用してファイルから共有メモリに書き込むにはどうすればよいですか?
私はこのコードを持っています:
ただし、printf呼び出しは「<output 1>」のみを返し、ファイルの内容は返しません。
編集:問題を見つけました。sprintfを呼び出すときに、入力ファイルに書き込んでいます。しかし、私はまだ理由がわかりません...