Yanıtlar:
Hem Windows hem de POSIX sistemlerinde, adlandırılmış kanallar süreçler arası iletişimin aynı makinede çalışan işlemler arasında gerçekleşmesi için bir yol sağlar. Adlandırılmış kanalların size verdiği şey, ağ yığınını dahil etme performans cezası olmadan verilerinizi göndermenin bir yoludur.
Tıpkı gelen istekler için IP adresini / bağlantı noktasını dinleyen bir sunucunuz olduğu gibi, bir sunucu da istekleri dinleyebilecek bir adlandırılmış kanal kurabilir. Her iki durumda da, istemci işleminin (veya DB erişim kitaplığının) isteği göndermek için belirli bir adresi (veya kanal adını) bilmesi gerekir. Genellikle, yaygın olarak kullanılan bir standart varsayılan mevcuttur (HTTP için bağlantı noktası 80 gibi, SQL sunucusu TCP / IP'de 1433 numaralı bağlantı noktasını kullanır; \\. \ Pipe \ sql \ query adlı bir kanal için).
Ek adlandırılmış kanallar ayarlayarak, her biri kendi istek dinleyicileri olan birden çok DB sunucusunu çalıştırabilirsiniz.
Adlandırılmış kanalların avantajı, genellikle çok daha hızlı olması ve ağ yığın kaynaklarını serbest bırakmasıdır.
- BTW, Windows dünyasında, uzak makinelere giden boruları da adlandırabilirsiniz - ancak bu durumda, adlandırılmış kanal TCP / IP üzerinden taşınır, bu nedenle performansınızı kaybedersiniz. Yerel makine iletişimi için adlandırılmış kanalları kullanın.
Hem Unix hem de Windows "Adlandırılmış kanallar" olarak adlandırılan şeylere sahiptir, ancak farklı şekilde davranırlar. Unix'te adlandırılmış bir kanal, tipik olarak sadece bir okuyucusu ve bir yazarı olan tek yönlü bir caddedir - yazar yazar ve okuyucu okur, anladınız mı?
Windows'ta, "Adlandırılmış kanal" adı verilen şey, bir TCP soketine daha çok benzeyen bir IPC nesnesidir - şeyler her iki yönde de akabilir ve bazı meta veriler vardır (Bir şeyin kimlik bilgilerini diğer uçta alabilirsiniz vb.).
Unix isimli kanallar, dosya sisteminde özel bir dosya olarak görünür ve bunlara kabuk dahil normal dosya IO komutları ile erişilebilir. Windows'lar yoktur ve özel bir sistem çağrısı ile açılması gerekir (bundan sonra çoğunlukla normal bir win32 tanıtıcısı gibi davranırlar).
Daha da kafa karıştırıcı olan Unix'in "Unix soketi" veya AF_UNIX soketi adı verilen ve daha çok bir win32 "adlandırılmış boru" gibi çalışan (ancak tam olarak değil), çift yönlü olan bir şeye sahip olması.
Linux Borular
First In First Out (FIFO) işlemler arası iletişim mekanizması.
Adsız Borular
Komut satırında "|" iki komut arasında.
Named Pipes
Bir FIFO özel dosyası. Oluşturulduktan sonra boruyu normal bir dosya gibi kullanabilirsiniz (açma, kapatma, yazma, okuma, vb.).
Komut satırından (kılavuz sayfası ) "myPipe" adlı adlandırılmış bir kanal oluşturmak için :
mkfifo myPipe
C'den adlandırılmış bir kanal oluşturmak için, burada "yol adı" borunun sahip olmasını istediğiniz addır ve "mod", borunun sahip olmasını istediğiniz izinleri içerir ( man sayfası ):
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
tell()
konumlandırabilir ne seek()
de bir boru içinde.
Wikipedia'ya göre :
[...] Geleneksel bir kanal "isimsizdir" çünkü anonim olarak var olur ve yalnızca işlem devam ettiği sürece devam eder. Adlandırılmış bir kanal sistemde kalıcıdır ve sürecin kullanım süresinin ötesinde var olur ve artık kullanılmadığında "bağlantısı kaldırılmalı" veya silinmelidir. İşlemler, IPC'yi (süreçler arası iletişim) gerçekleştirmek için genellikle adlandırılmış kanala (genellikle bir dosya olarak görünür) eklenir.
Karşılaştırmak
echo "test" | wc
için
mkdnod apipe p
wc apipe
wc şu tarihe kadar engellenecek
echo "test" > apipe
yürütür
Borular, uygulamalar arasında veri akışının bir yoludur. Linux altında bunu bir işlemin çıktısını diğerine aktarmak için her zaman kullanıyorum. Bu anonimdir çünkü hedef uygulama bu giriş akışının nereden geldiğine dair hiçbir fikre sahip değildir. Gerek yok.
Bir adlandırılmış boru sadece aktif varolan boruya bağlamak ve elektrik süpürgesi-up verilerini bir yoludur. Sağlayıcının verileri hangi müşterilerin yiyeceğini bilmediği durumlar içindir.
Bu, Technet'ten bir alıntıdır (işaretli yanıtın neden adlandırılmış kanalların daha hızlı olduğunu söylediğinden emin değil misiniz?):
Adlandırılmış Borular ve TCP / IP Soketleri
Hızlı bir yerel alan ağı (LAN) ortamında, İletim Kontrol Protokolü / İnternet Protokolü (TCP / IP) Soketleri ve Adlandırılmış Borular istemcileri performans açısından karşılaştırılabilir. Ancak, TCP / IP Yuvaları ve Adlandırılmış Kanal istemcileri arasındaki performans farkı, geniş alan ağları (WAN'lar) veya çevirmeli ağlar gibi daha yavaş ağlarda belirgin hale gelir. Bunun nedeni, süreçler arası iletişim (IPC) mekanizmalarının eşler arasında iletişim kurmasının farklı yollarından kaynaklanmaktadır.
Adlandırılmış kanallar için ağ iletişimleri genellikle daha etkileşimlidir. Bir eş, başka bir eş bir okuma komutu kullanarak bunu isteyene kadar veri göndermez. Bir ağ okuması, verileri okumaya başlamadan önce tipik olarak bir dizi gözetleme adlı kanal mesajı içerir. Bunlar yavaş bir ağda çok maliyetli olabilir ve aşırı ağ trafiğine neden olabilir ve bu da diğer ağ istemcilerini etkiler.
Yerel borulardan mı yoksa ağ borularından mı bahsediyorsanız bunu netleştirmek de önemlidir. Sunucu uygulaması bir SQL Server örneğini çalıştıran bilgisayarda yerel olarak çalışıyorsa, yerel Named Pipes protokolü bir seçenektir. Yerel adlandırılmış kanallar çekirdek modunda çalışır ve çok hızlıdır.
TCP / IP Soketleri için, veri aktarımları daha akıcıdır ve daha az ek yüke sahiptir. Veri iletimleri ayrıca, pencereleme, gecikmeli alındı bildirimleri ve benzeri TCP / IP Soketleri performans geliştirme mekanizmalarından da yararlanabilir. Bu, yavaş bir ağda çok yardımcı olabilir. Uygulamaların türüne bağlı olarak, bu tür performans farklılıkları önemli olabilir.
TCP / IP Soketleri ayrıca bir biriktirme listesi sırasını da destekler. Bu, SQL Server'a bağlanmaya çalışırken kanal meşgul hatalarına yol açabilecek adlandırılmış kanallara kıyasla sınırlı bir yumuşatma etkisi sağlayabilir.
Genellikle, TCP / IP, yavaş bir LAN, WAN veya çevirmeli ağda tercih edilirken, daha fazla işlevsellik, kullanım kolaylığı ve yapılandırma seçeneği sunduğu için ağ hızı sorun olmadığında adlandırılmış kanallar daha iyi bir seçim olabilir.
Windows Uygulamaları için süreçler arası iletişim (çoğunlukla). Unix'teki uygulamalar arasında iletişim kurmak için soket kullanmaya benzer.
Unix / linux bağlamında adlandırılmış kanallar, iki farklı kabuğun iletişim kurması için kullanılabilir, çünkü bir kabuk başka bir kabukla hiçbir şey paylaşamaz.
Ayrıca, aynı kabukta iki kez başlatılan bir komut dosyası, iki örnek üzerinden hiçbir şey paylaşamaz. Start () ve stop () işlevini içeren bir arka plan programı kodlarken adlandırılmış yöneltmeler için bir kullanım buldum ve iki eylemi gerçekleştirmek için aynı komut dosyasını kullanmak istedim.
Adlandırılmış borular (veya herhangi bir semafor) olmadan betiği arka planda başlatmak bir sorun olmaz. Mesele şu ki, tamamlandığında örneğe arka planda erişemezsiniz.
Dolayısıyla, ona stop komutunu göndermek istediğinizde yapamazsınız: aynı betiği adlandırılmış borular olmadan çalıştırmak ve stop () işlevini çağırmak, aslında başka bir örnek çalıştırdığınız için hiçbir şey yapmaz.
Çözüm, artalan sürecini başlattığınızda biri READ ve diğeri WRITE olmak üzere iki kanal uygulamaktı. Sonra ona diğer görevlerinin yanı sıra READ borusunu dinlettirin. Daha sonra Stop () işlevi, boruya bir mesaj yazacak ve 0 çıkışını gerçekleştirecek arka planda çalışan komut dosyası tarafından işlenecek bir komut içerir. Bu şekilde, aynı komut dosyasının ikinci örneğimizin yalnızca yapması gereken bir görev vardır: ilk örneğe durmasını söyleyin.
Bu şekilde bir ve yalnızca bir komut dosyası kendi kendine başlayıp durabilir.
Elbette, örneğin bir dokunuşla durdurmayı tetikleyerek bunu yapmanın farklı yolları vardır. Ama bu kodlaması güzel ve ilginç.
Adlandırılmış kanallar, süreçler arası iletişim için bir pencere sistemidir. SQL sunucusu durumunda, sunucu istemci ile aynı makinadaysa, verileri aktarmak için TCP / IP'nin aksine adlandırılmış yöneltmeler kullanmak mümkündür.