трубы posix легкие? - PullRequest
       15

трубы posix легкие?

12 голосов
/ 28 марта 2010

В приложении Linux я использую каналы для передачи информации между потоками.

Идея использования каналов заключается в том, что я могу ждать нескольких каналов одновременно, используя poll (2). Это хорошо работает на практике, и мои темы спят большую часть времени. Они просыпаются только если есть чем заняться.

В пользовательском пространстве каналы выглядят как два дескриптора файла. Теперь мне интересно, сколько ресурсов такие каналы используют на стороне ОС.

Кстати: в моем приложении я время от времени отправляю только отдельные байты. Подумайте о моих каналах как о простых очередях сообщений, которые позволяют мне пробуждать принимающие потоки, заставлять их отправлять данные о состоянии или завершать работу.

Ответы [ 4 ]

8 голосов
/ 28 марта 2010

Нет, я бы не стал считать трубы "легковесными", но это не обязательно означает, что они также являются неправильным ответом для вашего приложения.

Для отправки байта по каналу потребуется минимум 3 системных вызова (запись, опрос, чтение). Использование очереди в памяти и операций pthread (mutex_lock, cond_signal) требует гораздо меньше накладных расходов. Дескрипторы открытых файлов определенно потребляют ресурсы ядра; вот почему процессы обычно ограничены 256 открытыми файлами по умолчанию (не то, чтобы ограничение не могло быть расширено там, где это необходимо).

Тем не менее, решение pipe / poll для межпотоковой связи тоже имеет свои преимущества: особенно если вам нужно ждать ввода от комбинации источников (сеть + другие потоки).

5 голосов
/ 21 марта 2011

Поскольку вы используете Linux, вы можете исследовать и сравнивать производительность pipe с eventfd. Они технически быстрее и легче, но вам действительно повезет увидеть преимущества на практике.

http://www.kernel.org/doc/man-pages/online/pages/man2/eventfd.2.html

1 голос
/ 29 марта 2010

Измерьте, и вы узнаете. Полные процессы с трубами достаточно легки для большого количества применений. Для других приложений требуется что-то более легкое, например потоки ОС (pthreads является популярным выбором для многих приложений Unix), или сверхлегкое, например, пакет потоков пользовательского уровня, который никогда не переходит в режим ядра, за исключением обработки ввода-вывода. Хотя единственный способ узнать наверняка - это измерить, каналы, вероятно, достаточно хороши для нескольких десятков потоков, в то время как вы, вероятно, захотите потоки пользовательского уровня, когда получите несколько десятков тысяч потоков. Точно, где границы должны быть нарисованы с использованием сегодняшних кодов, я не знаю. Если бы я хотел знать, я бы измерил: -)

0 голосов
/ 30 июня 2011

Вы также можете использовать socketpair , который является более переносимым, чем eventfd, потому что это POSIX.

...