Я недавно читал о именованных каналах, и я не мог понять, почему они существуют.
Я где-то читал, что использование именованного канала занимает меньше времени, чем использование файла.
Почему это так?
Именованные каналы также должны храниться в памяти (и, возможно, заменяться, как файлы).
Насколько я вижу, они должны получить индекс, на который должна ссылаться текущая директория, как и файлы. Кроме того, они должны быть удалены программистом, как файлы.
Так в чем же преимущество?
Ответы:
Почти все в Linux можно считать файлом , но основное различие между обычным файлом и именованным каналом заключается в том, что именованный канал - это особый экземпляр файла, который не имеет содержимого в файловой системе.
Вот цитата из
man fifo
:Так что на самом деле именованный канал ничего не делает, пока какой-то процесс не читает и не пишет в него. Он не занимает места на жестком диске (кроме небольшого количества мета-информации), он не использует процессор.
Вы можете проверить это, выполнив это:
Создать именованный канал
Перейдите, например
/home/user/Documents
, к какому-либо каталогу и распакуйте все внутри него, используя именованный канал.Здесь вы должны увидеть PID процесса gzip. В нашем примере это было 28584.
Теперь проверьте, что делает этот PID
Вы увидите, что он не использует ресурсы . 0% использования процессора, 0% использования памяти.
Проверьте догадку относительно использования файлового пространства
И опять
0
ничего. Тестовая труба может быть использована снова, если это необходимо.Не забудьте убить gzip, используя
kill -15 28584
. И удалите нашу именованную трубу, используяrm /tmp/testpipe
Примеры использования
Вы можете перенаправить почти все, используя именованный канал. В качестве примера вы можете увидеть этот прокси в одну строку .
Также вот еще одно приятное объяснение использования именованного канала. Вы можете настроить два процесса на одном сервере для связи с использованием именованного канала вместо стека TCP / IP. Это намного быстрее, и не загружает сетевые ресурсы. Например, ваш веб-сервер может взаимодействовать с базой данных напрямую, используя именованный канал, вместо использования
localhost
адреса или прослушивания какого-либо порта.источник
Это правда, что вы не будете использовать системную память, но тот факт, что вы не используете процессор в своем примере, объясняется только тем, что вы не читаете канал, поэтому процесс ожидает.
Рассмотрим следующий пример:
Теперь откройте новую консоль и запустите:
И в третьей консоли:
Если вы посмотрите на часы cmd (2-й член), это покажет увеличение потребления процессора!
источник
Вот пример использования, где именованные каналы могут сэкономить вам много времени, удалив ввод-вывод.
Предположим, у вас есть BigFile, например 10G.
У вас также есть разделение этого BigFile на части 1G, от BigFileSplit_01 до BigFile_Split_10.
Теперь у вас есть сомнения в правильности BigFileSplit_05
Наивно, без именованных каналов вы создадите новый сплит из BigFile и сравните:
С именованными каналами вы бы сделали
Это может показаться на первый взгляд не большой разницей ... но со временем разница огромна!
Опция 1:
Вариант 2:
Таким образом, в основном именованный канал сохраняет здесь чтение и запись 1G плюс некоторую очистку файловой системы (поскольку мы ничего не записывали в файловую систему, кроме пустого узла fifo).
Отсутствие ввода / вывода, особенно записи, также хорошо, чтобы избежать износа ваших дисков. Это еще более интересно, когда вы работаете с твердотельными накопителями, поскольку они имеют ограниченное количество записей до того, как ячейки умрут.
(1) Очевидно, что другим вариантом будет создание этого временного файла в ОЗУ, например, если / tmp смонтирован в ОЗУ (tmpfs). Тем не менее, вы будете ограничены размером RAM-диска, в то время как «трюк с именованным каналом» не имеет ограничений.
источник
Вы можете оставить программу неподвижной и прослушать именованный канал для какого-либо внешнего события. Как только происходит внешнее событие (например, поступление некоторых новых данных), это может быть обнаружено другой программой, которая, в свою очередь, открывает канал для записи, записывая соответствующие данные события в канал. Когда выдается оператор close, прослушивающая программа получает поток данных через канал через оператор read и готова обработать то, что получила. Не забудьте закрыть трубу после прочтения контента. Программа прослушивания также может возвращать результаты своей обработки через тот же или другой именованный канал. Такие межпрограммные коммуникации очень удобны.
источник