Unix borunun tam ustalığı nedir


52

Douglas Mcllroy'un konseptle nasıl ortaya çıktığını ve Ken Thompson'ın bir gecede nasıl uyguladığını anlattım.

Anladığım kadarıyla pipe, bir işlemin yazdığı ve diğerinin okuduğu iki işlem arasında bir bellek parçasını paylaşan bir sistem çağrısıdır.

İşletim sistemi kurumları veya konseptlerine aşina olmayan biri olarak, hikayedeki "dahi" nin tam olarak ne olduğunu merak ediyordum. Belleği paylaşan iki işlem fikri mi? Yoksa uygulama mı? Ya da her ikisi de?

Not: Borunun kullanımının veya kabuğun içinde nasıl kullanılacağının farkındayım. Soru, kavram ve uygulama ile ilgilidir.|


4
Sanırım bu ilk günlerde, uygulamaları oluşturmak için bir mekanizma uygulamak için kuvvetlice itmek oldukça radikaldi. Bunu yapmak için, arayüzü uygulamadan ayırmak için iyi oluşturulmuş bir anlayışa sahip olmanız ve fonksiyonel kompozisyonun programlamadaki faydasını fark etmeniz gerekir.
Chan-Ho Suh

4
Çalışmakta olan uygulamaların yalnızca standart giriş tanıtıcısı ve standart çıkış tanıtıcısı olması ve Unix benzeri işletim sistemi API'lerinin bu tanıtıcılara uygulanacak okuma / yazma işlevi yoktu. Birkaç ortogonal ve son derece yetenekli konseptlerin (kulplar, çıktılar ve bunlardan girdiler) akıllıca kullanılması sadece borulara değil aynı zamanda soketlere, karakter-cihaz etkileşimlerini ve düzinelerce başka şeylere de yol açar. Artık dosya tanıtıcılarımız var (klavye girişi ve metin çıktısı sağlayan tty için) bir uygulama diğerinin tty'si olacak şekilde uygulamalar oluşturalım.
Warren P,

6
@WarrenP Aslında, Unix , sistem çağrısı ve kabuk operatörü nedeniyle standart girdi ve standart çıktı aldı (ref: McIlroy ). Veya, Voltaire'ın dediği gibi, " Eğer [stdio] olmasaydı, [onu] icat etmek gerekli olurdu. " :-)pipe()|
Ross Patterson

Bir dosya tanıtıcısı gibi bir şey, daha sonra borulardan sonra bir giriş ve çıkış kolu yoktu?
Warren P,

4
@WarrenP: Patterson'un söylediği şeye benziyor: ilk önce dosya tanıtıcıları vardı. Sonra bu adamlar, her programın varsayılan olarak bir giriş tanıtıcısı ve çıkış tanıtıcısı olduğu fikrini ortaya koydu; Bunlar "standart" girdi / çıktı olarak bilinir.
Mooing Duck

Yanıtlar:


109

Anladığım kadarıyla pipe, bir işlemin yazdığı ve diğerinin okuduğu iki işlem arasında bir bellek parçasını paylaşan bir sistem çağrısıdır.

Aslında, paylaşılan bir hafıza yok. Okuyucu ve yazar, adres alanlarının hiçbir bölümünü paylaşmıyor ve açık bir senkronizasyon kullanmıyorlar.

Okuma ve yazma işlemleri yapıyoruz readve writesistem çağrıları tam onlar bir dosyaya yazma / okuma sanki olduğu gibi. BU dehadır ... yenilik: (basit) süreçler arası iletişim ve dosya giriş / çıkışının aynı şekilde kullanılabileceği fikri ... uygulama programcısı ve kullanıcı perspektifinden.

Boru kurulduktan sonra, işletim sistemi (uygulama kodu değil veya kullanıcı alanındaki kütüphaneler) tamponlama ve koordinasyon ile ilgilenir. Şeffaf.


Buna karşılık, boru konseptinin icadından önce, "boru hattı" işlemesi yapmanız gerekiyorsa, tipik olarak bir dosyaya bir uygulama yazma çıktınız olur ve daha sonra bittiğinde, ikinci uygulamayı veri tabanından okumak için çalıştırırsınız. dosya.

Alternatif olarak, gerçek bir boru hattı istiyorsanız, her iki uygulamayı da (gerçek) paylaşılan bir bellek segmenti oluşturmak üzere kodlayabilir ve okuma / yazmayı koordine etmek için semaforlar (veya başka bir şey) kullanabilirsiniz. Karmaşık ... ve sonuç olarak sık değil.


34
"BU dehadır ... yenilik: süreçler arası iletişimi ve G / Ç dosyalarının aynı şekilde ele alınabileceği" - tam olarak bu. Size asla tasarlanmamış programlar arasında süreçler arası iletişim kurmanıza olanak tanır ve neler olduğunu bile bilmenize gerek yoktur.
Guntram Blohm

