Roura (software)

Z Wikipedie, otevřené encyklopedie
Tento článek je o obecném principu. O propojení programů při zpracování dat pojednává článek Roura (Unix).

Roura (též trubka nebo pípa, anglicky pipeline) je v softwarovém inženýrství rozhraní nebo datový kanál mezi dvěma entitami zpracovávajícími data (programy, vlákny, koprogramy atd.), pro který platí, že komunikaci zajišťuje v jednom směru[1] a funguje v režimu fronty[2].[3] Může se jednat o jistou programovou logikou obhospodařovaný určitý objem paměti, nebo o pouhé symbolické pojmenování způsobu předávání dat mezi dvěma entitami (alternativně k termínu fronta). Datový tok, který skrze rouru proudí, označujeme jako proud (anglicky stream), popř. proud v daném typu roury nejmenší nedělitelné jednotky — proud bitů, proud bajtů, proud zpráv (záznamů), proud objektů apod.

V souvislosti s rourami se užívá pojmů kolona a filtr. Kolonou je série entit zpracovávajících data, které jsou propojeny rourami, definici filtru splňuje každá taková entita, jež se vyznačuje tím, že neprovádí nic jiného než transformaci dat ze standardního vstupu na standardní výstup (dle svého zkonfigurování před započetím práce); filtry jsou obvykle ty entity v koloně, které nestojí na jejím začátku, výjimečně ani konci.[4] Zpracování dat více entitami v tomto smyslu je popsáno návrhovým vzorem roury a filtry; toto pojmenování má původ v principu, jímž fungují hmotné potrubní instalace (jeden směr toku) a filtry (zachycování elementů).

Programová logika, dle které (nikoli symbolická) roura funguje, odpovídá vyrovnávací paměti, resp. kruhovému bufferu — roura disponuje nějakým (obecně konstantním) objemem paměti, přičemž zdroj a odběratel dat pracují principielně různou rychlostí. Programátor roury musí ošetřit stav, kdy roura již není schopna pojmout více dat, a situaci, v níž není schopna další data poskytnout odběrateli. Kruhový buffer se užívá proto, aby nebyl ztrácen výpočetní výkon přesouváním dat v paměti roury. Aby byly minimalizovány události prázdné a plné roury, které při víceprocesorovém zpracování kolony její propustnost snižují, entitám v koloně obvykle věnuje zvláštní pozornost plánovač procesů.

Vlastnosti a využití kolony[editovat | editovat zdroj]

Důvod, proč k využití kolony přistoupit, může být v zásadě dvojí: buď může být usilováno o přehlednost a výhody spojené s absencí tvorby vysoce specializovaných programů, nebo cílem může být výkon, resp. to, jaký objem dat kolonou proteče za jednotku času.

Typickou úlohou řešenou kolonou může být filtrace seznamu položek v adresáři nebo obsahu textového souboru, příp. ještě opatření konečného výstupu čísly řádků. Celou tuto úlohu by mohl řešit jeden program, ale tento by byl jednoúčelový, pročež by pro každou příbuznou úlohu musel existovat samostatný program, s čímž by byly spojeny neúnosné náklady — bylo by nutné takové programy řádně pojmenovávat, dokumentovat, verzovat, testovat a šířit a pro uživatele by bylo mnohem náročnější si chování celého spektra takových programů osvojit, než jaké nároky pro něj představuje seznámení se s funkcionalitou jen několika víceúčelových programů, s nimiž lze díky kolonám řešit stejně širokou škálu úloh. Mezi tyto víceúčelové programy ve smyslu zmíněné úlohy patří program, který vypisuje obsah adresáře, program, jenž vypisuje obsah souboru, program, který z textového vstupu podle zadaného klíče vypouští nevyhovující řádky, a program, jenž řádky textu prefixuje jejich čísly (pořadím). Zápis řazení programů v koloně je intuitivní — jestliže uživatel pracuje se známou množinou programů, nemusí se nic nového učit, když chce provést kombinaci, s níž ještě nemá zkušenosti.

