Roura (Unix)![]() Unixová roura (anglicky pipeline) je jednoduše použitelným prostředkem pro propojení výstupu jednoho procesu (spuštěného programu) se vstupem druhého. Lze například propojit výstup příkazu ls -l s příkazem grep, který propustí pouze řádky začínající znakem d, takže zůstanou informace o podadresářích aktuálního adresáře: $ ls -l | grep ^d
Použití nepojmenované (anonymní) roury (Unix poskytuje také pojmenované roury) doplňuje možnost přesměrování standardních proudů do nebo ze souboru, jehož jméno stanovuje uživatel až v okamžiku zadání příkazu, o velmi mocný prostředek, který zároveň zpřístupňuje multitasking. Do kolony propojit i více než dva procesy a tak vytvářet nové vlastnosti: $ man cp | tr -cs '[:alnum:]' '\n' | sort | uniq -c | sort -rn | less
(příkaz zobrazuje po jednotlivých obrazovkách počty výskytů jednotlivých slovních tvarů v manuálové stránce příkazu cp setříděné od slov s nejvyšším počtem výskytů). Unixové roury jsou nápaditou formou a implementací staršího konceptu softwarových rour, která byla s určitými omezeními převzata do dalších operačních systémů (DOS, Microsoft Windows, OpenVMS). ImplementaceSoftwarové roury jsou rozhraním nebo datovým kanálem mezi dvěma entitami zpracovávajícími data (programy, vlákny, koprogramy atd.), jenž komunikaci zajišťuje v jednom směru a funguje v režimu fronty[1]. Unixová roura, tak jako jiné softwarové roury, představuje pohodlný prostředek realizace přesměrování dat z výstupu jedné entity zpracovávající data na vstup jiné. Od svých mladších derivátů se unixová roura nejvýrazněji odlišuje tím, že je s ní neodmyslitelně spojeno použití vyrovnávací paměti (bufferu), díky čemuž tato vedle bezobslužného a bezúdržbového postupování dat mezi programy[2], jež další typy roury převzaly především, nabízí také výkonovou optimalizaci, tedy navýšení objemu dat, který kolonou – skupinou procesů zřetězených rourami – proteče za jednotku času.[3] Unixové roury se dělí na anonymní a pojmenované; anonymní jsou starší než pojmenované a nazývají se též nepojmenované, konvenční nebo tradiční. Pojednává-li se o rouře, aniž by tato byla rozvita přívlastkem, a je-li z kontextu zřejmé, že řeč je o rouře unixové, je s vysokou pravděpodobností myšlena anonymní (unixová) roura. Roura je (v unixových systémech všeobecně) implementována jako kruhový buffer o celkové velikosti 64 KiB, který je po 4 KiB rozdělený na šestnáct jednotek. Čtení a zápis do roury jsou vybaveny synchronizací, která proces tzv. zablokuje v případě, kdy není co číst, resp. kam zapisovat. Velmi těsné propojení rour se souborovým systémem – unixové systémy se každou entitu snaží abstrahovat jako soubor, nebo jako proces – do roury umožňuje zapisovat a z ní číst těmi systémovými voláními, jimiž se provádí zápis do souboru a čtení z něj. Nápadný rozdíl oproti práci se soubory spočívá v tom, že anonymní roura má oddělený souborový deskriptor pro zápis od souborového deskriptoru pro čtení – s anonymní rourou jsou propojeny souborové deskriptory dva. Příčinu této odlišnosti lze s úspěchem hledat v tom, že zatímco se souborem lze plnohodnotně pracovat prováděním jen čtení nebo jen zápisu, upotřebení anonymní roury má smysl jen tehdy, když se čte i zapisuje (k datům by se později nebylo možné dostat, jelikož by se na ně nebylo jak odkázat). Další vlastností, jež práci s rourami odlišuje od práce se soubory, je fakt, že s rourou se zachází jako se zařízením znakovým, zatímco se souborem jako se zařízením blokovým. V důsledku to znamená, že zápis do roury nelze opravit či aktualizovat (jednou předaná data přepsat) a data přečtená z roury přečíst znova (již byla odebrána). Anonymní rouraAnonymní roury nemají vlastní identifikátor; přístupné jsou toliko prostřednictvím souborových deskriptorů, pročež je možné je využít jen ke komunikaci mezi procesy, které jsou (přímými nebo nepřímými) potomky procesu, jenž je vytvořil, a tímto procesem (mezi libovolnou dvojicí procesů z této množiny) – jiným způsobem, než skrze vytvoření potomka (systémové volání K anonymním rourám se váže znak svislé čáry („|“) – právě jím uživatel shellu sděluje, že má zájem o použití anonymní roury; po levé a pravé straně se potom nacházejí názvy a parametrizace programů, jež k rouře mají přistupovat – nalevo je jmenována entita do roury data vkládající a napravo entita z roury data odebírající. Proces shellu přitom plní roli rodičovského procesu, mezi nímž a jehož potomky je komunikace anonymní rourou možná pouze, který žádá o vytvoření procesů za účelem vykonání programů v koloně podle předpisu uživatele; součástí jeho agendy je připojení standardního výstupu do roury zapisujícího programu na souborový deskriptor roury pro zápis a svázání standardního vstupu z roury čtecího programu se souborovým deskriptorem roury pro čtení. S anonymními rourami se pojí taktéž výraz skupina procesů. Procesy participující v koloně patří do téže skupiny procesů, aby celou kolonu bylo možné snadněji spravovat, kupř. stanovovat priority pro plánování na procesor; v rámci skupiny procesů operační systém rovněž může hledat tzv. úzká hrdla, a právě je co do priority s výhledem optimalizace výkonu celé kolony v přidělování procesorového času zvýhodnit. Jednoduchý příklad$ history | grep "^java " | wc -l
Příkaz vypíše, kolikrát (za sledovanou historii – např. posledních 500 příkazů) uživatel spustil program Program Program Další jednoduchý příkladNíže uvedený příkaz demonstruje typické použití programu $ ls -l | less
Program Složitější příklad$ wget -q -O '-' 'http://en.wikipedia.org/wiki/Pipeline_(Unix)' | \
sed 's/[^a-zA-Z ]/ /g' | \
tr 'A-Z ' 'a-z\n' | \
grep '[a-z]' | \
sort -u | \
comm -2 -3 '-' '/usr/share/dict/words'
Zadání směřuje k odhalení překlepů na webové stránce, specifikované URL. Následuje popis jednotlivých částí příkazu:
Znak zpětného lomítka („\“) bezprostředně předcházející odřádkování interpretu příkazů sděluje, že zadání příkazu nebylo ukončeno (jen se, kvůli přehlednosti, ve formulaci jeho další části pokračuje na následujícím řádku; odřádkování je kromě postoupení příkazu ke zpracování také funkce klávesy ↵ Enter). HistorieS koncepcí anonymní unixové roury, jež byla poprvé popsána v manuálových stránkách Unixu verze 3, přišel Douglas McIlroy; již první návrh obsahoval znak svislé čáry. První implementaci provedl Ken Thompson v r. 1973, a to do unixového shellu Thompson shell.[11] Později bylo schéma převzato do dalších operačních systémů, např. AmigaOS, BeOS, Mac OS X[12], MS-DOSu, OpenVMS, OS/2 nebo Windows, a stalo se návrhovým vzorem roury a filtry. Pojmenovaná roura Podrobnější informace naleznete v článku Pojmenovaná roura.
Pojmenované roury jsou řešením meziprocesové komunikace, které má prvky předávání dat anonymní rourou i vlastnosti provádění téže činnosti cestou řádných souborů – pojmenované roury jsou globálně adresovatelné (mají v celém systému unikátní identifikátor), a jejich jména je třeba spolupracujícím procesům předávat, ale není nutné se starat, aby pokus o uložení dat do nich neselhal z důvodu nedostatku volného místa na diskové jednotce, a úložiště (nikoli ve smyslu řádného čtení) vyprazdňovat. Vznik a zánik pojmenované roury není vázán životním cyklem kteréhokoli procesu, který z ní může číst, nebo do ní zapisovat; probíhá zcela nezávisle. Jako položka v souborovém systému pojmenovaná roura podléhá koncepci přístupových práv. Pojmenované roury jsou vhodné pro jiné úlohy, než roury anonymní. OdkazyReference
Související články
Externí odkazy
|