6
Ayrıca, IPC için G / Ç dosyası kullanma nedeninin esas olarak yararlı olduğunu, çünkü Unix'in metin işleme için tasarlandığını , programın programdan programa metin verilerini aktaracağını ve göreceli olarak ağrısız bileşimi sağladığını ve bunun da tüm sistemin inşa edilebileceğini belirtti. basit işlemlerin (muhtemelen) uzun zincirlerinde verileri bir başkasına aktaran nispeten basit, küçük programlar. Temel olarak, metin işlemeyle başa çıkmak için nispeten esnek bir diliniz olduğu anlamına gelir .
Luaan

1
Ve böylece "Unix borusunun marifeti" "Unix'in marifeti" dir: tüm giriş / çıkışlar (işlemler arası iletişim, standart dosyalar ve dosya sistemi nesnelerinin geri kalanı dahil) dosyalar olarak kullanılır.
Mark Hurd,

Başka bir dahiyane vuruş, UNIX'in her baytın sayıldığı bir zamanda insan tarafından okunabilen dosya yapılarını savunmasıydı ...
EvertW

14

Benim düşünceme göre, "borular" fikrinin dehası kullanımın basitliğidir.

Herhangi bir sistem çağrısı yapmanız, hafıza ayırmanız, hiçbir şey karmaşık değil. Kabuğunda, bir tek karakterle kullanın: |. Bu, verilen göreve basit (veya karmaşık) araçların kombinasyonunda olağanüstü bir güç verir.

