Adlandırılmış kanalın adsız kanal yerine kullanılmasının avantajları nelerdir?


51

Bir unix yöneticisinden sorulan bir dizi görüşme sorusunu gözden geçiriyordum; "Adlandırılmış yöneltme" adında bir konu buldum.

Ben konu googled; bir dereceye kadar anlayabildim: - adlandırılmış borular || FIFO

Ancak yine de, bu özel boru tipinin ne zaman kullanılacağı konusunda bilgi sahibi olmadığımı hissediyorum. Adsız boruların çalışamayacağı özel durumlar var mı?


Yanıtlar:


39

İsimli boruların (fifo) aklıma gelen dört üç avantajı vardır:

  • aynı anda okuma / yazma işlemlerine başlamak zorunda değilsiniz
  • Ortak geçmişe ihtiyaç duymayan birden fazla okuyucunuz / yazıcınız olabilir
  • bir dosya olarak mülkiyeti ve izinleri kontrol edebilirsiniz
  • bunlar çift yönlüdür, adlandırılmamış borular tek yönlü olabilir *

    *), Bir standart kabuk düşünün |, tek yönlü olan boru hattı, çeşitli kabukları ( ksh, zshve bash) de teklif yardımcı işlemci çift yönlü iletişimi sağlar. POSIX, boruları yarı çift yönlü olarak ele alır (yani, her bir taraf yalnızca okuyabilir veya yazabilir), pipe()sistem çağrısı iki dosya tanıtıcısı döndürür ve bir tanesini salt okunur, diğerini salt okunur olarak kabul etmeniz gerekebilir. Bazı (BSD) sistemler, aynı anda okuma ve yazma işlemlerini (POSIX tarafından yasaklanmadı) destekler, diğerlerinde, her yön için bir tane olmak üzere iki boruya ihtiyacınız olacaktır. Senin Kontrol pipe(), popen()ve muhtemelen popen2()adam sayfalarını. Tek yönlülük, borunun adlandırılıp adlandırılmamasına bağlı olmayabilir, ancak Linux 2.6'da bağımlıdır.

