Neden dosya yerine adlandırılmış yöneltme kullanıyorsunuz?


42

Geçenlerde adlandırılmış boruları okudum ve neden var olduklarını anlayamadım.
Bir yerde, adlandırılmış bir boruyu kullanmanın bir dosyayı kullanmaktan daha az zaman alıcı olduğunu okudum.

Bu neden böyle?
Adlandırılmış boruların da bellekte depolanması gerekir (ve aynı dosyalar gibi değiştirilebilir).
Görebildiğim kadarıyla, tıpkı dosyalar gibi, geçerli dizin tarafından referans alınması gereken bir inode almaları gerekir. Ayrıca, tıpkı dosyalar gibi programlayıcı tarafından kaldırılmalıdır.

Peki avantaj nerede?


Bu bir sınıf ödevinin parçası değil, değil mi?
don.joey

6
hayır ... aslında bu soruyu bulduğumda ders notlarına baktım ve cevap veremedim ... ve eğer bir ödev olsaydı, bunun nasıl alakalı olacağını göremedim ... öyle değil
Bulana

Yanıtlar:


41

Linux'taki hemen hemen her şey bir dosya olarak kabul edilebilir , ancak normal bir dosya ile adlandırılmış bir boru arasındaki temel fark , adlandırılmış bir borunun, dosya sistemi üzerinde hiçbir içeriğe sahip olmayan bir dosyanın özel bir örneği olmasıdır.

İşte alıntı man fifo:

Bir FIFO özel dosyası (adlandırılmış bir boru), dosya sisteminin bir parçası olarak erişilmesi dışında, bir boruya benzer. Okuma veya yazma için birden fazla işlem tarafından açılabilir. İşlemler FIFO aracılığıyla veri alışverişinde bulunduğunda, çekirdek tüm verileri dosya sistemine yazmadan dahili olarak geçirir. Bu nedenle, FIFO özel dosyasının dosya sistemi üzerinde hiçbir içeriği yoktur; dosya sistemi girişi yalnızca referans noktası olarak işlev görür, böylece işlemler dosya sistemindeki bir adı kullanarak boruya erişebilir.

Çekirdek, en az bir işlem tarafından açılan her bir FIFO özel dosyası için tam olarak bir boru nesnesi tutar. Veri aktarılmadan önce FIFO her iki ucundan da açılmalıdır (okuma ve yazma). Normalde, FIFO bloklarının diğer ucu açılıncaya kadar açılması.

Yani aslında adlandırılmış bir boru, bazı işlemler okuyana ve yazana kadar hiçbir şey yapmaz. Sabit diskte yer kaplamaz (biraz meta bilgisi hariç), CPU kullanmaz.

Bunu yaparak kontrol edebilirsiniz:

Adlandırılmış bir boru oluştur

$ mkfifo /tmp/testpipe

Örneğin /home/user/Documents, bir dizine gidin ve içindeki her şeyi gzip ile adlandırılmış yöneltin.

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

Burada gzip işleminin PID'sini görmelisiniz. Örneğimizde bu 28584 oldu.

Şimdi bu PID'nin ne yaptığını kontrol et

$ 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

Hiçbir kaynak kullanmadığını göreceksiniz . % 0 CPU kullanımı,% 0 hafıza kullanımı.

Dosya alanı kullanımıyla ilgili bir ipucu olduğunu doğrulayın

$ du -h /tmp/testpipe
0   testpipe

Ve yine 0, hiçbir şey. Gerekirse test borusu tekrar kullanılabilir.

Kullanarak gzip'i öldürmeyi unutma kill -15 28584. Ve bizim adlandırılmış yöneltme kullanarak bizimrm /tmp/testpipe

Örnek Kullanımlar

Adlandırılmış yöneltme kullanarak hemen hemen her şeyi yönlendirebilirsiniz. Örnek olarak, bu tek hat vekilini görebilirsiniz .

