Навіщо використовувати іменовану трубу замість файлу?


42

Нещодавно я читав про названі труби, і не міг зрозуміти, чому вони існують.
Я десь читав, що використання названої труби займає менше часу, ніж використання файлу.

Чому це так?
Названі труби також повинні зберігатися в пам'яті (і, можливо, помінятися ними, як і файли).
Наскільки я бачу, вони повинні отримати вкладку, на яку повинен посилатися поточний каталог, як і файли. Також їх повинен видалити програміст, як і файли.

Тож де криється перевага?


Це не є частиною завдання в класі, чи не так?
don.joey

6
ні ... насправді я переглядав конспекти лекцій, коли знайшов це запитання і не зміг відповісти на нього ... а якщо це було завдання, я не бачу, як це було б актуально ... це не так Я б не шукав відповіді, поки не знайду її
user3122885

Відповіді:


41

Практично все в Linux можна вважати файлом , але головна відмінність звичайного файлу від іменованого каналу полягає в тому, що названа труба - це особливий екземпляр файлу, який не містить вмісту у файловій системі.

Ось цитата з man fifo:

Спеціальний файл FIFO (названа труба) схожий на трубу, за винятком того, що до нього доступ є частиною файлової системи. Він може бути відкритий декількома процесами для читання чи письма. Коли процеси обмінюються даними через FIFO, ядро ​​передає всі дані внутрішньо, не записуючи їх у файлову систему. Таким чином, спеціальний файл FIFO не містить вмісту у файловій системі; запис файлової системи служить лише опорною точкою, щоб процеси могли отримати доступ до труби, використовуючи ім'я у файловій системі.

Ядро підтримує рівно один об'єкт труб для кожного спеціального файлу FIFO, який відкривається щонайменше одним процесом. FIFO має бути відкрито з обох кінців (читання та запис), перш ніж передавати дані. Як правило, також відкриваються блоки FIFO, поки не відкриється інший кінець.

Тож фактично названа труба нічого не робить, поки якийсь процес не прочитає і не запише її. Він не займає місця на жорсткому диску (за винятком трохи метаінформації), він не використовує процесор.

Ви можете перевірити це, зробивши це:

Створіть названу трубу

$ mkfifo /tmp/testpipe

Наприклад /home/user/Documents, перейдіть до якогось каталогу і gzip все, що знаходиться всередині нього, використовуючи названий pipe.

$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584

Тут ви повинні побачити PID процесу gzip. У нашому прикладі це було 28584.

Тепер перевірте, що робить цей PID

$ ps u -P 28584
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
c0rp     28584  0.0  0.0  29276  7800 pts/8    S    00:08   0:00 bash

Ви побачите, що він не використовує ніяких ресурсів . 0% використання процесора, 0% використання пам'яті.

Перевірте переконання щодо використання файлового простору

$ du -h /tmp/testpipe
0   testpipe

І знову 0нічого. При необхідності тест-трубу можна буде використовувати знову.

Не забудьте вбити gzip, використовуючи kill -15 28584. І видаліть нашу названу трубу за допомогоюrm /tmp/testpipe

Приклади використання

Ви можете перенаправити майже все, використовуючи названий патрубок. Як приклад ви можете бачити цей однорядковий проксі .

Також тут є ще одне приємне пояснення використання названих труб. Ви можете налаштувати два процеси на одному сервері для спілкування за допомогою іменованого каналу замість стеку TCP / IP. Це набагато швидше і не завантажує мережеві ресурси. Наприклад, ваш веб-сервер може спілкуватися з базою даних безпосередньо за допомогою названого каналу, а не використовувати localhostадресу чи прослуховувати якийсь порт.


14

Це правда, що ви не будете використовувати системну пам'ять, але факт, що ви не використовуєте процесор у своєму прикладі, лише тому, що ви не читаєте трубу, тому процес чекає.

Розглянемо наступний приклад:

mkfifo /tmp/testpipe
tar cvf - / | gzip > /tmp/testpipe

Тепер відкрийте нову консоль і запустіть:

watch -n 1 'ps u -P $(pidof tar)

І в третій консолі:

cat /tmp/testpipe > /dev/null

Якщо ви подивитеся на cmd годинника (другий термін), це покаже збільшення споживання процесора!


1
Ця відповідь стосується відповіді
c0rp

2

Ось випадок використання, коли названі труби можуть заощадити вам багато часу, видаляючи введення-виведення.

Припустимо, у вас є BigFile, наприклад 10G.

У вас також є розділи цього BigFile на шматки 1G, BigFileSplit_01 на BigFile_Split_10.

Тепер у вас є сумніви у правильності BigFileSplit_05

Наївно, без названих труб ви створили б новий розкол від BigFile та порівняли:

dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

З названими трубами ви б зробили

mkfifo BigFileSplitOrig_05
dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1 &
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

Це може не здатися на перший погляд великою різницею ... але в часі різниця величезна!

Варіант 1:

  • dd: прочитати 1G / написати 1G (1)
  • розл .: прочитати 2G
  • rm: безкоштовні виділені кластери / видалення запису каталогу

Варіант 2:

  • дд: нічого! (переходить до названої труби)
  • розл .: прочитати 2G
  • rm: не призначений кластер для управління (ми насправді нічого не писали у файлову систему) / видалити запис каталогу

Таким чином, названа труба економить вас на читанні та записі 1G плюс деякі очищення файлової системи (оскільки ми нічого не писали у файлову систему, окрім порожнього фіфо-вузла).

Не робити вводу-виводу, особливо пише, також добре уникати зносу ваших дисків. Це ще цікавіше, коли ви працюєте з SSD, оскільки вони мають обмежену кількість записів, перш ніж клітини відмирають.

(1) Очевидно, ще одним варіантом було б створення цього тимчасового файлу в оперативній пам'яті, наприклад, якщо / tmp встановлено в оперативній пам'яті (tmpfs). Тим не менш, ви будете обмежені розміром диска оперативної пам'яті, тоді як "названий трубовий фокус" не має обмежень.


1

Ви можете дозволити програмі лежати нерухомо і прослухати названу трубу для якоїсь зовнішньої події. Як тільки відбувається зовнішня подія (f.ex. надходження деяких нових даних), це може бути виявлено якоюсь іншою програмою, яка в свою чергу відкриває трубку для запису, записуючи відповідні дані події в трубу. Коли випущено заяву про закриття, програма прослуховування отримає потік даних по каналу через оператор зчитування, і готова обробити отримане. Не забувайте після закриття вмісту закривати трубу. Програма прослуховування також може повертати результати своєї обробки через ту саму або через іншу назву. Такі міжпрограмні комунікації часом дуже зручні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.