2

共有(同時)データ構造についてかなりグーグルで検索しましたが、

これらはすべて、プロセスではなくスレッドで共有されているようです。

たとえば、共有ハッシュ テーブルを考えてみましょう。

複数のプロセスで共有として実装する場合、

テーブルのすべてmallocまたは同等の呼び出しは、などに置き換える必要がありますshmget

しかし、私はそのような例を見ていません。

複数のプロセスで共有されるデータ構造を実装することは実用的ですか?

そのような例が見つからないという事実は、それが非現実的であることを意味しますか?

4

4 に答える 4

1

主な問題は、プラットフォームに依存しない方法ではないことです。したがって、あなたが何らかのUNIXシステムを使用していると仮定すると、任意のプロセス間で共有するために、おそらくファイルで使用mmapします。これの良いところは、任意の数のプロセスで共有できること、共有ポイント (ファイル) を簡単に特定できること、そして実際の永続ストレージを無料で利用できることです (デバッグが容易になります)。データ構造がどれほど複雑であっても、それは単なる記憶の一部です。したがって、解決しなければならない唯一の問題は、プロセス間で書き込みアクセスを同期する方法です。これは実際にはアプリ固有のものです (ただし、複数のプロセスからの書き込みを許可する場合は簡単ではありません)。

サンプルコード:

#include <sys/mman.h>
#include <fcntl.h>
...
struct my_structure *buf; /* just an example - can be arbitrary complex */
...
int fd = open("foo.bin", O_RDWR);
if (fd == -1) { /* if the file doesn't exist create your initial structure */
  fd = open("foo.bin", O_RDWR | O_CREAT, 0700);
  /* ... allocate enough space in the file or pre-fill with the structure ... */
  /* (for safety you may do that in a separate process or using move-in atomically) */
}
buf = (struct my_structure*) mmap(0, sizeof(*buf), PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
...
/* memory in buf is now shared across all processes ... */
/* if you want to synchronize that shared memory with the file use msync, but it's not needed for the sharing */
msync(buf, sizeof(*buf), MS_ASYNC);
/* when you're done, unmap */
munmap(buf, sizeof(*buf));
于 2012-01-05T04:28:12.010 に答える
0

shmget を使用する必要があり、メモリ バリアを使用して、それらの間で読み取り/書き込みスケジューリングを強制する必要があります。これにより、コンパイラと CPU がソフト ロックなどをスケジューリングするのを防ぎます。バリアは OS および/またはアーキテクチャ固有のものである可能性があるため、OS を投稿していただければ、そのお手伝いができるかもしれません。

質問に答えるには、はい、いいえです。しかし...

並行データ構造は非常に複雑です。可能な場合は、ポータブル ミューテックスでロック/ロック解除できる速度にクリティカル セクションを縮小することをお勧めします。

于 2012-01-05T04:03:24.433 に答える
0

可能な限り共有構造を実装しないでください。それは、陥る可能性のある問題の分野全体を開くからです。

もしそうしなければならないのであれば(そしてそれはプロセスについても同様です)、自分でそれを行うために着手する必要があります。

ただし、 IPCを使用できる場合は、それが最も簡単なオプションです。

于 2012-01-05T03:20:45.190 に答える
0

メモリ(データ構造)を複数のプロセスと確実に共有し、プロセスを相互に通信させて、共有メモリ/データ構造にアクセスするときに同期して動作させることができます。

ここに示されているさまざまな例を確認してください

于 2012-01-05T03:22:50.740 に答える