Druhým přínosem kolony je možnost diferenciálního přidělování času procesoru entitám v koloně a existence standardizovaného rozhraní pro předávání dat. Má-li celá úloha být řešena v obecném smyslu co nejefektivněji, s přihlédnutím k pokroku na poli výpočetní techniky musí být algoritmus jejího řešení formulován tak, aby v co největší míře umožnil paralelní zpracování. Pakliže je paralelní zadání využito (entity zpracovávající data jsou rozděleny mezi více procesorů, příp. jader), jsou to ty momenty, kdy jsou roury prázdné nebo plné, které celou kolonu brzdí; při prázdné rouře totiž nemůže pracovat entita z ní data odebírající a při plné entita do ní data dodávající (v obecném případě za těchto okolností nelze vytěžovat všechny procesory, popř. jádra). Okamžiky prázdných nebo plných rour jsou při rovnoměrném přidělování procesorového času způsobeny odlišnou výpočetní složitostí jednotlivých entit, a právě sdružení těchto entit do kolony, resp. oznámení operačnímu systému, že dané procesy, popř. vlákna, na sobě závisejí, jeho plánovač může přimět k tomu, aby mezi jednotlivé entity vhodnějším způsobem přerozděloval procesorový čas — úměrně tomu, jaké penzum práce každá z nich musí odvést. Standardizované rozhraní pro předávání dat potom umožňuje prakticky bez nároků na zřízení takového uspořádání data vyprodukovaná jednou entitou postupovat ke zpracování entitě běžící na jiném výpočetním systému (počítači), stejně jako několika instancím této entity (např. program řádky textu převádějící na malá písmena je jistě výpočetně méně náročný než program, který v takto upraveném textu bude hledat uživatelem definované sekvence znaků a podle nějakého, uživatelem popsaného, pravidla je nahrazovat — je možné do jedné roury jedním procesem zapisovat a dvěma, třemi, čtyřmi atd. procesy, běžícími paralelně, z ní číst — sice za cenu ztráty pořadí dat, ale to nemusí být na závadu).

Výkon kolony[editovat | editovat zdroj]

S paralelismem je neodmyslitelně spojena režie v podobě synchronizace — čím častěji program volá rutiny čtení z roury nebo zápisu do ní, jež mohou způsobit pasivní čekání (proces tzv. zablokovat), tím je režie synchronizace větší, resp. výkonnost kolony nižší. Z tohoto důvodu je žádoucí počet těchto volání minimalizovat, čehož se dosahuje zvětšováním bloku dat, která se zpracují mezi dvěma čteními nebo dvěma zápisy. Tato optimalizace bez dalších úprav však kromě větších požadavků na velikost paměti rour trpí i tím nedostatkem, že je-li dat málo, kolona se kvůli nim nebude rozbíhat, a onen malý objem dat se tak v rozumném čase od svého předání koloně nezpracuje. Proto může být příhodné každou z entit vybavit mechanismem, který z pravidla odmítat zpracovat malý objem dat bude činit přiměřené výjimky.

Vrchol optimalizace propustnosti kolony zvětšováním velikosti bloku dat, pro který kolona začne pracovat, nastává tehdy, když je paměť rour větší, než jednotlivé entity při své nejlepší vůli mohou pojmout. U nejrobustnějších operačních systémů unixového typu se k přidělení rouře nestandardně velkého objemu paměti používá zvláštní příkaz; často se nazývá buffer. Tento extrém je užitečný zejména v případě, kdy entita odebírající data z roury je výrazně pomalejší než entita data do roury vkládající. Jedná se o alternativu a současně vhodné doplnění diferenciálního přidělování procesorového času entitám v koloně.

Nestandardní typy rour[editovat | editovat zdroj]

Základní vlastnosti roury, a sice možnost předávat data bez nutnosti zabývat se pojmenováním meziúložiště, informováním entit zpracovávajících data o tomto názvu, tím, zda meziúložiště bude mít dostatečně velkou kapacitu, jeho vyprázdněním atp., byly převzaty do dalších nástrojů pro přenos dat mezi entitami zpracovávajícími data. V kontextu níže popsaných rour se roura odpovídající popisu výše nazývá roura unixová.

Roura CMS[editovat | editovat zdroj]

Roura CMS je komunikačním prostředkem v operačních systémech VM (dříve VM/CMS — odtud název) a z/OS, jež jsou produkty firmy IBM, vyvinuté pro její sálové počítače (tzv. mainframy). Tradiční prostředí mainframových operačních systémů firmy IBM je charakteristické tím, že aplikacím nenabízí žádné standardní proudy, které by byly standardizovaným rozhraním pro vstup a výstup dat. Bez specializovaných instrumentů, jakým je právě roura CMS, je nejjednodušším dostatečně robustním řešením, jímž v takovém prostředí lze předávání dat mezi programy zajistit, administrativně značně nákladné zastřešení volání dílčích víceúčelových programů jednoúčelovým programem vlastním. Roura CMS daný problém řeší jakožto jednoduduše zkonfigurovatelný řídicí prvek.[5]

Roura CMS je mnohem komplexnější než její unixový protějšek, dokáže pracovat s více vstupními a více výstupními proudy; to umožňuje i jádro Unixu, ale, jelikož je s tím spojena netriviální syntaxe a komplikované režimy tzv. blokování, jen málo unixových shellů toho využívá (potažmo tyto možnosti zprostředkovává uživatelům)[6].

Data na sálových počítačích společnosti IBM se typicky ukládají v záznamově orientovaném souborovém systému, a i pro k nim připojovaná vstupní a výstupní zařízení je příznačné, že pracují spíše v záznamovém než v proudovém režimu. Důsledkem těchto skutečností je, že s daty v CMS rourách se nakládá v záznamovém režimu; při zpracování textových souborů záznam tvoří jednu řádku textu.

