> К тому же, и в исходники sockets любопытно было бы взглянуть
Тебя ждет сюрприз :-)
Я только что туда заглядывал.
Насчет шареной памяти:
Обычно под шареной памятью подразумевается память, доступная из юзерспейса
более чем одного процесса.
Из кернела вся память и так шареная.
Когда ты пересылаешь данные сокетом, то ты используешь обычный write.
То есть ты должен сначала скопировать данные в кернелспейс, а потом оттуда
уже в юзерспейс другого процесса.
carrot wrote:
> afaik, sockets на локальной машине - это обмен
> через shared memory (читай System V IPC)
нет, это вы загнули, пожалуй.
но sockets (особенно AF_UNIX) действительно работают
быстро.
AF_UNIX даже быстрее чем pipe, и даже - при некоторых
условиях - быстрее, чем memcpy(size_gt_L2_cache)._
> ага потому что вообще ничего не копируется помоему. просто
> перекидываются буфера из write очереди в read очередь в случае
> unix
не совсем...
данные копируются из адресного пространства посылающего процесса
в skb, но этот skb добавляется _сразу_ в sk_receive_queue целевого
socket. потом оттуда ни будут скопированы получателю.
итого - два копирования, как и в случае с pipe.
> Один хрен, юзер->кернел->юзер копируется.
>
> В случае шареной памяти на одно копирование меньше.
вот и сразу видно что физик, не математик.
поскольку с shared memory вообще копировать не надо,
то насколько меньше? :))