Синхронное и асинхронное программирование - PullRequest
0 голосов
/ 07 мая 2009

При проектировании сервера мы рассматриваем два подхода:

  1. Асинхронный (на основе выбора) подход, поэтому бэкэнд rpc может быть распараллелен в одном потоке.

  2. Синхронный подход, при котором каждый бэкэнд rpc обрабатывается в другом потоке из пула потоков.

Есть компромиссы: 1 имеет лучшую производительность и 2 имеет меньшую сложность кода. Действительно ли 1 имеет значение сейчас, когда машина работает на многоядерных процессорах и 64 битах?

Ответы [ 4 ]

2 голосов
/ 07 мая 2009

Я бы порекомендовал прочитать эти книги на ACE

чтобы получить представление о шаблонах, позволяющих создать эффективный сервер.

0 голосов
/ 08 мая 2009

Это релевантное прочтение (своего рода отчет меньшинства):

http://www.usenix.org/events/hotos03/tech/full_papers/vonbehren/vonbehren.pdf

Это тоже хороший ресурс:

http://www.kegel.com/c10k.html

Имейте в виду, что вы можете комбинировать два подхода, чтобы максимизировать полезность многоядерных архитектур. Предполагая, что ваш сервер («Krumpets here!»;) Является партиционируемым - это означает, что вы можете запустить несколько его экземпляров на одном компьютере - запишите сервер, используя select, а затем запустите один экземпляр сервера на ядро ​​процессора.

0 голосов
/ 07 мая 2009

Не зная более подробной информации о требованиях к вашему серверу, трудно сказать, какой подход может повысить производительность и / или уменьшить сложность кода.

Самое забавное, что производительность и простота обычно сочетаются в реальной конструкции сервера (но придумать упрощенную конструкцию сложно). Выбор / опрос сам по себе не дает вам лучшей производительности. И пул потоков определенно не уменьшает сложность вашего кода.

Чтобы ответить на ваш вопрос: 1 все еще имеет значение. Асинхронный дизайн плохо масштабируется на мультипроцессорной машине, но это верно только в том случае, если ваш сервер работает на одном процессе. Что если ваш сервер предназначен для запуска нескольких процессов на многопроцессорной машине? Разные процессы могут выполняться под разными учетными записями пользователей и иметь разные настройки безопасности. Как насчет виртуальных машин? Один поток на процесс не означает, что вы не можете использовать преимущества многоядерных машин.

Однако я действительно не могу вспомнить, когда в последний раз я видел реальный дизайн сервера, основанный на асинхронном выборе (). Может быть, в учебниках, когда я учился в колледже, но не в реальной производственной системе.

0 голосов
/ 07 мая 2009

Я думаю, что это должно быть наоборот, подход async select () делает код проще, потому что не задействована синхронизация потоков.

Все, что вам нужно сделать, это передать список дескрипторов сокетов в функцию select (). Он будет блокироваться и возвращаться только тогда, когда что-то произошло в одной или нескольких дескрипторах сокета. В отличие от использования пула потоков, где вам потребуется очередь рассылки заданий, откуда все потоки в пуле потоков получают задания.

Недостатком асинхронного подхода select () является то, что он не будет масштабироваться с количеством процессорных ядер, потому что все было выполнено в одном потоке.

...