Выполняются ли операции с сокетом параллельно на системном уровне? - PullRequest
1 голос
/ 24 ноября 2011

Если у меня есть четырехъядерный компьютер и 4 открытых и активных сокета, быстрее ли будет иметь 4 потока для параллельного чтения из этих сокетов или только один поток, который итеративно читает сокеты? Может ли операция чтения сокета выполняться параллельно или она синхронизируется где-то на системном уровне?

Аналогично, если у меня есть 4 сокета, в которые мне нужно записать некоторые данные, быстрее ли будет иметь 4 потока, которые записывают в эти сокеты одновременно, или лучше иметь один поток, который выполняет всю запись?

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

В частности, если у меня есть машина, на которой запущено n потоков, которые генерируют запросы, которые необходимо отправить на другую машину, лучше ли открыть n сокетов и позволить каждому потоку писать в нее? Или лучше синхронизировать все потоки и отправить все данные через один сокет? А на принимающей стороне лучше иметь один сокет для чтения? Или лучше, чтобы n сокетов читалось параллельно? Что делать, если все читатели должны быть синхронизированы после чтения в любом случае?

1 Ответ

1 голос
/ 24 ноября 2011

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

...