Roury CMS obecně tzv. nebufferují data (nezadržují je v sobě), namísto toho je hned předávají. Nejsou proto paměťově náročné a tok dat kolonou je deterministický (pravidelný), možné paralelní zpracování ovšem nepřináší urychlení, poněvadž procesy jsou neustále tzv. blokovány. Roura CMS je tak jen organizačním elementem.

Objektová roura[editovat | editovat zdroj]

Objektová roura je roura, jejíž nejmenší nedělitelnou jednotkou je objekt.

Objektová roura je implementována kupř. ve Windows PowerShell, rozšiřitelném textovém shellu, zahrnujícím skriptovací jazyk, od společnosti Microsoft; využít ji v tomto prostředí lze pro předávání .NET objektů mezi funkcemi. Mimoto objektová roura existuje v řádkovém shellu IPython, kde je dostupná jako rozšíření ipipe, a dále je zakomponována v programovacím jazyku Limbo, v němž nese název kanál (anglicky channel).

Roura v desktopových prostředích[editovat | editovat zdroj]

Roury se vyskytují také jako standardní prvek některých desktopových prostředí, kde slouží jako dočasné úložiště výstupních dat jednoho programu pro jejich předání do programu jiného. Roura je v takovém případě součástí funkce Uložit jako (anglicky Save As)[7], jejíž dialogové okno obsahuje ikonu, kterou vedle libovolné složky v souborovém systému s oprávněním zápisu, jako je to ve všech moderních správcích souborů možné s existujícím souborem, lze přetáhnout (provést operaci Drag and Drop) na zástupce (spouštěč) nebo spustitelný soubor kterékoli aplikace, načež zvolený program data obdrží na svůj standardní vstup; tím je nabyde, aniž by tato v mezičase bylo nutné uchovat v souboru adresovatelném v souborovém systému (právě to je mechanismus roury). Tato vymoženost konkuruje operaci „Zkopíruj a vlož“ (anglicky Copy and Paste), realizované tzv. schránkou.

Výše popsaným výdobytkem disponují např. desktopová prostředí RISC OS nebo ROX Desktop.

Stinnou stránkou tohoto typu roury, která se považuje za hlavní překážku většího rozšíření, je fakt, že zástupci programů, popř. jejich spustitelné soubory, pro uživatele z dialogového okna v obecném případě, tj. bez toho, aby na toto konto uživatel vyvíjel zvýšené úsilí, nejsou až tak snadno dosažitelné.

XML roura[editovat | editovat zdroj]

Dále bylo pojetí roury zahrnuto do značkovacího jazyka XML, jehož vývoj přinesl XML roury, umožňující zasahovat do proudu dat ve formátu XML.[8]

Jiné významy[editovat | editovat zdroj]

Na roury a filtry lze nahlížet jako na formu funkcionálního programování — proudy bajtů zaujímají roli datových objektů a je možné je považovat za specifický typ monád pro vstup a výstup dat.

Koncepce roury je rovněž ústředním prvkem frameworku pro vývoj webových aplikací Apache Cocoon.

Historie[editovat | editovat zdroj]

První kolonu vymyslel a vytvořil Douglas McIlroy, jenž navrhl taktéž první řadu Unixových skořápek. Unixové skořápky velmi napomohly popularitě operačního systému Unix; mnozí je považovali za první příklad softwarové komponenty.

Klíčovou myšlenkou se stalo koncept přenést do dalších operačních systémů. Došlo k tomu např. u BeOS, Mac OS X, MS-DOSu, OS/2 a Windows NT.

Související články[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

  1. Existují i roury se zpětným kanálem a plně obousměrné roury, dle základní definice je však roura jednosměrná.
  2. Charakteristickým znakem fronty je, že odběratel data přebírá v tom pořadí, ve kterém je zdroj vložil.
  3. Roura jakožto jednosměrný komunikační kanál mezi entitami zpracovávajícími data, který pracuje v režimu fronty, je základním typem interprocesní komunikace.
  4. To, zda daná entita je filtrem, či nikoli, je nutno posuzovat na základě funkce této entity v konkrétní koloně.
  5. Jiným sofistikovaným řešením přenosu dat mezi programy běžícími na operačním systému VM nebo z/OS je využití interpretovaného programovacího jazyka Rexx. Ten standardní proudy obsahuje.
  6. Unixové shelly, jež práci s více vstupními a výstupními proudy podporují, tak činí skrze uvolnění pravidel pro přiřazení souborových deskriptorů.
  7. Dialogová okna typu Uložit jako (anglicky Save As) jsou součástí desktopových prostředí; programátoři aplikací jejich vzhled a možnosti nenavrhují, nanejvýš je konfigurují.
  8. XML roury se popisují jazykem pro transformace XML, který je obsahem W3C doporučení XProc.

V tomto článku byl použit překlad textu z článku Pipeline (software) na anglické Wikipedii.