5

データを共有する2つのプロセスを同期する方法を模索しています。

基本的に、共有メモリを使用してリンクされた2つのプロセスがあります。プロセスAで共有メモリ領域にデータを設定し、プロセスBでそのデータを読み取って処理する必要があります。

私が探している一連のイベントは次のとおりです。

  1. データ利用可能信号を待機しているBブロック
  2. Aはデータを書き込みます
  3. 利用可能な信号データ
  4. Bはデータを読み取ります
  5. データが利用できない信号を待機しているBブロック
  6. 信号データは利用できません
  7. すべてが最初に戻ります。

言い換えると、Bは「1」信号を取得するまでブロックし、データを取得してから、その信号が「0」になるまで再度ブロックします。

純粋な共有メモリを使用して正常にエミュレートできましたが、CPU時間を100%消費するwhileループを使用してブロックするか、一部の信号を見逃すことがあるnanosleepを含むwhileループを使用します。

セマフォを使用してみましたが、1ではなく0を待つ方法しか見つかりませんでした。また、2つのセマフォを使用しようとしてもうまくいきませんでした。セマフォが進むべき道ではないと思います。

すべて同じ共有メモリ領域にアクセスする多数のプロセスがあり、その共有メモリが変更されたときにすべてのプロセスに通知する必要があります。

基本的に、ハードウェアデータと制御バスをエミュレートしようとしています。イベントはレベルトリガーではなくエッジです。それは、州自体ではなく、私が興味を持っている州間の移行です。

それで、何かアイデアや考えはありますか?

4

4 に答える 4

2

Linux には、通常の/ループeventfd(2)に組み込むことができる独自の機能があります。通常の方法で UNIX ソケットを介してプロセスからプロセスにファイル記述子を渡すか、単に で継承することができます。pollselecteventfdfork(2)

編集 0:

質問を読み直した後、あなたの選択肢の 1 つはシグナルとプロセス グループだと思います。同じプロセス グループ ( ) の下で「リッスン」プロセスを開始し、またはへsetpgid(2)の負のpid引数でそれらすべてにシグナルを送ります。繰り返しますが、Linux はポーリングを提供し、遅い信号のトランポリンを回避します。kill(2)sigqueue(2)signalfd(2)

于 2012-06-04T18:36:35.483 に答える
0

1 シングル リーダー & シングル ライター
1 シングル リーダー & シングル ライター これは、セマフォを使用して実装できます。posix セマフォ api には、セマフォ カウントの値がゼロになるまで待機する sem_wait() があり、他のプロセスから sem_post を使用して増加すると、待機が終了します。

この場合、同期のために 2 つのセマフォを使用する必要があります。

プロセス 1 (リーダー)
sem_wait(sem1);
.......
sem_post(sem2);

プロセス 2(ライター)
sem_wait(sem2);
.......
sem_post(sem1);

このようにして、共有メモリで同期を実現できます。

于 2012-06-06T11:41:34.040 に答える
0

Linux では、すべての POSIX 制御構造 (ミューテックス、条件、読み書きロック、セマフォ) にオプションがあり、それらが共有メモリにある場合はプロセス間でも使用できます。あなたが説明するプロセスでは、古典的なミューテックス/条件のペアがうまく機能しているようです。..._initこれらの構造の関数のマニュアル ページを参照してください。

Linuxには、これをさらに効率的に処理するための「futex」などの他の適切なユーティリティがあります。しかし、これらはおそらく最初から適切なツールではありません。

于 2012-06-04T21:07:47.800 に答える
0

2 つのプロセスが関係している場合は、 file 、共有メモリ、またはネットワークを使用して、フラグまたはシグナルを渡すことができます。しかし、プロセスがもっと多い場合は、カーネルを変更することで適切な解決策がいくつかあるかもしれません。あなたの質問には共有メモリが 1 つありますよね?! 信号はどのように渡されますか?!

于 2012-06-04T18:36:31.863 に答える