私は次のような状況があります:
メモリに保持されているデータに対して特権操作を行うデーモン。
ユーザー要求を処理する約30のコアで現在実行されているマルチスレッドサーバー。
サーバ(1)は、(2)からクエリを受信し、それらを一つずつ処理し、答えを返します。 (1)の各クエリは決してブロックされず、(1)の処理に1マイクロ秒の部分しかかからないため、(1)があまりにも多くの負荷によってオーバーランしない限り、応答を高速に返すことが保証されます。
基本的に、私は状況を設定したいと思います(1)UNIXドメインソケットをリッスンし、(2)要求を書き込み、応答を読み取ります。しかし、私は(2)の各スレッドを同時に読み書きできるようにしたいと思います。私の考えは、(1)と(2)間の通信のためのスレッドごとに1つのUNIXソケットを持って、これらのソケットがepoll_waitをブロックしてリクエストを1つずつ処理することです。 (2)の各スレッドは、ソケットに対して独立して読み書きを行います。
このアプローチで見られる問題は、私は簡単に動的にスレッド数を増やすことはできません(2)。実行時設定に関して柔軟な方法でこれを実現する方法はありますか?1つのアプローチは、多数のソケットとthread on(2)はランダムに1つのソケットを選択し、その上でミューテックスをとり、クエリを書き、レスポンスを待つことをブロックし、(1)から応答を返すとmutexを解放します。
誰もが良いアイデアを持っていますか?
回答:
回答№1は0私は実行可能な可能性があることを示唆しています独自の提案をして、各スレッドがデーモンと通信するための独自のソケットを作成するようにします。ストリーミング(tcp)ソケットを使うと、より多くのスレッドを動的に追加するという問題を簡単に解決できます。
- デーモンは特定のポートをリッスンします。
socket()
,bind()
そしてlisten()
。待ち受けられているソケットは、最初はそのソケット内の唯一のものですepoll_wait
セット。 - クライアントスレッドは、このポートに接続します。
connect()
- デーモンサーバは、(
accept()
)新しいソケットを作成するために着信接続を追加します。epoll_wait
一緒にセットepoll_ctl()
.
上記の手順は、任意の数のソケットを必要に応じて追加するために使用できます。 epoll_wait
デーモン側でループします。