0

共有メモリとセマフォを使用してパイプを実装しようとしています (実装を完了するには、シグナルも必要な場合があります)。

セマフォを正しく設定する方法に関するアルゴリズムの問​​題に遭遇しました。

パイプ バッファ用の共有メモリの一部と、パイプの情報用の共有メモリの一部 (パイプ内のバイト数など) を既に割り当てているとします。

  1. 相互排除(パイプを使用するリーダ/ライタを一度に1つだけにする)を作成したい
  2. リーダーが空のパイプから読みたい場合は、ライターが何かを書き込むまでブロックする必要があります
  3. '2' と同じですが、完全なパイプに書き込むライター

答えを探してみましたが、よくある演習のように思えますが、何も見つかりませんでした...

次のように実装された「境界バッファ問題」または「消費者プロデューサー問題」と呼ばれる解決策を認識しています。

3 つのセマフォがあります: ミューテックス - 1 フルに初期化 - 0 空に初期化 - n に初期化 (n はパイプ内の「バイト」の数です)

消費者コード:

wait(full)
wait(mutex)

remove a byte from the pipe

signal(mutex)
signal(empty)

プロデューサーのコード:

wait(empty)
wait(mutex)

add a byte to the pipe

signal(mutex)
signal(full)

このソリューションの問題 (私の問題の解決策として使用) は、特定の時間内にパイプから読み取られる、またはパイプに書き込まれるバイトが 1 バイトだけであることです。

私の問題-パイプの実装では、ライターが書き込むバイト数がわかりません。「n」バイトを書き込みたい場合、パイプに場所がある場合にのみ書き込み、そうでない場合は「n」バイト未満を書き込みます...

つまり、ライターは、パイプに書き込む前に、パイプにどれだけの空き容量があるかを確認する必要があります。これは問題です。ライターは、相互排除なしでクリティカル セクション (パイプの情報) にアクセスするためです。

そこで、この部分をクリティカル セクション内に配置することを考えましたが、ライターが書き込みたいときにパイプがいっぱいになった場合、リーダーを 1 人だけ入れて、ライターにさらに書き込みさせるにはどうすればよいでしょうか。

私は混乱してしまった...

どんな助けでも感謝します、ありがとう!

4

1 に答える 1

0

それほど多くのミューテックスを用意したり、その時間だけロックしたりする必要はありません。単一のプロデューサー/コンシューマーのシナリオでは、プロデューサーは空き領域の減少を心配する必要はありません (そのスペースを使い果たすことができるのはプロデューサーだけです)。コンシューマーも同様です。したがって、疑似コードは次のようになります。

プロデューサー

while (lock_and_get_free_space() < bytes_to_write)
    wait()
unlock()

write(bytes_to_write)

lock_and_update_free_space()

消費者

while (lock_and_get_data() < bytes_to_read)
    wait()
unlock()

read(bytes_to_read)

lock_and_update_free_space()
于 2013-02-12T01:25:47.097 に答える