0

複数のデーモン(1つのゲートウェイと複数のサービス、すべて同じノードで実行)があり、そのうちのいくつかのサービスデーモンは、ネットワークに到着する要求に「ソフトリアルタイム」で応答する必要があります。私のアーチはゲートウェイがあるようなものです。あるプロトコルタグに基づいて着信パケットを対応するサービスデーモンにルーティングするデーモン。サービスデーモンは要求を処理し、応答をgwデーモンに送り返します。gwデーモンはネットワークに接続します。すべてうまく機能していますが、「ソフトリアルタイム」を達成しておらず、遅れが見られます。

ゲートウェイとサービスデーモン間でネットワーク接続を共有し、以下の方法でこれを即興で行う予定です。パケットが接続に到着したときに、ソケットからパケットをデキューせずにgwデーモンが接続する通知スキームを使用します。キューはプロトコルヘッダーを調べ、対応するサービスデーモンに「データが到着した」ことを「通知」します。通知を受信すると、サービスデーモンはバイナリセマフォを取得し、ソケットキューからデータをデキューします。そのようなセマフォは2つあり、1つは書き込み用、もう1つは読み取り用です。サービスデーモンがデータを送信する必要がある場合、書き込みセマフォを取得してデータを送信します。ゲートウェイデーモンから「データ到着」通知を受信すると、読み取りセマフォを取得し、ソケットからデータをデキューします。

誰かがこの計画をいつでも試しましたか?このアプローチに問題がありますか?plsコメント/アドバイス。

4

1 に答える 1

1

コピーのオーバーヘッドを回避したい場合はsplice、複数のデーモン間でソケットを共有しようとするのではなく、おそらくを使用する必要があります。そのソリューションは、デバッグと保守が非常に困難になります。

ネットワークプロトコルには、ゲートウェイがパケットのルーティング先を簡単に認識できるヘッダーがあり、その後にサービスデーモン宛てのペイロードが続くことを期待しています(そして期待しています)。

擬似コードでは、ゲートウェイはこれを行います。

while (data on socket)
{
    header = read(socket, sizeof(header));

    service_socket = find_service(header);
    splice(socket, NULL, service_socket, NULL, header->payload_length, 0);
}
于 2012-06-28T12:45:20.303 に答える