Используются ли полные 64К для каждой созданной трубы? - PullRequest
4 голосов
/ 11 марта 2012

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

Редактировать: я понимаю, что такое буферизация, я спрашиваю, как конкретно буферизация реализована в каналах Linux, т. Е. Выделяется ли полная 64K независимо от метки highwater?

1 Ответ

3 голосов
/ 11 марта 2012

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

Использование также зависит от того, работают ли оба ваших процесса параллельно (например, на отдельных ядрах) илиесли они разделяют ядро ​​и только из-за управления процессами в ОС, они обманываются, полагая, что они параллельны.Если у вас есть реальный параллелизм (отдельное ядро ​​/ ЦП), ваш буфер обычно будет использоваться меньше.

В любом случае, если ваши приложения не выдают много данных и их скорости схожи, буфер будет не очень заполненбольшую часть времени.Однако я не удивлюсь, если на уровне операционной системы все 64 КБ будут выделены каким-либо образом.Но если вы используете встраиваемое устройство, 64 КБ это немного, поэтому даже если всегда указан максимальный размер, я бы об этом не беспокоился.

Кстати, изменить это нелегкоРазмер буфера канала, например, в в этом обсуждении предлагается ряд приемов, но на самом деле это обходные пути, которые изменяют способ использования данных из буфера, а не изменяют фактический размер буфера.Вы можете проверить ulimit -p, но я не уверен на 100%, что это даст вам необходимый контроль.

РЕДАКТИРОВАТЬ : Глядя на fs/pipe.c и include/linux/pipe_fs_i.h в коде Linux похоже, что буферы действительно меняют свой размер.Минимальный размер буфера - это полная страница, поэтому, если вам понадобится всего несколько байтов, будут потери.Я не уверен в этом, но некоторый код, который использует PIPE_DEF_BUFFERS, то есть 16, давая 64 КБ со страницами 4 КБ, заставляет меня задуматься, может ли буфер опуститься ниже 64 КБ (минимум 1 страницы может быть простодополнительное ограничение).

...