|
Вопрос ламера по Linux IPC, Inter Process Comminications |
|
|
|
Jan 13 2006, 20:33
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892

|
Есть два процесса под Linux. Им надо обмениваться пакетами данных. Пакет представляет из себя: * заголовок - поле фиксированной длины * данные - поле переменой длины (<= MAX_LEN), заполненное бинарными случайными данными. Как лучше всего сделать такой обмен? Я удумал следующее. 1. Канал. Пишем, читаем. Но поскольку он имеет байтный интерфейс, при последовательном чтении непонятно, где начинается заголовок. Значит, придется вводить какие-то механизмы для его нахождения (Escape последовательности и пр.). Это не сложно, но совершенно лишнее действие в контексте решаемой задачи (нужно ее решить максимально быстро по программированию, расход памяти и процессорного времени не важен (в разумных пределах)). 2. Разделяемая память. Наделать там кучу семафоров, и обмениться указателями на структуры. 3. Гибрид  Делаем разделяемую память, а там - кольцевой массив структур. Каждая структура - это сообщение, данные пакета аппроксимированы массивом максимальной длины (пустые места в памяти не волнуют). 2 потока для каждого направления обмена. Передающий процесс пишет в поток send_msg char значение номера элемента в массиве, куда он положил пакет. Принимающий процесс пишет в поток msg_ask char значение номера элемента в массиве, который он прочитал (освободил). IMHO, так еще будет быстрее всего (нет лишнего копирования) и экономнее (по памяти) всего (нет памяти для лишних копий). Вероятно, я изобретаю велосипед. А что скажут Гуру по данному поводу?
|
|
|
|
|
 |
Ответов
|
Jan 14 2006, 14:53
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(psL @ Jan 14 2006, 15:56)  > 1. Pipe и FIFO суть одно и то-же и работают одинаково. Не одно и то же, хотя бы с точки зрения того, что я говорил выше. Выше вы говорили, что: Цитата Кстати - каналы FIFO обеспечивают атомарные запись/чтение. Т.е. пакеты(кадры) не перемешиваются Продолжаю утверждать, что с этой точки зрения отличий Pipe и FIFO НЕТ НИКАКИХ. Цитата > И оба исключительно НЕ пакетные - не сохраняют границ сообщений (вспоминаем о чем речь шла). pipe возможно, насчет FIFO не уверен. Поскольку с FIFO могут работать и несколько процессов. ????? Цитата Разговор вроде был о Linux, а не о фрях. Речь идет о многочисленных последователей вышеупомянутых. BSD Socket предоставляет продуманный унифицированый интерфейс. По этой причине присутствует повсеместно, в отличие от FIFO. Цитата я имел ввиду, что TCP - не гарантирует сохранения границ пакетов. И это утверждение тоже ложное. TCP/IP/UDP пакетные по определению. По условиям канала передачи могут биться на более мелкие, но доставляются пользователю исключительно монолитными. Цитата С точки зрения реализации - наверное да, но все-таки это разные механизмы IPC. Что значит разные? Тогда уточите, что Вы понимаете под "можно обмениваться через файлы, отображаемые в память" и реализации сего действия.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 14 2006, 16:01
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390