(Güncelleme, Stephane Chazelas'ın görüşleri sayesinde )

Bu nedenle, adlandırılmamış bir boru ile elde edemediğiniz hemen açık bir görev, geleneksel bir istemci / sunucu uygulamasıdır.

Tek yönlü borular hakkındaki yukarıdaki son (nokta) nokta Linux ile ilgilidir, POSIX (bkz. popen()) Bir borunun sadece okunabilir veya yazılabilir olması gerektiğini , Linux'ta tek yönlü olduklarını söylüyor . Linux'a özgü ayrıntılar için, bkz . Linux Çekirdeğini Anlama (3. Baskı, Ed. O'Reilly) (p787). Diğer işletim sistemleri çift yönlü (adsız) borular sunuyor.

Örnek olarak, Nagios komut dosyası için bir fifo kullanır . Çeşitli dış süreçler (CGI betikleri, dış kontroller, NRPE vb.) Bu ikilinin komutlarını / güncellemelerini yazar ve bunlar kalıcı Nagios süreci tarafından işlenir.

Adlandırılmış kanallar, TCP bağlantılarından farklı özelliklere sahiptir, ancak önemli farklılıklar vardır. Bir ikilinin okuyucusuz olsa bile yazabileceğiniz kalıcı bir dosya sistemi adı olduğundan, kuşkusuz yazarların engelleyemeyeceği (asenkron veya engellemesiz G / Ç olmadan), alıcı değilse veri kaybedemez başlatıldı (veya yeniden başlatılıyor).

Başvuru için, ayrıca bkz alanı soketlerine ve cevabını bu Stackoverflow soru ana özetler IPC yöntemleri ve bu bir bahsediyorpopen()


2
Adsız borular ile birden fazla okuyucu / yazar olabilir . Linux'ta, adlandırılmamış borulardan daha iki yönlü değiller. Bir yazı sonu ve bir okuma sonu var ve veriler sadece bir yönde akıyor. Bir yazmaç modunda bir ikiliyi açtığınızda, yazma sonunda, okuma modunda okuma ucu, rw modunda, yazma sonuna yazarsınız ve okumadan okunur. Bu, iki yönlü borulardan veya unix alan soketlerinden farklıdır; burada her iki yönde iki ayrı veri akışı vardır.
Stéphane Chazelas

@StephaneChazelas Geri bildirim için teşekkürler, cevabını daha spesifik olması için güncelledik ve boruları ve yönlülüklerini açıklığa kavuşturdum (umarım).
mr.spuratic

Adlandırılmış bir boruya haberleşme disk IO mu içeriyor? Yoksa hepsi hafızada mı? Bu IPC mekanizmalarının performans zarfını ne belirlemektedir?
CMCDragonkai

15

Adsız veya anonim borular, bir ebeveyn-çocuk ilişkisi ile ilgili olan veya bir kabuk gibi boruyu sağlayan ortak bir ebeveyne ait çocuklar olarak bire bir, bire bir, bir arada süreçler arası iletişim sağlar. süreci. İşlemler ilişkili olduğu için, dosya tanımlayıcılarının boruya ilişkilendirilmesi dolaylı olabilir ve işlemlerin dışında kalan bir adı olan bir nesne gerektirmez. Adsız bir boru, yalnızca onu kullanan işlemin açık dosya tanımlayıcılarını koruduğu sürece boruya yazılır. İşlemler çıktığında ve işletim sistemi işlemlerle ilişkili tüm dosya tanımlayıcılarını kapattığında, adlandırılmamış boru kapanır.

İsimli borular aslında FIFO'lar. Bunlar, dosya sistemindeki düğümler tarafından temsil edilen kalıcı nesnelerdir. Adlandırılmış bir boru, mutlaka birbiriyle ilişkili olmayan ve aynı anda var olmaları gerekmeyen bir veya daha fazla işlem arasında çoktan çoğa, iki yönlü iletişim sağlar. Borunun dosya adı iletişim süreçleri arasında bir adres ya da sözleşme işlevi görür. Eğer sadece bir işlem adlandırılmış bir boruya yazarsa ve bir başka işlem adlandırılmış borudan okursa, adlandırılmış boru, ilgili iki işlem arasında adlandırılmamış bir boru gibi davranır.

Bu nedenle kısa cevap, aynı anda bulunamayan ilişkisiz işlemler arasındaki iletişimi sağlamak için adlandırılmış bir boruya ihtiyaç duymanızdır.


+1 Süreçlerin hemen hemen her zaman aynı anda var olduğunu düşünüyorum (aksi halde boru biraz anlamsızdır - sadece normal bir dosyada da şeyler bırakabilirsiniz). Bu ve unix alan soketleri, genellikle komut satırından kontrol edilebilen daemon servisleri tarafından kullanılır. /runLinux masaüstü sistemine bakarsanız, muhtemelen ikisini de bulacaksınız (fifos ve unix soketleri). Bu bir IPC şekli .
goldilocks

2
@goldilocks: Adlandırılmış bir boru, iletişim süreçlerinin kısa sürdüğü ve aynı anda bulunmadığı gömülü sistemlerdeki işlemler arasında, bellekte yerleşik bir geçici posta kutusu olarak kullanılır. Bunun avantajı, uygulamanın basitliği ve paylaşılan bellek IPC'si ve sadece RAM'in kullanılmasıdır. Dezavantajı, botlar ile borunun baytlı FIFO niteliği arasındaki kalıcılık değil, paylaşılan hafızalı bir yapı kullanma yeteneğidir.
Jonathan Ben-Avraham

@ jonathan: +1, bazı şüphelerim var: - neden FIFO olarak adlandırılmış yöneltmeler diyoruz; Persistan nesneler nedir?
Ankit

@Ankit: Bazı insanlar FIFO adlı bir boruya FIFO adını verir çünkü FIFO veri yapısı gibi davranır, özellikle tek bir işlemle hem okuma hem de yazma için açıldığında. "Kalıcı nesne" ile adlandırılmış bir borunun bir dosya sistemi nesnesiyle ilişkili olduğunu kastettim. Yani, adı olan bir dosya türüdür ve medyada depolanan diğer herhangi bir dosya ile aynı kalıcılığa sahiptir.
Jonathan Ben-Avraham

4

Başka bir yerde bahsedilmeyen bir avantaj, adlandırılmış bir borunun sadece bir dosyanın yapılacağı yerlerde kullanılabileceğidir.

Örneğin, bazı e-posta istemcileri ~ / .signature içeriğini her posta iletisine ekleme özelliğine sahiptir. .Signature bir komut satırı seçeneği olsaydı ya da posta istemcisi .signature dosyasının çalıştırılabilir olduğunu ve çalışıp çalışmadığını fark ederse, adlandırılmış bir boruya ihtiyacınız olmazdı. Ancak posta istemcisi bu kadar karmaşık değilse, .signature adlı bir adlandırılmış yöneltme yapabilir ve dosyanın her okunuşunda yeni bir imza oluşturan bir uygulama çalıştırabilirsiniz.


İlginç. Böyle bir uygulamanız var mı? FIFO'ya ne zaman erişildiğini görmek için çekirdek düzeyinde izlemek zorunda kalacak gibi görünüyor.
Wildcard

4

İsimli boruların başka bir avantajı var: farklı sistemler arasında kullanabilirsiniz . Farklı makinelerde çalışan iki işlemin gerçek zamanlı iletişimini istediğinizi varsayalım. Sonra ikisi arasında bir klasör paylaşın, FIFO'nuzu klasörün üzerine yerleştirin ve yola koyulun. Dosyalar üzerinde çalışmak üzere tasarlanmış bir uygulamayı bağlantı noktasını dinleyen bir servise dönüştürmekten çok daha kolaydır.

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.