XBUP - Proudové zpracováníTento dokument je součástí dokumentace projektu eXtensible Binary Universal Protocol. Obsahuje popis implementace proudového zpracování.
1. Proudové zpracování
2. Aspekty proudového zpracování
2.1. Typ tokenu
2.1.1. Třídy binárních dat
2.1.2. Třídy blokového zpracování
2.2. Způsob předávání dat
2.2.1. Závislost typu bloku
2.2.2. Obor rozsahu
2.3. Řízení toku dat
2.4. Možnosti pohybu v proudu
3. Transformace datových proudů
3.1. Transformace úrovní
3.2. Transformace typu tokenu
3.3. Transformace závislostí
3.4. Transformace řízení toku
3.4.1. Iterační transformace
3.4.2. Rozkládací transformace
3.4.3. Paralelní rozkládání
3.5. Transformace možností pohybu
3.6. Transformace strany řídící přenos
4. Integrace proudového zpracování
5. Odkazy
Pro práci s daty reprezentovanými protokolem XBUP je vhodné nabídnout programátorům možnost využít techniky datových proudů. V běžných programovacích jazycích bývají často tyto techniky už implementovány, a to především pro zpracování sekvence bajtů. Nativní struktury je možné buď přímo rozšířit pro potřeby protokolu, nebo je alespoň využít jako dobře optimalizovaný základ pro výstavbu implementace. To může přinést řadu výhod, jako například urychlení vývoje, propojení s programy, které proudové zpracování podporují.
Datové proudy je možné rozlišit podle typu položek datového proudu a způsobu řízení toku. Jednotlivé aspekty vedou k možným hierarchiím implementací a to buď podle použití odlišných typů položek na odpovídajících úrovních protokolu, či podle granularity předávaných položek. Také je možné místo některých položek přenášet odkazy na jejich definice, které případně mohou být taktéž zahrnuty do proudu.
Z aspektů se zaměříme na následující:
Předávané položky (tokeny) tvoří jakousi jednotku datového proudu. Základní jednotkou informace je bit, který lze použít i jako token, ale vhodnější je použití shluku bitů, například bajt, což mimo jiné zjednodušuje adresování na zařízeních, které tímto způsobem data zarovnávají. Pro potřeby protokolu rozlišujeme především následující dva typy tokenů:
Jednotlivé tokeny jsou popsány v dokumentu Bloková struktura, případně v popisu implementace pull parseru.
Tokeny se liší podle úrovně protokolu.
Další možností je předávání celých bloků protokolu jak je popsáno v hrubší gramatice. Bloky jsou tří typů:
Tento druh proudu je definován až od úrovně 1. a bloky se liší dle použité úrovně.
Způsob, jakým jsou data předávány je z velké části implementační záležitostí. Z možných řešení je třeba zmínit především:
V případě předávání pomocí odkazů je vhodné také rozlišovat, zda je předávána kopie, či odkaz na používanou hodnotu, ať už jako ukazatel do paměti, či do média jiného typu, či zdroji proudu přes proxy rozhraní, a zda je povoleno tuto hodnotu měnit. Jedná se však do značné míry o optimalizační záležitost.
Od úrovně 1 je definován typ bloku. Ten je předáván jako token samostatného typu, který musí předcházet (i prázdné) sekvenci atributů. Kromě možnosti předávat typ bloku jako dvojici hodnot, je možné předávat typ bloku odkazem do katalogu nebo jiné deklarace typu. Typy, které jsou závislé na hlavičce proudu, je možné při ukládání převést na odpovídající číselné hodnoty pomocí hlavičkou vygenerované tabulky. Pro odkazy do katalogu typů může být nutné při ukládání takových dokumentů provést nejprve sesbírání těchto typů a přidání odkazů do katalogu do hlavičky dokumentu.
Dalším implementačním detailem je i obor rozsahu hodnot. V případě, že jsou data přenášena mezi aplikacemi, je nutné zvážit, zda ukazatele nejsou závislé na konkrétním vlákně aplikace, či běžící instanci operačního systému. Tuto závislost je při přenosu mezi počítači odstraňovat pomocí proxy-stub nebo-li marshalingu (terminologie Microsoft COM). Možné případy jsou:
Pokud se na data podíváme z pohledu předávání informace, lze rozlišovat také způsob řízení předávání dat v datovém toku. Komunikace proudu může být řízena buď příjemcem, nebo odesílatelem. (Master/Slave), případně také neřízena (tzv. negarantovaný přenos). Při přenosu pak mohou být použity rozličné metody řízení:
Kromě základního sekvenčního zpracování může datový proud nabídnout různé operace změny polohy ve zdrojovém souboru (řízení změny obsahu). Jedná se například o následující:
Jednotlivé typy datových proudů lze mezi sebou transformovat. Lze tak například do proudu přidávat potřebné schopnosti za cenu náročnějšího zpracování. Některé transformace jsou přímočaré a to často i obousměrně, jako například převod mezi typy předávaných položek. Některé transformace je také možné vytvořit skládáním transformací jednodušších.
Mezi základní transformace dat patří možnost převodu mezi jednotlivými úrovněmi protokolu XBUP.
Obecně platí, že převod na nižší úroveň je přímočará, neboť závislé tokeny vyšší úrovně je možné na nižší úroveň převádět přímo. Transformace na vyšší úroveň vyžaduje testování správného pořadí a rozsahu platných hodnot tokenů a může tudíž dojít k vyjímce způsobené neplatnou kombinací těchto podmínek.
Mezi nejjednodušší transformace patří převod mezi širokým a úzkým rozhraním. Další možností je například rozklad či spojení tokenů do bloku.
Transformace na nezávislé typy je jednoduchá. Rozpozná se deklarační hlavička a jako typ bloku se pak vygeneruje odpovídající třída.
Převod na nezávislé typy bloku je náročnější díky tomu, že deklarační hlavičku je nutné znát před přenosem vlastních dat. Pokud je k dispozici deklarační rozhraní, je možné jej použít a vlastní typy bloků pak převádět dohledáním v deklaraci. V opačném případě je nutné data projít a vytvořit deklarační záznam a ve druhém průchodu.
Převody mezi některými způsoby řízení toku může v nějhorším případě vyžadovat až vyrovnávací paměť velikosti přenášených dat.
Iterační transformace v cyklu čte jednotlivé přijímané bloky a dále je posílá jako kompaktní shluk. Vyžaduje vyrovnávací paměť pro vytvoření shluku. Tato transformace se používá také při převodu na vyšší úrovně protokolu, kdy bývají jednotlivé události definovány shluky událostí nižší úrovně.
Opakem iterační transformace je rozkládání přijatého shluku na jednotlivé menší shluky či samotné události a to případně i nižší úrovně.
Při paralelním řízení toku je používáno obousměrné řízení toku, které umožňuje provádět některé operace efektivněji. (Todo)
Zatímco odebírání schopností je technicky zbytečné a většinou je řešeno pomocí rozhraní, která jsou při vlastním použití ignorovány, přidávání schopností řízení toku je obtížné. V nejhorším (a velmi častém) případě se neobejde bez vytvoření kopie datového proudu. V některých případech si vystačíme pouze s kopií doposud zpracovaných dat.
Mezi oběma variantami řízení přenosu je možné převádět. Převod proudu na proud stejného typu s opačným způsobem řízení však vyžaduje přijetí celého proudu do vyrovnávací paměti, nebo použití paralelního zpracování.
Podobně jako v případě transformační vrstvy protokolu, je i zde vhodné umožnit vytváření vlastních modulů pro transformace datových proudů. To je možné v případě objektových programovacích jazyků provádět buď zděděním tříd, implementací vybraných rozhraní nebo je možné pro tyto účely vytvořit pomocné rozhraní, které by umožňovalo připojovat potřebné moduly pro transformaci datových proudů za běhu aplikace.
Seznam zdrojů, literatury a relevantních odkazů:
Point-to-Point - Dvoubodový datový spoj [http://en.wikipedia.org/wiki/Point-to-point_(telecommunications)]
Homepage: http://xbup.sf.net
License: GNU Free Documentation License (FDL)
Latest update: 2008-04-05