Mengapa menggunakan pipa bernama alih-alih file?

42

Saya baru-baru ini membaca tentang pipa bernama, dan saya tidak bisa mengerti mengapa mereka ada.
Saya pernah membaca di suatu tempat bahwa menggunakan pipa bernama kurang memakan waktu daripada menggunakan file.

Kenapa begitu?
Pipa bernama juga harus disimpan dalam memori (dan mungkin ditukar, seperti file).
Sejauh yang saya bisa lihat, mereka harus mendapatkan inode yang harus dirujuk oleh direktori saat ini, seperti file. Juga, mereka harus dihapus oleh programmer, sama seperti file.

Jadi, di mana letak keuntungannya?

pengguna3122885
sumber
Ini bukan bagian dari tugas kelas, bukan?
don.joey
6
tidak ... sebenarnya saya sedang melihat beberapa catatan kuliah ketika saya menemukan pertanyaan ini dan saya tidak bisa menjawabnya ... dan jika itu adalah tugas, saya tidak melihat bagaimana itu relevan ... tidak seperti Saya tidak akan mencari jawabannya sampai saya menemukannya
user3122885

Jawaban:

41

Hampir semua yang ada di Linux dapat dianggap sebagai file , tetapi perbedaan utama antara file biasa dan pipa bernama adalah bahwa pipa bernama adalah contoh khusus dari file yang tidak memiliki konten pada sistem file.

Berikut ini kutipan dari man fifo:

File khusus FIFO (pipa bernama) mirip dengan pipa, kecuali itu diakses sebagai bagian dari sistem file. Ini dapat dibuka dengan berbagai proses untuk membaca atau menulis. Ketika proses bertukar data melalui FIFO, kernel meneruskan semua data secara internal tanpa menulisnya ke sistem file. Dengan demikian, file khusus FIFO tidak memiliki konten pada sistem file; entri sistem file hanya berfungsi sebagai titik referensi sehingga proses dapat mengakses pipa menggunakan nama dalam sistem file.

Kernel mempertahankan tepat satu objek pipa untuk setiap file khusus FIFO yang dibuka oleh setidaknya satu proses. FIFO harus dibuka pada kedua ujungnya (membaca dan menulis) sebelum data dapat dikirimkan. Biasanya, membuka blok FIFO sampai ujung yang lain dibuka juga.

Jadi sebenarnya pipa bernama tidak melakukan apa-apa sampai beberapa proses membaca dan menulis padanya. Tidak membutuhkan ruang pada hard disk (kecuali sedikit informasi meta), tidak menggunakan CPU.

Anda dapat memeriksanya dengan melakukan ini:

Buat pipa bernama

$ mkfifo /tmp/testpipe

Buka beberapa direktori, misalnya /home/user/Documents, dan gzip semua yang ada di dalamnya, menggunakan pipa bernama.

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

Di sini Anda akan melihat PID dari proses gzip. Dalam contoh kita adalah 28584.

Sekarang periksa apa yang dilakukan PID ini

$ 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

Anda akan melihat bahwa itu tidak menggunakan sumber daya . 0% penggunaan CPU, 0% penggunaan memori.

Verifikasi dugaan terkait penggunaan ruang file

$ du -h /tmp/testpipe
0   testpipe

Dan lagi 0, tidak ada. Testpipe dapat digunakan lagi jika diperlukan.

Jangan lupa untuk membunuh gzip, gunakan kill -15 28584. Dan menghapus pipa bernama kami menggunakanrm /tmp/testpipe

Contoh Penggunaan

Anda dapat mengarahkan ulang hampir semua menggunakan pipa bernama. Sebagai contoh, Anda dapat melihat proxy satu baris ini .

Juga di sini adalah satu lagi penjelasan bagus tentang penggunaan pipa bernama. Anda dapat mengkonfigurasi dua proses pada satu server untuk berkomunikasi menggunakan pipa bernama bukannya TCP / IP stack. Ini jauh lebih cepat, dan tidak memuat sumber daya jaringan. Misalnya Server Web Anda dapat berkomunikasi dengan database secara langsung menggunakan pipa bernama, daripada menggunakan localhostalamat atau mendengarkan beberapa port.

c0rp
sumber
14

Memang benar bahwa Anda tidak akan menggunakan memori sistem tetapi fakta bahwa Anda tidak menggunakan cpu dalam contoh Anda hanya karena Anda tidak membaca pipa sehingga prosesnya sedang menunggu.

Pertimbangkan contoh berikut:

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

Sekarang buka konsol baru dan jalankan:

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

Dan di konsol ketiga:

cat /tmp/testpipe > /dev/null

Jika Anda melihat arloji cmd (istilah kedua) ini akan menunjukkan peningkatan konsumsi cpu!

GARCIN David
sumber
1
Jawaban ini adalah tentang jawaban
c0rp
2

Berikut adalah kasus penggunaan di mana pipa bernama dapat menghemat banyak waktu dengan menghapus I / O.

Misalkan Anda memiliki BigFile, misalnya 10G.

Anda juga memiliki pemisahan BigFile ini dalam potongan 1G, BigFileSplit_01 hingga BigFile_Split_10.

Sekarang Anda memiliki keraguan tentang kebenaran BigFileSplit_05

Secara naif, tanpa pipa bernama, Anda akan membuat pemisahan baru dari BigFile dan membandingkan:

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

Dengan pipa bernama Anda akan melakukannya

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

Pada pandangan pertama itu mungkin tidak tampak perbedaan besar ... tetapi pada waktunya perbedaannya sangat besar!

Pilihan 1:

  • dd: baca 1G / tulis 1G (1)
  • diff: baca 2G
  • rm: cluster yang dialokasikan gratis / menghapus entri direktori

Pilihan 2:

  • dd: tidak ada! (pergi ke pipa bernama)
  • diff: baca 2G
  • rm: tidak ada cluster yang dialokasikan untuk dikelola (kami tidak benar-benar menulis apa pun ke sistem file) / menghapus entri direktori

Jadi pada dasarnya pipa bernama menyelamatkan Anda di sini membaca dan menulis 1G ditambah beberapa pembersihan filesystem (karena kami menulis apa-apa ke filesystem tetapi node fifo kosong).

Tidak melakukan I / O, terutama menulis, juga baik untuk menghindari keausan disk Anda. Ini bahkan lebih menarik ketika Anda bekerja dengan SSD karena mereka memiliki jumlah penulisan yang terbatas sebelum sel-sel mati.

(1) Jelas, opsi lain adalah membuat file sementara ke RAM, misalnya jika / tmp dipasang ke RAM (tmpfs). Namun demikian Anda akan dibatasi oleh ukuran disk RAM, sedangkan "trik pipa bernama" tidak memiliki batas.

Zakhar
sumber
1

Anda dapat membiarkan program tetap diam dan mendengarkan pipa bernama untuk beberapa acara luar. Segera setelah peristiwa luar terjadi (mis. Kedatangan beberapa data baru) ini dapat dideteksi oleh beberapa program lain yang pada gilirannya membuka pipa untuk menulis, menulis data acara yang relevan ke pipa. Ketika pernyataan penutupan dikeluarkan, program mendengarkan akan menerima aliran data melalui pipa melalui pernyataan baca, dan siap untuk memproses apa yang telah didapat. Jangan lupa untuk menutup pipa setelah membaca konten. Program mendengarkan juga dapat mengembalikan hasil pemrosesan melalui hal yang sama, atau melalui pipa bernama lain. Komunikasi antar-program semacam itu sangat nyaman di saat-saat tertentu.

Per Anton Ronning
sumber