2016-06-17 2 views
1

У меня следующая ситуация:Как настроить связь между двумя процессами?

  1. Демон, который делает привилегированную операцию на данных, которые хранятся в памяти.

  2. Многопоточный сервер в настоящее время работает на 30 ядрах, обрабатывающих запросы пользователей.

Сервер (1) будет получать запросы от (2), обрабатывать их один за другим и возвращать ответ. Каждый запрос к (1) никогда не будет блокироваться и будет обрабатывать только часть микросекунды (1) для обработки, поэтому мы гарантированно получим ответы назад, если только (1) не переполнится слишком большой нагрузкой.

По существу, я хотел бы настроить ситуацию, когда (1) прослушивает сокет домена UNIX и (2) записывает запросы и считывает ответы. Тем не менее, я хотел бы, чтобы каждый поток (2) мог читать и писать одновременно. Моя идея состоит в том, чтобы один сокет UNIX на поток для связи между (1) и (2) имел (1) блок в epoll_wait в этих запросах обработки сокетов один за другим. Каждый поток на (2) затем будет считывать и записывать независимо в его сокет.

Проблема, которую я вижу при таком подходе, заключается в том, что я не могу легко динамически увеличить количество потоков на (2). Есть ли способ сделать это таким образом, который является гибким в отношении конфигурации времени выполнения? Я предполагаю, что один подход состоял бы в том, чтобы иметь большое количество сокетов, а поток (2) выбирал один сокет случайным образом, брал на нем мьютекс, записывал запрос и блокировал ожидающий ответ, а затем отпускал мьютекс, когда он получает ответ от (1).

У кого-нибудь есть идеи?

+0

К сожалению, не могли бы вы подробнее объяснить, в чем проблема с вашим собственным предложенным решением? Кажется вполне разумным, чтобы каждый поток (2) записывался в свой собственный сокет, как вы предлагаете, и (1) 'epoll_wait'ing на всех из них. – Smeeheey

+0

Если вы говорите о датаграммах (похоже, что вы!) Вполне разумные решение состоит в том, чтобы несколько потоков прослушивали (и записывали) на ** то же ** сокет. Эта схема не требует никакой внешней синхронизации (для себя. Возможно, вам потребуется синхронизировать внешние данные, конечно). – SergeyA

+0

@SergeyA: Я думаю, проблема с тем же сокетом заключается в чтении ответа, пытаясь выяснить, к какому потоку принадлежит ответ? – eof

ответ

0

Я бы предположил, что жизнеспособная возможность состоит в том, чтобы пойти с вашим собственным предложением и создать потомок каждого своего сокета для общения с демоном. Вы можете использовать потоковые (TCP) сокетов, которые могут легко решить вашу проблему добавления большего количества потоков динамически:

  1. демон прослушивает определенный порт, используя socket(), bind() и listen(). Слушание гнезда первоначально является единственной вещью в ее наборе epoll_wait.
  2. клиентские потоки подключаются к этому порту с connect()
  3. Сервер демон принимает (с accept()) входящего соединения, чтобы создать новый сокет, который добавляется к его epoll_wait набор с epoll_ctl().

Вышеприведенная процедура может использоваться для произвольного добавления столько сокетов, сколько вам нужно, все с одним контуром на стороне демона.