|
Цитата(zltigo @ Jan 14 2006, 17:53)  ????? Имелось ввиду что: Для канала дочерний процесс может получть дескриптор только от процесса родителя. Каналы не могут использоваться в качестве IPC между независимыми процессами. Очередь FIFO - отдельный тип файла в файловой системе, со всеми вытекающими. Не используются в BSD. Вообще, много чего разного, при похожести в первом приближении. Запись числа байтов, меньше емкости FIFO или канала гарантированно атомарна. Это означает, что в случае, когда несколько процессов одновременно записывают в канал, порции данных от этих процессов не перемешиваются. Если размер пакета больше емкости канала или FIFO - атомарность не гарантируется. Не верите - спросите у Робачевского и Ко.  Цитата Цитата я имел ввиду, что TCP - не гарантирует сохранения границ пакетов.
И это утверждение тоже ложное. TCP/IP/UDP пакетные по определению. По условиям канала передачи могут биться на более мелкие, но доставляются пользователю исключительно монолитными. В смысле прикладных пакетов, которые пользователь посылает. Подразумевалась вроде работа на прикоадном уровне? Прикладной уровень не всегда может забрать свой пакет полностью. Небольшим пакетам (по-моему до 8 КБ) это кстати не грозит - я же сказал пример неудачный. Цитата Цитата С точки зрения реализации - наверное да, но все-таки это разные механизмы IPC.
Что значит разные? Тогда уточите, что Вы понимаете под "можно обмениваться через файлы, отображаемые в память" и реализации сего действия. В nix вообще идеологически все построено на файлах. С этой точки зрения и каналы FIFO, и локальные сокеты, и совместно используемые "файлы, отображаемые в память" (ну не помню я как этот тип IPC правильно называется  ) суть одно и то же. Но есть тонкости, которые определяющие - Поэтому один механизм IPC называется так, а другой эдак. Кстати реализация BSD сокетов в каких либо облегченных версиях Linux тоже не совсем обязательно присутствует. Если я в чем-то и ошибаюсь - всему виной моя недостаточная осведомленность. Всех благ!
Сообщение отредактировал psL - Jan 15 2006, 09:45
|
|
|
|
Сообщений в этой теме
Evgeny_CD Вопрос ламера по Linux IPC Jan 13 2006, 20:33 zltigo Цитата(Evgeny_CD @ Jan 13 2006, 22:33) Ес... Jan 13 2006, 21:49 Evgeny_CD Цитата(zltigo @ Jan 14 2006, 00:49) Самое... Jan 13 2006, 22:47 zltigo Цитата(Evgeny_CD @ Jan 14 2006, 00:47) С ... Jan 13 2006, 23:33 Evgeny_CD Цитата(zltigo @ Jan 14 2006, 02:33) Значи... Jan 13 2006, 23:39 psL Если один процесс родительский, а второй его потом... Jan 14 2006, 11:43 zltigo Цитата(psL @ Jan 14 2006, 13:43) Если оди... Jan 14 2006, 13:03 psL > 1. Pipe и FIFO суть одно и то-же и работают о... Jan 14 2006, 13:56 alexr22b Цитатая имел ввиду, что TCP - не гарантирует сохра... Jan 15 2006, 06:23 Harbour Насчет выделения пакетов из какого угодно потока (... Jan 14 2006, 19:04 zltigo Цитата(Harbour @ Jan 14 2006, 21:04) Я та... Jan 14 2006, 20:54 zltigo Цитата(alexr22b @ Jan 15 2006, 08:23) И э... Jan 15 2006, 11:34 _artem_ Vikladivayu knizku na /upload/doc/Unix_Linux_books... Jan 15 2006, 16:37 Evgeny_CD Цитата(_artem_ @ Jan 15 2006, 19:37) Vikl... Jan 15 2006, 16:54 Konst_777 Цитата(_artem_ @ Jan 15 2006, 19:37) Vikl... Jan 18 2006, 03:14 Evgeny_CD Спасибо всем просветившим меня!
Из всего мног... Jan 15 2006, 17:55 nazim Я для этой цели использовал простой "самодель... Jan 15 2006, 19:18 Evgeny_CD Цитата(nazim @ Jan 15 2006, 22:18) ...Я д... Jan 15 2006, 20:01 zltigo Обалдеть. Jan 15 2006, 21:36 Evgeny_CD Цитата(zltigo @ Jan 16 2006, 00:36) Обалд... Jan 15 2006, 21:51  psL Вообще-то для обеспечения прозрачности передаваемы... Jan 15 2006, 22:08 zltigo Цитата(Evgeny_CD @ Jan 15 2006, 23:51) Ци... Jan 15 2006, 23:05 Evgeny_CD Цитата(zltigo @ Jan 16 2006, 02:05) ...В ... Jan 15 2006, 23:32 zltigo Цитата(Evgeny_CD @ Jan 16 2006, 01:32) Вс... Jan 15 2006, 23:55 Evgeny_CD Цитата(zltigo @ Jan 16 2006, 02:55) Ну и ... Jan 16 2006, 00:49 zltigo Цитата(Evgeny_CD @ Jan 16 2006, 02:49) Эт... Jan 16 2006, 01:16 Evgeny_CD Цитата(zltigo @ Jan 16 2006, 04:16) 1. Ну... Jan 16 2006, 01:31  zltigo Цитата(Evgeny_CD @ Jan 16 2006, 03:31) SO... Jan 16 2006, 11:08   Evgeny_CD Цитата(zltigo @ Jan 16 2006, 14:08) ...На... Jan 16 2006, 11:16 Harbour Цитата(zltigo @ Jan 14 2006, 22:54) Цитат... Jan 16 2006, 09:35 zltigo Цитата(Harbour @ Jan 16 2006, 11:35) 3. С... Jan 16 2006, 10:51 zltigo Цитата(Evgeny_CD @ Jan 16 2006, 13:16) Ви... Jan 16 2006, 11:31 Evgeny_CD Цитата(zltigo @ Jan 16 2006, 14:31) Излиш... Jan 17 2006, 15:56 Harbour Цитата(zltigo @ Jan 16 2006, 12:51) Цитат... Jan 16 2006, 17:55 zltigo Цитата(Harbour @ Jan 16 2006, 19:55) то ч... Jan 16 2006, 18:26 Harbour Пусть теоретики на своими прожектами думают - мне ... Jan 17 2006, 07:02 zltigo Цитата(Harbour @ Jan 17 2006, 09:02) Пуст... Jan 17 2006, 11:32 Harbour Даже такой отторможенный арм как 920 должон легко ... Jan 17 2006, 20:21 Evgeny_CD Цитата(Harbour @ Jan 17 2006, 23:21) ...Д... Jan 17 2006, 20:56 zaratustra > оцифровывать входной сигнал с относительно вы... Jan 26 2006, 12:57 Evgeny_CD Цитата(zaratustra @ Jan 26 2006, 15:57) .... Jan 26 2006, 13:44 zaratustra А вы не пробовали поискать девкиты работающие под ... Jan 26 2006, 14:02 Evgeny_CD Цитата(zaratustra @ Jan 26 2006, 17:02) А... Jan 26 2006, 14:27 zaratustra Вам виднее, кто кроме вас вашу задачу знает? Если ... Jan 27 2006, 08:34 Evgeny_CD Цитата(zaratustra @ Jan 27 2006, 11:34) .... Jan 27 2006, 09:32 zaratustra Линукс насколько я вижу мигрирует к десктопу быстр... Jan 27 2006, 10:17 Evgeny_CD Цитата(zaratustra @ Jan 27 2006, 13:17) Л... Jan 27 2006, 11:42 zaratustra Самое лучшее что могу вам посоветовать - побыстрее... Jan 27 2006, 13:00 Evgeny_CD Цитата(zaratustra @ Jan 27 2006, 16:00) .... Jan 27 2006, 13:02 defunct Я прощу прощения если не в тему, но
Evgeny_CD а н... Jan 31 2006, 01:31 Evgeny_CD Цитата(defunct @ Jan 31 2006, 04:31) Я пр... Jan 31 2006, 02:01  defunct Цитата(Evgeny_CD @ Jan 31 2006, 04:01) 1.... Jan 31 2006, 02:47   Evgeny_CD Цитата(defunct @ Jan 31 2006, 05:47) Опыт... Jan 31 2006, 08:00    defunct Цитата(Evgeny_CD @ Jan 31 2006, 10:00) Пр... Jan 31 2006, 23:45     Evgeny_CD Цитата(defunct @ Feb 1 2006, 02:45) ...По... Feb 1 2006, 06:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|