web-dev-qa-db-ja.com

プロセス間でのリングバッファの最適な共有

組み込みLinuxシステムを実装しており、システムのバックグラウンドプロセスからのデータを示すライブ更新グラフをWebサイトで提供する必要があります。

問題は、以下の間でデータを最適に共有する方法です。

  1. Cで記述された新しい値でリングバッファを定期的に更新するデータ生成プロセス。

  2. バッファの最新の内容をフェッチする必要があるWebサーバーのCGI関数。 CGI(nginx + wsgi + flask)にはPython)を使用します。

私は現在、このためのUNIXソケットソリューションの作成に傾倒していますが、バックグラウンドプロセスが妨げられないようにするために、Cプログラムでマルチスレッドを使用する必要があると考えています。

もっと簡単な方法はないのだろうか。バッファメモリを直接仮想ファイルにマッピングできますか? RAMディスク上の通常のファイルをバッファとして使用し、それをシークして書き込むのはどうですか?

2
Larsp

スクリプト言語を使用して簡単に実装できるファイルとアトミックな名前変更を使用したシンプルなソリューション。

送信者

  • ファイルにデータを書き込むA
  • ファイルの名前をAからBに変更します

名前の変更はアトミックであり、レシーバーが古いファイルを処理しているときに行うことができます。

受信者がデータを読み取らない場合、送信者はブロックしません。

レシーバー

  1. 同じデータを2回処理しても問題がない場合:

    • ファイルを開くB
    • データの読み取り
    • ファイルを閉じる

    このオプションは、複数のレシーバーがある場合にも機能します。 Webサーバーの複数のCGIプロセス。

  2. 受信者が同じデータを2回処理してはならない場合:

    • ファイルの名前をBからCに変更します
    • 成功した場合は、ファイルCを読み取って処理します
    • オプションでファイルCを削除します

    このオプションは、単一のレシーバーでのみ機能します。

どちらの場合も、送信者が受信者が読み取るよりも速くデータを書き込むと、古いデータは失われます。

もちろん、他のオプションもあります。

1
Bodo