2017-05-02 8 views
1

複数のプロセスがアクセスする共有メモリーのブロックがあります。1つのパブリッシャーと複数のサブスクライバーのアクセス制御

私はパブリッシャーと呼ばれる情報を書き込み/更新するプロセスが1つあり、このデータを読み取っているプロセスが複数あります(これはサブスクライバーを呼び出しています)。

これは、購読者にパブリッシャからの書き込み/更新の途中で読むことを望まないため、現在共有メモリにあるデータが購読者がそれを取る前に完全に更新されます(書き込みの途中では読み上げません)。

これは私が設計しようとしている動作です:

  • Publisherは、共有メモリを変更することがありますが、他の加入者は、現在、メモリからの読み出していない場合のみです。
  • パブリッシャが現在変更していない限り、任意のサブスクライバは共有メモリから読み取ることができます。
  • ユーザは共有メモリを変更することはできません。したがって、コンシューマは同時に読み取ることができます(パブリッシャが共有メモリを変更していないことを前提とします)。

私が考える最初の解決策は単純ミューテックスで、またはサイズ1のセマフォは、これは、加入者は、新たな情報を取得するたびに、彼らはによって更新されるようにメモリを待つ必要があるだろうことを意味します出版社。ただし、これは、サブスクライバが他のサブスクライバを待たなければならない意図しない結果と、十分なサブスクライバがシステム上に存在する場合、パブリッシャが遅延したり、新しいデータをパブリッシュできない可能性があります。

私はshmに探していたと考えると、パブリッシャーとサブスクライバーの役割を強制するのに便利に見えるが、それ以外はただ、彼らは何ができるのかを強化しませ助けているようだSHM_LOCKSHM_UNLOCKを見つけた第二の溶液必ずの場合はとすることができます。

また、上記のサブスクライバがパブリッシャになり、それぞれが共有メモリのブロックを特定の値に設定する場合とそうでない場合がある逆の場合があります。 (メモリのブロックに書き込むことは保証されていませんが、書き込みが行われた場合は値がPublishersで同じになることが保証されています)。上のPublisherはSubscriberになります。

補遺:

  • 各パブリッシャとサブスクライバは、個々のプロセスです。
  • 私の質問の「共有メモリ」は、メモリの複数の異なるキャッシュを表し、1つのユニットではありません。私のパブリッシャーがN個のデータ単位のうちの1つだけに更新を発行したときに、すべての共有メモリーがサブスクライバーからロックアウトされることは望ましくありません。
  • パブリッシャー(最初の部分から)はデーモンです。私の論理は、データをどこかに置いて、デーモンにタイムリーなアクションをさせたいということです。私はデーモンが加入者によって大きな妨げにならないようにしたい。

私の質問:

  1. 適切に上記のロジックをコード化することができる制御方式はありますか? (パブリッシャーはアクセス権を設定して削除します。アクセシブルにアクセスすると購読者にアクセスします)
  2. この場合、複数のプロセスに情報を公開する方が良い方法はありますか?この状況で共有メモリを使用する方法はありますか?
+0

ここには、[同期チュートリアル](https://www.classes.cs.uchicago.edu/archive/2017/winter/51081-1/LabFAQ/lab7/Semaphores.html)_があります。セマフォー。 – ryyker

答えて

1

必要なものはread-write lockとなります。

これらはネイティブにpthread_rwlock_*のpthreadsでサポートされています。 pthread.h。通常、スレッドにはpthreadが使用されます。

複数のプロセスの場合、セマフォを使用して読み書きロックを実装できます。読書や研究をもう少しすれば、残りの部分を自分で把握するのは簡単です。

+1

それは確かに私が探していたものでした!これは間違いなく独特の奇妙な問題ではないので、このようなものはかなり簡単であるはずです。セマフォーについて言及したので、プロセスのために何かを実装する方法を見てみましょう。一つのセマフォーをN(サブスクライバーの場合)、M(サブスクライバーの場合)のいずれかにします。購読者はメソッドを呼び出して読み取りアクセスを要求し、Publishersは呼び出して書き込みアクセスを要求します。読取りセマフォと書込みセマフォをチェックしてアクセスを判断するロジックとマッピング。 – Ryan

+0

ええ、それはかなり標準です。他にもたくさんのパターンがあります – MrJLP

0

、通常、あなたが mutexそのため、ES必要な理由だけで複雑な条件でアクセスもをロックすると、どこの読者の問題になりやすいということである(またはより正確には、2 cond秒、それは同じmutexを共有することができます)継続的に重複し、ライターへのアクセスをブロックしている。 2つのcondを使用している場合は、ライターの待ち行列に優先権を与え、取得を待っているライターがいる場合に読み取りのためのリソースのブロックを禁止することができます。まあ、私は作家の数が数字や読者よりはるかに少ないと仮定しています。あなたが反対側を打つことができ、作家が重複してそれらをブロックしているため、読者をブロックします。...

最も柔軟なアプローチおそらくライターと読者がフリップフロップを使用して順番に(リーダーが並行して行うことができます)アクセスを待っている反対側の作業者がいるとすぐにスウィートを準備することです。

他の回答で提案されているように、他の回答で提案されているread-write lockをご覧ください。

関連する問題