Düzgün bir şekilde metin sıralamak gibi bazı günlük görevleri yerine getirin. Bir sürü ismi listeleyen bir emriniz olabilir. (Benim örneğim için, bir sürü isim, listofrandomnames.com'un izniyle) içeren bir dosya kullanacağım.) Borular kullanarak, aşağıdaki gibi bir şey yapabilirsiniz:

$ cat names.txt
Sally Weikel
Dana Penaflor
Christine Hook
Shaneka Flythe
Almeda Crook
Freddie Lindley
Hester Kersh
Wanda Ruse
Megan Mauzy
Samuel Mancha
Paris Phipps
Annika Accardo
Elena Nabors
Caroline Foti
Jude Nesby
Chase Gordy
Carmela Driggers
Marlin Ostendorf
Harrison Dauber
$ cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Accardo, Annika     Hook, Christine     Ostendorf, Marlin
Crook, Almeda       Kersh, Hester       Penaflor, Dana
Dauber, Harrison    Lindley, Freddie    Phipps, Paris
Driggers, Carmela   Mancha, Samuel      Ruse, Wanda
Flythe, Shaneka     Mauzy, Megan        Weikel, Sally
Foti, Caroline      Nabors, Elena
Gordy, Chase        Nesby, Jude

Bu sadece bir örnek; binlercesi var. Boruların kullanılmasıyla dikkat çekecek derecede daha kolay hale getirilen diğer bazı özel görevler için bu sayfadaki "Unix Felsefesi" bölümüne bakın .


Bu cevabı vurgulamak için, "Neden Zsh Kabuktan Daha Soğuk?"


Yukarıdaki komutun bir UUOC içerdiğini biliyorum . Durmasına izin verdim çünkü metin üreten keyfi bir komut için bir yer tutucudur.


3
Küçük minik not : daha hızlı sort -uiş yapabilir sort | uniq.
Idonotexist,

cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100Alışkın olabilirsin ama ben hiç basit demem. Özellikle de awkkısım.
Federico Poloni

Borular basittir. “Basit (veya karmaşık) araçların belirli bir göreve birleştirilmesinde olağanüstü bir güç” dedim .
Wildcard,

5

Bu yüzden, sanatın borudan önceki durumunun ne olduğunu bulmak için PDP-10 / TOPS-10 kılavuzlarını arayarak biraz araştırma yapmaya çalıştım. Bulduğum bu ama TOPS-10 google derece zordur. : Borunun buluş üzerinde birkaç iyi başvuruları vardır McIlroy ile bir görüşme , tarihi ve UNIX etkisi hakkında .

Bunu tarihsel bağlama koymak zorundasın. Aldığımız modern araç ve olanaklardan çok azı vardı.

“Başlangıçta, Thompson PDP'nin üzerinde program bile yapmadı, ancak bunun yerine bir GE-635 makinesindeki GEMAP montajcısı için bir makro seti kullandı.” (29) GE 635'te bir kağıt bant üretildi ve sonra test edildi. PDP-7, Ritchie'ye göre, "ilkel bir Unix çekirdeği, bir editör, bir montajcı, basit bir kabuk (komut yorumlayıcısı) ve birkaç yardımcı program (Unix rm, cat, cp komutları gibi) tamamlanana kadar. bu noktada işletim sistemi kendi kendini destekliyordu, programlar kağıt kasete başvurmadan yazılabilir ve test edilebilirdi ve PDP-7'nin geliştirilmesine devam edildi. ”

Bir PDP-7 buna benziyor . Etkileşimli bir ekranın veya sabit diskin olmadığına dikkat edin. "Dosya sistemi" manyetik bantta depolanır. Programlar ve veriler için 64kB'a kadar hafıza vardı.

Bu ortamda, programcılar, doğrudan bant arayüzünden okunan bir seferde bir defada bandı ve işlem karakterlerini işlemek için komutlar yayınlamak gibi doğrudan donanıma yöneldiler. UNIX, bunun üzerine soyutlamalar sağladı; böylece "teletipten okunan" ve "banttan okunan" ayrı arayüzler olmaktan ziyade, bunlar, bir diske birleştirildi, "önemli bir boru eklemesiyle", geçici bir kopyasını diskte saklamadan başka bir programın çıktısından okundu veya kaset ".

İşte McIlroy'un icadı grep. Bunun UNIX öncesi ortamda gerekli olan iş miktarını toplamak için iyi bir iş çıkardığını düşünüyorum.

"Grep benim için icat edildi. Metinleri sesli bir sentezleyiciden sesli bir şekilde okumak için bir program yapıyordum. Fonetik kuralları icat ettiğimden Webster'ın sözlüğünü başarısız olabilecek sözcükler için kontrol ederdim. Örneğin, digraph ile nasıl başa çıkacaksınız ' ui ', birçok farklı yolla telaffuz edilir:' meyve ',' guile ',' suçlu ',' kederli ',' sezgi ',' beguine? 'sözlüğünü ed'in sınırlı tamponuna uyan ve kullanan parçalara bölerdim bir liste seçmek için genel bir komut. Önerilen her kuralın nasıl çalıştığını görmek için bu listeleri tekrar ediniz.

"Sözlüğü bölmek zorunda kaldığı için süreç sıkıcı ve korkunç bir şekilde savundu (biri satırda bölünmüş bir kopya bırakmayı göze alamazdı.) ve sonunda onu attı, bu da zaman alıyor. ”

"Bir öğleden sonra Ken Thompson'a normal ifade tanıyıcıyı düzenleyiciden kaldırabilir ve bunu yapmak için tek seferlik bir program yapıp yapamayacağını sordum. Evet dedi. Ertesi sabah postalarımda grep adlı bir programın duyurusunu yapan bir not buldum. Bir cazibeye benziyordu. Komik ismin ne anlama geldiğini sorduğunda Ken açık olduğunu söyledi. Editör komutunu simüle ettiği g / re / p (global düzenli ifade baskısı). "

Bunun ilk kısmını cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100örnekle karşılaştırın. Eğer seçenekleriniz "bir komut satırı oluştur" a karşı "özel olarak bir program yazmayı el ile, montajcı olarak" yazıyorsa, komut satırını oluşturmaya değer. (Kağıt) kılavuzlarını okumak birkaç saat sürse bile. Daha sonra ileride başvurmak üzere yazabilirsiniz.


1

Pipes'ın dehası, üç önemli fikri birleştirmesidir.

Birincisi, borular 1958'de Conway tarafından belirtilen ve Borulardan önce pratikte çok az kullanım görmüş olan bir terim olan 'ortak rutinlerin' pratik bir uygulamasıdır.

İkincisi, boruları kabuk dilinde uygulayarak, Thompson ve arkadaşları ilk gerçek "yapıştırıcı dilini" icat ettiler.

Bu iki nokta, yeniden kullanılabilir yazılım bileşenlerinin düşük seviyeli, optimize edilmiş bir dilde verimli bir şekilde geliştirilmesine ve daha büyük, daha karmaşık işlevsellik oluşturmak üzere bir araya yapıştırılmasına olanak tanır. Buna 'Büyük Programlama' diyorlardı.

Üçüncüsü, dosya erişimi için kullanılan aynı sistem çağrılarını kullanan boruların uygulanması, programların evrensel arayüzlerle yazılmasına izin verdi. Bu, yazılım bileşenlerine gerçek anlamda evrensel çözümler sunarak, etkileşimli olarak kullanılabilir, dosyalardan gelen veriler kullanılarak ve daha büyük yazılım sistemlerinin bir parçası olarak, hepsi yazılım bileşenlerinde tek bir değişiklik yapmadan kullanılabilir. Derleme yok, konfigürasyon yok, sadece birkaç basit kabuk komutu var.

Öğrenme eğrisini geçmeyi düşünüyorsanız, UNIX yazılımı bugün 40 yıl önceki kadar faydalıdır. Halihazırda bildikleri ve çözüm ürettiği şeyleri sürekli olarak yeniden icat ediyoruz. Ve ana buluş basit Boru idi. Bundan sonraki tek yenilik 80'lerde internetin yaratılmasıydı. Dramatik olarak, UNIX ayrı bir API oluşturarak bunun uygulanmasını engelledi. Sonuçlara hala katlanmaktayız ... Ah, evet, 80'lerin sonunda popüler hale gelen video ekranları ve fareleri olan bir şey vardı. Ancak bu WIMP'ler içindir.

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.