# XBUP - Proudové zpracování

### Úvod

Tento dokument je součástí dokumentace projektu eXtensible Binary Universal Protocol. Obsahuje popis implementace proudového zpracování.

O úroveň výše

### Obsah

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

### 1. Proudové zpracování

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í.

### 2. Aspekty proudového zpracování

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í:

- Typ tokenu - Co je jednotkou přenášených dat
- Způsob předávání dat - Jakým způsobem jsou položky proudu předávany jednotlivých aplikacím.
- Řízení toku dat - Jakým způsobem je řízena vzájemná výměna dat na komunikačním kanále.
- Možnosti pohybu v proudu - Proud dat může nabízet volitelně možnost změny pozice ve zpracovávaném proudu položek.

### 2.1. Typ tokenu

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ů:

- Binární data - předávány jsou jednotlivé bajty(případně bity) informace.
- Parsovací tokeny - předávány jsou jednotlivé položky tak jak jsou definovány na jednotlivých úrovních protokolu.
- Bloky - předávány jsou celé jednotlivé bloky tak jak jsou definovány.

### 2.1.1. Třídy binárních dat

Jednotlivé tokeny jsou popsány v dokumentu Bloková struktura, případně v popisu implementace pull parseru.

Tokeny se liší podle úrovně protokolu.

### 2.1.2. Třídy blokového zpracování

Další možností je předávání celých bloků protokolu jak je popsáno v hrubší gramatice. Bloky jsou tří typů:

- Atributový blok
- Datový blok
- Ukončovacím token

Tento druh proudu je definován až od úrovně 1. a bloky se liší dle použité úrovně.

### 2.2. Způsob předávání dat

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:

- Použití širokého rozhraní - jednou z možností jak předávat položky různého typu je vytvořením samostatné přístupové metody rozhraní pro každý typ položky. Tento přístup má několik výhod i nevýhod.
- Odlišení typem parametru - druhou možností je použití jediné přístupové metody s odlišením typu položky proudu pomocí parametrů.

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.

### 2.2.1. Závislost typu bloku

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.

### 2.2.2. Obor rozsahu

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:

- Předávaná data jsou nezávislá (obsahují úplné hodnoty)
- Předávaná data obsahují ukazatele v lokálním oboru rozsahu - to je výhodné například pro úsporu místa při přenosu rozsáhlých datových objektů (copy-on-write).
- Předávaná data obsahují ukazatele na data s širší platností (např. v lokální síti, případně internetu) - tentokrát je limitujícím faktorem dostupnost daného prostředku zdrojů dat.

### 2.3. Řízení toku dat

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í:

- Bez řízení toku - Jednou z možností je tok dat bez řízení doručování, tedy nespolehlivé doručování.
- Řízení toku po tokenech - Řízení toku po jednotlivých tokenech (nebo také technika RTS/CTS) zaručuje doručení každého jednotlivého tokenu a vyžaduje čekání na doručení. Tento způsob zahrnuje také předání řízení při volání metody.
- Řízení po shlucích - Kombinací obou předchozích je možné přenášet shluky tokenů pevné délky nebo pevné struktury. (Cluster)
- Předávání paralelním zpracováním - Obdoba řízení po tokenech, pouze řešena s podporou souběžného zpracování. (Piped)

### 2.4. Možnosti pohybu v proudu

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í:

- Skok na začátek proudu (reset, rewind) - Návrat na začátek proudu s možností opětovného zpracování dat.
- Přeskočení dat (skip) - Přeskočení zadaného počtu tokenů v proudu, případně celé struktury tokenů (bloku, podstromu...). Uspoří přenosovou linku místo toho, aby musely být data přeskočeny na straně klienta.
- Přesun na pozici (seek, position) - Skok na zadanou pozici v datovém proudu. Pozice může být adresována například indexem tokenu, nebo cestou ve struktuře dat.

### 3. Transformace datových proudů

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.

### 3.1. Transformace úrovní

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.

### 3.2. Transformace typu tokenu

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.

### 3.3. Transformace závislostí

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.

### 3.4. Transformace řízení toku

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.

### 3.4.1. Iterační transformace

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ě.

### 3.4.2. Rozkládací transformace

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ě.

### 3.4.3. Paralelní rozkládání

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)

### 3.5. Transformace možností pohybu

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.

### 3.6. Transformace strany řídící přenos

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í.

### 4. Integrace proudové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.

### 5. Odkazy

Seznam zdrojů, literatury a relevantních odkazů:

Point-to-Point - Dvoubodový datový spoj [http://en.wikipedia.org/wiki/Point-to-point_(telecommunications)]
Proudové zpracování - Programátorská technika proudového zpracování [http://en.wikipedia.org/wiki/Stream_processing]

Homepage: http://xbup.sf.net
License: GNU Free Documentation License (FDL)
Latest update: 2008-04-05