1

複数のプロセス間でリッスン ソケットの受け入れを調整する最良の方法は何ですか?

次の2つの方法のいずれかを考えています。

  • 接続の受け入れを開始する順番になったときに各プロセスにメッセージを送信する「マスター」プロセスを用意します。

    したがって、シーケンスは次のようになります。

    マスター プロセスはトークンをワーカー A に渡します。ワーカー A は接続を受け入れ、トークンをマスター プロセスに返します。マスター プロセスはトークンをワーカー B に渡します。

  • 各プロセスには、共有ミューテックスを中心に回転する受け入れスレッドがあります。ミューテックスをロックし、接続を受け入れ、ロックを解放します。

より良いアイデアはありますか?

  • 接続が入ると、すべてのプロセスが起動します。接続を受け入れる前に、共有ミューテックスをロックしようとします。ミューテックスを最初にロックするものは、接続を受け入れます。
4

3 に答える 3

1

また、マスターソリューションは良い選択だと思います。

/* Process struct */
typedef struct _process_t {
    unsigned long process_id;
    struct _process_t *next;   /* next process */
    struct _process_t *prev;   /* previous process */
    struct _process_master *master_process;  /* Master process */
    int (*accepting_socket) (struct _process_t *); /* process accepet function */
    char *received_data_buffer;      /* the data received over the socket */
} process_t;

/* List of process */
typedef struct _process_list {
    process_t *head;
    process_t *tail;
    int count;
} process_list;

/* The master process */
typedef struct _process_master {
    process_list socket_listners;   /* All the process listening */
    process_list ready_listners;    /* Process ready to listen and receive*/

    ..... /* Complete this struct */
} process_master;

プロセスを使用したソリューションが遅い場合は、代わりに使用できますthreads(同じメモリを共有します)が、コードが複雑になり、バグの追跡が困難になる可能性があります。

2番目のソリューションは、ミューテックスの取得とすべてのプロセス間のコンテキスト切り替えのコストのため、最初のソリューションよりも高速ではありません。

于 2012-08-10T18:38:01.253 に答える
1

1)「プロセス」ではなく複数の「スレッド」が必要ない理由がわかりません。

ただし、ワーカー プロセスのプール (「ワーカー スレッド」に対して) が必要な場合は、次のことをお勧めします。

2) マスター プロセスがバインドし、リッスンし、すべての着信接続を受け入れます。

3) 「Unix ソケット」を使用して、承認された接続をマスター プロセスからワーカー プロセスに渡します。

4) 「同期」に関しては簡単です。ワーカーは、使用を開始する新しいファイル記述子ができるまで、Unix ソケットの読み取りを単純にブロックします。

5) ワーカーが「ビジー/フリー」ステータスをマスターに通信するための共有メモリ ブロックを設定できます。

「Unix ドメイン ソケット」の使用に関する説明は次のとおりです。

Stevens の「Network Programming」も優れたリソースです。

于 2012-08-10T18:45:30.290 に答える
0

私が最終的に行った更新 (3): 接続が発生すると、すべてのプロセスが起動されます。接続を受け入れる前に、共有ミューテックスをロックしようとします。ミューテックスを最初にロックするものは、接続を受け入れます。

トークンをやり取りするよりもはるかに高速でした。

皆さんありがとう!

于 2012-08-10T21:08:13.487 に答える