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