問題タブ [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.

0 投票する
3 に答える
471 参照

python - Pythonで複数のプロセッサを利用した共有データ

重い辞書をデータ (約 250M データ) として使用する CPU 集中型のコードがあります。マルチコア プロセッサを使用していて、一度に複数のタスクを実行できるように利用したいと考えています。ディクショナリはほとんどが読み取り専用で、1 日に 1 回更新される場合があります。
辞書を複製せずにPythonでこれを書くにはどうすればよいですか?
Python スレッドはネイティブ スレッドを使用せず、真の同時実行性を提供しないことを理解しています。プロセス間でデータをシリアル化せずにマルチプロセッシング モジュールを使用できますか?

私はJavaの世界から来ました。私の要件は、データを共有し、複数のプロセッサで実行し、同期プリミティブを提供できるJavaスレッドのようなものです。

0 投票する
11 に答える
110360 参照

linux - UNIX ライクなシステム上のすべての SYSTEM V 共有メモリとセマフォを削除します。

Ubuntu などの UNIX 系システムで、使用されていないすべてのセマフォと共有メモリを 1 つのコマンドで削除するにはどうすればよいですか?

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

c# - COM オブジェクトを使用した C++ アプリケーションと C# アプリケーション間の C# 共有メモリ

C# や C++ を使用して構築されたアプリケーションによって消費される COM オブジェクトに共有メモリを使用することは可能ですか?
C# はクラッシュせずに COM オブジェクトの共有メモリにアクセスできますか?

ありがとう、
アディ・バルダ

0 投票する
3 に答える
1792 参照

kernel - ユーザーレベル空間からカーネル空間の変数にアクセスする

では、カーネル空間で定義されているユーザーレベル空間から読み取りたい構造体を考えてみましょう。ただし、ユーザーレベル空間には複数のプロセスがあります。

例:

カーネル モジュールには、グローバル構造体があります。構造体 { int a; int b; } テスト;

ユーザーレベルのモジュールで、そのグローバル構造体を「外部化」しました

extern struct { int a; int b; } テスト;

コンパイラは文句を言わないし、リンケージエディタも文句を言わない。ただし、ユーザーが複数のプロセスを持っている場合、その構造体はプロセスごとに複製されますか? extern と一緒に共有メモリを使用すると、カーネルの構造体にアクセスできます。n 個のプロセスがある場合、共有されているため、構造体は 1 つしかありません。1 つのユーザー レベル プロセスでカーネル レベル変数にアクセスできますが、それ以上のプロセスがある場合は、「外部化」された各構造体のクローンを取得します。

私の質問は、複数のユーザーレベルのプロセスがカーネルレベルの変数を読み取ることはできますか?

0 投票する
4 に答える
12526 参照

python - PythonのSystemV共有メモリ?

Pythonからの、、、呼び出しをどのshmat()ように利用できますか?それらは標準ライブラリのどこかに隠されていますか?shmdt()shmctl()shmget()

Update0

私は、UbuntuリポジトリまたはPython標準ライブラリ(現在または将来のリリース)にあるSystemVバインディングを求めています。

0 投票する
5 に答える
1829 参照

algorithm - 共有メモリ内の参照カウントの問題を効率的にデバッグするにはどうすればよいですか?

共有メモリに参照カウント オブジェクトがあるとします。参照カウントはオブジェクトを使用するプロセスの数を表し、プロセスはアトミック命令を介してカウントを増減する責任があるため、参照カウント自体も共有メモリにあります (オブジェクトのフィールドまたはオブジェクトのフィールドである可能性があります)。カウントへのポインターが含まれている可能性があります。この問題の解決に役立つ場合は、提案を受け付けています)。場合によっては、プロセスにバグがあり、カウントをデクリメントできないことがあります。どのプロセスがカウントを減少させていないかをできるだけ簡単に把握するにはどうすればよいでしょうか?

私が考えた解決策の 1 つは、各プロセスに UID (おそらく PID) を与えることです。次に、プロセスが減少すると、UID を参照カウントと一緒に保存されたリンク リストにプッシュします (リンク リストを選択したのは、CASを使用してヘッドにアトミックに追加できるためです)。デバッグする場合、共有メモリ内でまだ生きているオブジェクトのリンクされたリストを調べる特別なプロセスがあり、リストにないアプリの UID は、まだカウントを減らしていないアプリです。

このソリューションの欠点は、N がプロセスの数である場合、O(N) のメモリ使用量があることです。共有メモリ領域を使用するプロセスの数が多く、多数のオブジェクトがある場合、これはすぐに非常に高価になります。単一のプロセスを特定できなくても、部分的な固定サイズ情報を使用して、可能なプロセスのリストを何らかの方法で絞り込むことができ、デバッグを支援できる中途半端な解決策があるのではないかと思います。または、1 つのプロセスだけが減少していないときにどのプロセスが減少していないかを検出できた場合 (つまり、カウントの減少に失敗した 2 つ以上のプロセスの検出を処理できない場合)、それはおそらく大きな助けになるでしょう。

