Сериализованный сетевой ввод / вывод - PullRequest
0 голосов
/ 24 января 2010

Почему сетевой ввод / вывод сериализуется, а не распараллеливается?

Ответы [ 5 ]

1 голос
/ 24 января 2010

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

Вы всегда можете использовать отдельные сокеты для дополнительного параллелизма? Или я неправильно понял ваш смысл?

Некоторые сетевые протоколы предлагают «широковещательную рассылку», но это не всегда доступно (например, многие сетевые устройства, такие как преднамеренно, будут настроены для блокировки широковещательной рассылки UDP)

0 голосов
/ 19 апреля 2011

Во-первых, моя нынешняя машина AMD работает под управлением Ubuntu Linux с 6CPU-ядром, и "ps -ef" дал:

ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Apr18 ?        00:00:01 /sbin/init
root         2     0  0 Apr18 ?        00:00:00 [kthreadd]
root         3     2  0 Apr18 ?        00:00:00 [migration/0]
root         4     2  0 Apr18 ?        00:00:00 [ksoftirqd/0]
root         5     2  0 Apr18 ?        00:00:00 [watchdog/0]
root         6     2  0 Apr18 ?        00:00:00 [migration/1]
root         7     2  0 Apr18 ?        00:00:00 [ksoftirqd/1]
root         8     2  0 Apr18 ?        00:00:00 [watchdog/1]
root         9     2  0 Apr18 ?        00:00:00 [migration/2]
root        10     2  0 Apr18 ?        00:00:00 [ksoftirqd/2]
root        11     2  0 Apr18 ?        00:00:00 [watchdog/2]
root        12     2  0 Apr18 ?        00:00:00 [migration/3]
root        13     2  0 Apr18 ?        00:00:00 [ksoftirqd/3]
root        14     2  0 Apr18 ?        00:00:00 [watchdog/3]
root        15     2  0 Apr18 ?        00:00:00 [migration/4]
root        16     2  0 Apr18 ?        00:00:00 [ksoftirqd/4]
root        17     2  0 Apr18 ?        00:00:00 [watchdog/4]
root        18     2  0 Apr18 ?        00:00:00 [migration/5]
root        19     2  0 Apr18 ?        00:00:00 [ksoftirqd/5]
root        20     2  0 Apr18 ?        00:00:00 [watchdog/5]
root        21     2  0 Apr18 ?        00:00:00 [events/0]
root        22     2  0 Apr18 ?        00:00:00 [events/1]
root        23     2  0 Apr18 ?        00:00:00 [events/2]
root        24     2  0 Apr18 ?        00:00:00 [events/3]
root        25     2  0 Apr18 ?        00:00:00 [events/4]
root        26     2  0 Apr18 ?        00:00:00 [events/5]
root        27     2  0 Apr18 ?        00:00:00 [cpuset]
root        28     2  0 Apr18 ?        00:00:00 [khelper]
root        29     2  0 Apr18 ?        00:00:00 [async/mgr]
root        30     2  0 Apr18 ?        00:00:00 [sync_supers]
root        31     2  0 Apr18 ?        00:00:00 [bdi-default]
root        32     2  0 Apr18 ?        00:00:00 [kintegrityd/0]
root        33     2  0 Apr18 ?        00:00:00 [kintegrityd/1]
root        34     2  0 Apr18 ?        00:00:00 [kintegrityd/2]
root        35     2  0 Apr18 ?        00:00:00 [kintegrityd/3]
root        36     2  0 Apr18 ?        00:00:00 [kintegrityd/4]
root        37     2  0 Apr18 ?        00:00:00 [kintegrityd/5]
root        38     2  0 Apr18 ?        00:00:00 [kblockd/0]
root        39     2  0 Apr18 ?        00:00:00 [kblockd/1]
root        40     2  0 Apr18 ?        00:00:00 [kblockd/2]
root        41     2  0 Apr18 ?        00:00:00 [kblockd/3]
root        42     2  0 Apr18 ?        00:00:00 [kblockd/4]
root        43     2  0 Apr18 ?        00:00:00 [kblockd/5]
root        44     2  0 Apr18 ?        00:00:00 [kacpid]
root        45     2  0 Apr18 ?        00:00:00 [kacpi_notify]
root        46     2  0 Apr18 ?        00:00:00 [kacpi_hotplug]
root        47     2  0 Apr18 ?        00:00:00 [ata/0]
root        48     2  0 Apr18 ?        00:00:00 [ata/1]
root        49     2  0 Apr18 ?        00:00:00 [ata/2]
root        50     2  0 Apr18 ?        00:00:00 [ata/3]
root        51     2  0 Apr18 ?        00:00:00 [ata/4]
root        52     2  0 Apr18 ?        00:00:00 [ata/5]

Из вышесказанного видно, что многие процессы ядра выполняются для каждого ядра процессора, включая ksoftirqd. Посмотрите документацию ядра Linux, сетевые драйверы используют ksoftirqd для реализации отправки данных. Так что это распараллеливание на уровне ядра процессора.

У сетевой карты есть несколько «каналов» - особенно для высокоскоростных сетевых карт. И все это может одновременно обрабатывать прием и передачу данных - снова распараллеливание на уровне сетевой карты. Например:

http://www.colfaxdirect.com/store/pc/viewPrd.asp?idproduct=230&idcategory=0

(ищите «многоканальный»).

Но когда он достигает провода Ethernet, так как все они используют один и тот же провод ..... необходима сериализация на уровне проводов. Но тогда пропускная способность провода обычно НАМНОГО выше, чем скорость обработки ЦП или сетевой карты.

0 голосов
/ 24 января 2010

Думайте об этом как о потоке данных. Данные могут быть разделены на части и отправлены / получены неупорядоченным способом. Чтобы восстановить исходный поток, куски должны быть переупорядочены.

0 голосов
/ 24 января 2010

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

параллельный кабель Centronics - 36 контактов.

RS232 кабель 25 контактов, затем 9 контактов

витая пара Ethernet - две пары (4 контакта)

USB-кабель - одна пара + питание.

Кроме того, не просто передать несколько каналов в параллельном режиме по беспроводной или междугородной линии.

0 голосов
/ 24 января 2010

яблок и апельсинов.

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

Распараллеливание - это когда вы делите задачу на несколько подзадач, которые можно запустить одновременно, а затем объединяете их результаты, чтобы получить то же самое, что и если задача была запущена одним процессом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...