Csővezeték (architekturális minta)

A számítógép-programozásban a csővezeték a feldolgozó elemek (folyamatok, rutinok, korutinok, függvények, szálak) egymásutánja, úgy elrendezve, hogy az egyik kimenete a másik bemenete. A fizikai csővezeték megfelelője. A kettő között rendszerint pufferelik az adatokat, amelyek lehetnek rekordok, bájtok vagy bitek folyamai, a csővezeték elemeire pedig gyakran szűrőkként hivatkoznak. A mintát gyakran csövek és szűrők programtervezési mintaként hivatkozzák. Az elemek összekapcsolása a függvénykompozíció megfelelője. A funkcionális nyelvekben a generátor-szűrő alapelem; a minta a nem funkcionális nyelvekben is megvalósítja a funkcionális paradigma egy részét.

Szűkebben véve a csővezeték nem ágazik el, és egyirányú, habár tágabb értelemben általánosabb szerkezetekre is hivatkoznak az elnevezéssel. Az egyirányúságot kiegészítheti egy másik irányú, visszafelé vagy return csatorna, de lehet a cső kétirányú is. Az egyirányú csöveknek lehet faszerkezete vagy irányított kör nélküli szerkezete (aciklikus gráf).

Végrehajtása

[szerkesztés]

A csővezeték szerkezetű programot a többfelhasználós operációs rendszerek gyakran úgy hajtják végre, hogy elemeit önálló szálakként indítják, és automatikusan hajtják végre az adattovábbítást. Az ütemezés minimalizálja a várakozási időt. Egy másik gyakori modellben korutinokként vagy könnyű szálakként hajtják végre az egyes elemeket, hogy csökkentsék az adminisztrációt. Van, ahol közvetlenül az operációs rendszer, van, ahol a szálkezelő végzi a szálak ütemezését, viszont a korutinokat a korutinkezelő ütemezi.

Csővezeték használatakor fontos a megfelelő ütemezés. Az író és az olvasó műveleteket rendszerint blokkolnak, ha az adatokhoz nem lehet hozzáférni, akkor a szál blokkolódik, amíg nem áll rendelkezésére az adatfolyam. Ez holtponthoz vezethet, mivel az olvasó nem tud olvasni, és mivel lefoglalva tartja az adatfolyamot, nem is lehet írni neki. A két szál örökké várna egymásra.

A legtöbb operációs rendszer buffereli az adatokat, így a csővezeték tagjai egy ideig többet írhatnak, mint olvashatnak. A legtöbb Unix és Unix-szerű operációs rendszerben beállítható és optimalizálható a buffer, rendszerint a buffer utasítással. Hasznos, ha az olvasó folyamat lassabb, mint az író. Például az író CD-ről olvassa a nyers hanghullám fájlt, és az olvasó ezt dolgozza fel MP3 formába. Ekkor elég nagy buffer esetén, miután az író befejezte a futást, a CD kiadható, még akkor is, ha az olvasó tovább fut.

Megvalósításai

[szerkesztés]

A buffer utasítás rendszerhívásokkal valósítható meg. A busy waiting elkerülhető poll, select utasításokkal, vagy több szál használatával.

A csővezeték megvalósítását támogató programozási rendszerek:

  • RaftLibC/C++ Apache 2.0 licenc
  • VM/CMS és z/OS - a CMS Pipelines egyszerűbb szintaxist ad csővezetékek megvalósítására VM/CMS és z/OS operációs rendszerekre tervezett programok számára, mint a UNIX héjak

CMS Pipelines

[szerkesztés]

A CMS Pipelines a VM/CMS és z/OS operációs rendszereken támogatja a csővezetékek megvalósítását. Ha bonyolultabb csővezetékekről van szó, akkor szintaxisa egyszerűbb, mint a UNIX rendszerhéjaké, így könnyebb olyan csővezetéket létrehozni, aminek több bemenete és kimenete van.

Az IBM hagyományos alkalmazásaiban nincs szabványos be- és kimenet, amiket át lehetne irányítani. Ehelyett a CMS Pipelines egy könnyű diszpécsert vezet be a beépített programok példányainak párhuzamos végrehajtásával, ami lehetővé teszi a csővezeték használatát. Több, mint 200 beépített program támogatja a UNIX-ra jellemző alkalmazásokat, az eszközök interfészeit és az operációs rendszer szolgáltatásait. Ezek mellett a CMS Pipelines keretrendszert is definiál, ami lehetővé teszi a felhasználó által írt REXX programoknak, hogy be- és kimenő adatfolyamokat használjanak a csővezetékben.

Az IBM keretrendszerekben az adatok rendszerint rekordorientált fájlrendszerben találhatók, és az I/O eszközök inkább rekordokkal, mint streamekkel dolgoznak. Ennek következményeként a CMS Pipelines is rekord módban kezeli az adatokat. Szövegfájlokban egy sor egy rekord. Bufferelés általában nincs, de lock-lépéses rendszerben továbbítja őket. Ez determinisztikus adatfolyamot biztosít egymással összekapcsolt csövek hálózatában.

Objektum csővezetékek

[szerkesztés]

A bájtstream alapú csővezetékek mellett objektum csővezetékek is vannak. Itt az elemek szöveg helyett objektumok. A Windows PowerShell tartalmaz belső objektum csővezetéket, ami objektumokat közvetít a PowerShell futásidejű környezetében futó függvények között. További metafora a Limbo csatornája.

GUI csővezetékek

[szerkesztés]

A RISC OS és a ROX Desktop szintén csővezetékeket használ. Például amikor letöltenek egy fájlt, akkor a fájlrendszert mutató párbeszédablak helyett egy ikon jelenik meg. Ahová azt húzza a felhasznál, oda lesz mentve. Ha egy program ikonjára húzza, akkor az a program megkapja a fájlt további feldolgozásra. Például a felhasználó le akar tölteni egy tömörített képet, feldolgozni majd újra feltölteni. Ekkor az ikont először az archívumkezelőre, utána a képszerkesztőre, végül a feltöltő program ikonjára húzza.

Elvben ugyanezt meg lehetne csinálni hagyományos fájlszerkesztőben is, de akkor a felhasználónak emlékeznie kell, hogy hol találhatók a programjai. Ehhez azonban a programok helyének nyilvánvalónak és könnyen meghatározhatónak kell lennie, ám többnyire nem ez a helyzet, úgyhogy a grafikus csővezetékek ritkák.

További meggondolások

[szerkesztés]

A csővezeték a funkcionális programozásra jellemző. Mivel bájtstreameket adatobjektumként használ, azért az I/O monád egyik megvalósításának tekinthető.[1]

A csővezeték a fizikai csővezetékre utal; az adatok úgy folynak, mint a víz a csővezetékben. Vannak kivételek, például a törött cső jel (broken pipe).

A Cocoon webfejlesztési eszközhöz és a W3C szabvány szerinti XProc implementációban is fontos a csővezeték, mivel így megjelenítés előtt fel lehet dolgozni a forrás streamet.

A minta bátorítja a szövegfájlok használatát be- és kimenetként. Ezt számításba kell venni, ha a szöveges programokhoz grafikus héjat készítenek.

Jegyzetek

[szerkesztés]

Források

[szerkesztés]

Fordítás

[szerkesztés]

Ez a szócikk részben vagy egészben a Pipeline (software) című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.