Brian Kernighan bu videoda Bell Labs'ın küçük dillere / programlara yönelik hafıza kısıtlamalarına dayanan cazibesini anlatıyor.
Büyük bir makine 64 k-bayt - K, M veya G değil - ve bu da herhangi bir programın çok büyük olamayacağı anlamına geliyordu ve bu nedenle küçük programlar ve daha sonra boru mekanizması yazmak için doğal bir eğilim vardı. Temelde girdi çıkış yönlendirmesi, bir programın diğerine bağlanmasını mümkün kıldı.
Ancak bunun, programlar arasında iletmek için verilerin RAM'de saklanması gerektiğini göz önüne alarak bunun bellek kullanımını nasıl sınırlayabileceğini anlamıyorum.
Gönderen Vikipedi :
Unix benzeri sistemlerin çoğunda , bir boru hattının tüm süreçleri aynı anda başlatılır [benimkinin vurgusu], akışları uygun şekilde bağlanmış ve programlayıcı tarafından makinede çalışan diğer tüm işlemlerle birlikte yönetilmiş olarak. Bunun önemli bir yönü, Unix borularını diğer boru uygulamalarından ayırmak, tamponlama konseptidir: örneğin bir gönderme programı saniyede 5000 bayt üretebilir ve bir alıcı program sadece saniyede 100 bayt kabul edebilir, ancak veri kayboldu. Bunun yerine, gönderen programın çıktısı arabellekte tutulur. Alıcı program veri okumaya hazır olduğunda, boru hattındaki bir sonraki program tampondan okur. Linux'ta, arabellek boyutu 65536 bayttır (64KB). Gerekirse daha büyük arabellek sağlamak için bfr adlı bir açık kaynaklı üçüncü taraf filtresi kullanılabilir.
Bu beni daha da karıştırıyor, çünkü bu, küçük programların amacını tamamen ortadan kaldırıyor (belli bir ölçekte modüler olsalar bile).
İlk soruma çözüm olarak düşünebileceğim tek şey (bellek sınırlamaları boyut verilerine bağlı olarak sorunlu) büyük veri setlerinin basitçe o zamanlar hesaplanmadığı ve asıl sorun boru hatlarının çözmesi gereken şeydi. programların kendileri tarafından gerekli olan hafıza miktarı. Ancak Wikipedia'daki alıntı metne bakıldığında bile, bu beni şaşırtıyor: bir program bir anda uygulanmıyor.
Tüm bunlar, eğer geçici dosyalar kullanılırsa çok anlamlı olur, ancak boruların diske yazmadığını anladım (takas kullanılmadığı sürece).
Örnek:
sed 'simplesubstitution' file | sort | uniq > file2
sed
Dosyada okuyor ve satır satır tükürmek bana göre açık . Ancak sort
, BK bağlantılı videoda belirtildiği gibi, tam bir duraklamadır, bu nedenle tüm verilerin hafızaya okunması gerekir (ya da öyle mi?), Sonra aktarılır uniq
, hangisi (aklıma) bir tane olur bir anda-line programı. Fakat birinci ve ikinci boru arasında, tüm verilerin bellekte olması gerekir, değil mi?
unless swap is used
takas her zaman yeterli RAM olmadığında kullanılır