Есть ли способ использовать преимущества многоядерности при работе с сетевыми подключениями? - PullRequest
3 голосов
/ 13 июня 2011

Когда мы занимаемся сетевым программированием, независимо от того, используете ли вы многопроцессорность, многопотоковость или выбор / опрос (epoll), существует только один процесс / поток, который обрабатывает прием соединения через тот же порт. И если вы хотите использовать преимущества многоядерных процессоров, вам нужно создавать рабочие процессы / потоки. Но как насчет границы имеет дело с сетевыми подключениями? Есть ли способ использовать преимущества многоядерности при работе с сетевыми подключениями?

Я нашел некоторые материалы. И, кажется, это трудно завершить. Трехстороннее рукопожатие будет подразумеваться ядром. А в структуре smp операционная система будет разделена на несколько критических зон. Одна и та же критическая зона не может быть запущена более чем на одном ядре одновременно.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Все современные операционные системы, работающие на аппаратном обеспечении ПК, уже имеют свои сетевые стеки, сильно оптимизированные для многоядерных процессоров.Например, код обработки пакетов, который передает данные в сетевую карту и из нее, будет независимым от кода стека TCP / IP, поэтому аппаратное прерывание может выполняться до конца, не нарушая код TCP.

Для большинствахотя в реальных приложениях основная часть работы выполняется между пакетами.Входящие данные должны быть обработаны, а выходящие данные должны быть сгенерированы.Это зависит от кода приложения, и этот код может использовать преимущества нескольких ядер, используя несколько потоков или несколько процессов.То, как вы это делаете лучше всего, зависит от приложения и операционной системы.Например, Windows имеет порты завершения ввода / вывода , которые сочетают обнаружение заданий с многопоточной отправкой заданий.Linux имеет epoll .

0 голосов
/ 12 июля 2011

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

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

...