Boru hattı (programlama)

Boru hattı (pipeline), yazılım mühendisliğinde, her bir elemanın çıktısı bir sonraki elemanın girdisi olacak şekilde sıralanmış işlemler zinciridir. Genellikle, ardışık birimlerin aralarına bir miktar arabellek (buffer) konulmaktadır. Bu boruhatları arasındaki bilgi akışı çoğunlukla bayt katarları (stream) ve bit katarları şeklindedir.

Çoklu İşlem Yürütümlü (Multiprocessed) Boruhatları

Boruhatları, en verimli şekilde; tüm komut dizileri aynı anda başlatılarak ve her bir komut dizisi tarafından gönderilen veri okuma isteğine otomatik olarak cevap verilerek, çoklu görev yürütümlü (multitasking) bir işletim sistemine yerleştirilebilirler. Bu şekilde, merkezi işlem birimi (CPU), bekleme süresini en aza indirmek için, doğal bir şekilde, çizelgeleyici (scheduler) tarafından komut dizileri arasında anahtarlanacaktır.
Genellikle, okuma ve yazma istekleri, işlemleri engellemektedir. Bu, yazma üzerinde yürütülen kaynak komut dizisinin, tüm veriler hedef komut dizisine yazılana kadar ertelenmesi ve aynı şekilde okuma üzerinde yürütülen hedef komut dizisinin, en azından istenen verilerin bazıları kaynak komut dizisinden alınana kadar ertelenmesi anlamına gelmektedir. Belli ki bu, her iki komut dizisinin de cevap vermek için birbirlerini belirsiz bir süre bekleyeceği bir kilitlenmeye (deadlock) neden olamaz; çünkü, en azından iki komut dizisinden birinin isteğine en kısa zamanda işletim sistemi tarafından hizmet verilecektir ve komut dizisi yürütülmeye devam edecektir.
Performans için birçok işletim sistemi, kaynak komut dizisinin, hedef komut dizisinin alabileceği veya almak isteyeceği veriden daha fazlasını sağlamasına olanak tanıyan iletişim tüneli arabellekleri (pipe buffer) içermektedir. Çoğu Unice ve Unix benzeri işletim sistemlerinde, genel olarak “arabellek” diye adlandırılan, potansiyel olarak daha büyük ve ayarlanabilir boyutta bir iletişim tüneli arabelleği sağlayan çok özel bir komut da ayrıca mevcuttur.
Bu komut, eğer hedef komut dizisi kaynak komut dizisinden belirgin derecede daha yavaş ise kullanışlı olabilir; ancak yine de kaynak komut dizisinin, mümkün olan en kısa sürede görevini tamamlaması arzulanmaktadır. Örneğin, kaynak komut dizisi, CD’den ses kaydı okuyan bir komuttan oluşuyor olsun ve hedef komut dizisi, dalga biçimindeki ses verisini OGG Vorbis formatında sıkıştıran bir komuttan oluşuyor olsun. Bu durumda, ses kaydının tamamını iletişim tüneli arabelleği içinde saklamak, CD sürücüsünün daha hızlı durmasına ve kullanıcının şifreleme (encode) işlemi tamamlanmadan CD’yi sürücüden çıkarabilmesine olanak tanıyacaktır.
Bu tür bir arabellek komutu, mevcut işletim sistemindeki veri okuma ve yazma temel öğeleri ile gerçekleştirilebilir. Zaman kaybettiren aktif bekleme (active waiting), poll, select veya multithreading gibi avantajlar kullanılarak önlenebilir.

VM/CMS ve MVS

CMS boruhattı, bizi VM/CMS ve MVS sistemlere götüren boruhattı fikrinin giriş aşamasıdır. Bu, çoklu girdi katarlarını alıp bunlardan çoklu çıktı katarları üreterek, Unix kabuklarından (shell) çok daha karmaşık boruhattı yapılarını destekler. [Böyle bir işlevsellik Unix çekirdeği (kernel) tarafından desteklenmektedir, ancak çok az program bunu kullanır ve hiçbir kabuk bunun için bir sözdizim (syntax) sağlamaz.] IBM mainframe işletim sistemleri, farklı doğaları yüzünden, CMS boruhatları içine, Unix’te farklı harici programlar şeklinde olan birçok adım eklemişlerdir; fakat aynı zamanda, işlevsel olmaları için, farklı harici programları çağırabilirler. Aynı zamanda, IBM mainframe dosyalarının kayıt bazlı (record-oriented) doğaları nedeniyle, boruhatları, akış bazlı (stream-oriented) değil de kayıt bazlı düzende çalışırlar.

GUI’ler İçinde Boruhatları

RISC OS ve ROX Desktop gibi grafiksel ortamlar da botuhatları kullanırlar. Kullanıcının, bir programın nereye veri yazacağını belirtmesini sağlayan, dosya yöneticisi içeren bir kayıt diyalog kutusu sunmak yerine; RISC OS ve ROX, bir simge (ve ismi belirtmek için bir alan) içeren kayıt diyalog kutusu sunmaktadırlar. Hedef, simgenin sürüklenip bırakılmasıyla belirlenir. Kullanıcı, diğer programların simgeleri de dahil, kaydedilmiş bir dosyanın bırakılabileceği her yere simgeyi bırakabilir. Eğer simge bir program simgesinin üzerine bırakılırsa, program çalıştırılır ve normalde kaydedilmesi gereken dosya içeriği, yeni programın standart girdisine verilir.
Örnek olarak, internette gezinen bir kullanıcı, düzenleyip yeniden karşıya yüklemek (upload)
İsteyeceği, .gz uzantılı, sıkıştırılmış resim dosyası ile karşılacaktır. GUI boruhatlarını kullanarak kullanıcı, bağı (link) arşiv açma programına sürükleyebilir, açılmış içeriği temsil eden simgeyi resim düzenleyicisine sürükleyebilir, farklı kaydet diyalogunu açabilir ve dosya simgesini karşıya yükleme programına sürükleyebilir.
Bu yöntem, geleneksel kayıt diyalog kutusu ile de kullanılabilir; ancak bunun için, kullanıcının programlarının dosya sisteminde açık ve kolay erişilebilir konumlara sahip olmaları gerekmektedir. Uygulamada bunun yerine sıklıkla GUI boruhatları kullanılır.