(この問題には、すべてのアプリケーションが同じライブラリを使用して共有メモリ領域にアクセスするようにするなど、より「人間的な」解決策がありますが、共有領域がバイナリ インターフェイスとして扱われ、すべてのプロセスが によって作成されたアプリケーションになるわけではありません。また、すべてのアプリが同じライブラリを使用している場合でも、1 つのアプリにライブラリの外部にバグがあり、カウントを減らすことができないような方法でメモリを破壊している可能性があります。 C/C++ ;)

編集:単一プロセスの状況では、制御できるため、RAII (C++) を使用できます。

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

c - null以外のshmaddrを使用したShmat

誰かが(合理的に)null以外の2番目のパラメーターで関数shmat()を使用する例を提供できますか?

マニュアルには次のように書かれています。

#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmat()関数は、共有メモリ識別子shmidに関連付けられた共有メモリセグメントを呼び出しプロセスのデータセグメントに接続します。セグメントは、次のいずれかの基準で指定されたアドレスに接続されます。

  • がNULLポインターの場合shmaddr、セグメントは、システムによって選択された最初の使用可能なアドレスに接続されます。
  • shmaddrがNULLポインターではなく、(shmflg&SHM_RND)がゼロ以外の場合、セグメントは(shmaddr-(shmaddr%SHMLBA))で指定されたアドレスに接続されます。
  • がNULLポインターではなく、(shmflg&SHM_RND)が0の場合shmaddr、セグメントはshmaddrで指定されたアドレスに接続されます。

しかし、shmaddrをNULLに設定した以外でshmatを使用した例は見たことがありません。私のプロジェクトでは、プロセスがそれをメモリに接続してmalloc()問題なく使用でき、別のプロセスがその共有メモリへのポインタを(shmidによって)取得し、メモリにアクセスしようとしたときにセグフォールトしました。

0 投票する
6 に答える
1272 参照

c - これは、読み取り専用メモリを子プロセスと共有するための安全な方法ですか?

連続したメモリのかなり大きなチャンク(〜1GB)を割り当てて初期化し、それを読み取り専用としてマークし、メモリの独自のコピーを作成せずに、それを使用する複数(たとえば数十)の子プロセスをフォークしたいと思います(マシンにはこれに十分なメモリがありません)。

いつものようにメモリを使用し、それmallocを読み取り専用としてマークすると、子プロセスがメモリをコピーせずに安全に使用できるようになると思いますか?(呼び出し後に割り当てられたメモリに何も書き込もうとしないことを確認することを条件とします)。mprotect(addr, size, PROT_READ)forkmprotect

編集:すべての答えをありがとう。

フォローアップの質問-使用することを計画していましたが、使用するため、より小さな割り当てに制限されるとshmget思いました(このページの「制限」セクションを参照)。たとえば、これを使用しているサーバーでは32MBです。しかし、私は1GBの連続したメモリが必要です。この制限について間違っていますか?mm/proc/sys/kernel/shmmax

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

multithreading - 共有リソースへのアクセスは、それにアクセスする子スレッドを生成する前に、親スレッドによってロックする必要がありますか?

次の擬似コードがある場合:

sharedVariable = somevalue;
CreateThread(threadWhichUsesSharedVariable);

マルチコアCPUが、親スレッドが書き込む前にsharedVariableの値を読み取るthreadWhichUsesSharedVariable()でコードを実行することは理論的に可能ですか?競合状態のごくわずかな可能性さえも完全に理論的に回避するために、コードは代わりに次のようになります。

sharedVariableMutex.lock();
sharedVariable = somevalue;
sharedVariableMutex.unlock();
CreateThread(threadWhichUsesSharedVariable);

基本的に、スレッドの生成がその時点でCPUを明示的に線形化するかどうかを知りたいのですが、そうすることが保証されています。

スレッド作成のオーバーヘッドはおそらくこれが実際には問題にならないほど十分な時間がかかることを私は知っていますが、私の完璧主義者は理論的な競合状態を恐れています。一部のスレッドまたはコアが大幅に遅れ、他のスレッドまたはコアが高速かつ効率的に実行されている極端な状況では、ロックがない限り、実行(またはメモリアクセス)の順序が逆になる可能性があると想像できます。

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

linux - 既存の共有メモリセグメントサイズの変更

shmget / shmat / shmdtを使用して共有メモリセグメントを作成、接続、管理するレガシーコードがいくつかあります。

コードを含むアプリがクラッシュし、セグメントがメモリに残ることがあります。コードは同じセグメントキーを再利用してそれらに再接続しますが、毎回異なる共有メモリサイズを使用し、このために接続できないという問題があります。

私の質問は:

1)接続時に共有メモリサイズを変更することはできますか?

2)そうでない場合、共有メモリセグメントに接続して(サイズがわからない場合でも)、それを消去する(後で新しいセグメントを再作成するために)にはどうすればよいですか?

ありがとう!