Ayrıca burada adlandırılmış boru kullanımının bir güzel açıklaması. TCP / IP yığını yerine adlandırılmış bir kanal kullanarak iletişim kurmak için bir sunucudaki iki işlemi yapılandırabilirsiniz. Çok daha hızlı ve ağ kaynaklarını yüklemiyor. Örneğin, Web Sunucunuz, localhostadres kullanmak veya bir bağlantı noktasını dinlemek yerine doğrudan adlandırılmış bir kanal kullanarak veritabanıyla doğrudan iletişim kurabilir .


14

Sistem belleğini kullanmayacağınız doğrudur, ancak örneğinizde cpu kullanmadığınız gerçeği, sadece boruyu okumadığınızdan, işlemin beklediği içindir.

Aşağıdaki örneği düşünün:

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

Şimdi yeni bir konsol açın ve çalıştırın:

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

Ve üçüncü bir konsolda:

cat /tmp/testpipe > /dev/null

Saat cmd (2 dönem) bakarsanız cpu tüketiminde bir artış gösterecektir!



2

İşte adlandırılmış yöneltmelerin, G / Ç'yi kaldırarak size çok zaman kazandırabileceği bir kullanım durumu .

Bir BigFile'niz olduğunu varsayalım, örneğin 10G.

Ayrıca, bu BigFile öğesinin 1G, BigFileSplit_01 - BigFile_Split_10 arasındaki parçalarına da sahipsiniz.

Şimdi BigFileSplit_05'in doğruluğu hakkında bir şüpheniz var

Doğal olarak, adlandırılmış yöneltmeler olmadan, BigFile'den yeni bir bölünme oluşturacak ve karşılaştıracaksınız:

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

Adlandırılmış borular ile yapardın

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

Bu ilk bakışta büyük bir fark gibi görünmeyebilir ... ama zamanla fark çok büyük!

Seçenek 1:

  • dd: 1G'yi oku / 1G'yi yaz (1)
  • fark: 2G oku
  • rm: serbest ayrılmış kümeler / dizin girişini kaldır

Seçenek 2:

  • dd: hiçbir şey! (adlandırılmış yöneltene gider)
  • fark: 2G oku
  • rm: yönetilecek ayrılmış küme yok (aslında dosya sistemine hiçbir şey yazmadık) / remove directory girişi

Bu nedenle, temelde adlandırılmış olan boru burada 1G'nin yanı sıra bazı dosya sistemi temizliğini okumak ve yazmak için saklar (dosya sistemine hiçbir şey yazmadık çünkü boş iki düğümden).

G / Ç yapmamak, özellikle de yazar, disklerin yıpranmasını önlemek için de iyidir. Hücreler ölmeden önce sınırlı sayıda yazma yaptıkları için SSD'lerle çalışırken daha da ilginç.

(1) Açıkçası, başka bir seçenek de bu geçici dosyayı RAM'e, örneğin / tmp RAM'e (tmpfs) takılıysa oluşturmak olacaktır. Bununla birlikte, RAM diskinin boyutu ile sınırlandırılmış olacaksınız, oysa "adlandırılmış boru numarası" sınırsızdır.


0

Bir programın sabit durmasına izin verebilir ve bazı dış etkinlikler için adlandırılmış bir kanalı dinleyebilirsiniz. Dış olay gerçekleştiğinde (örneğin, yeni verilerin gelmesi) bu, ilgili olay verilerini boruya yazarak boruyu yazmak üzere açan ve programa açılan başka bir program tarafından tespit edilebilir. Close ifadesi yayınlandığında, dinleme programı bir veri akışı üzerinden boru üzerinden veri akışını alacak ve elindekileri işlemeye hazır olacaktır. İçeriği okuduktan sonra boruyu kapatmayı unutmayın. Dinleme programı aynı şekilde işlemden geçirilen sonuçları ya da adlandırılmış başka bir boru aracılığıyla da geri gönderebilir. Bu tür programlar arası iletişim zaman zaman çok uygundur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.