Lekce 2 - Přenos bitů aneb od pantáty vedou dráty...
V minulé lekci, Principy fungování počítačů aneb jak to vlastně funguje, jsme si vysvětlili, proč v počítačích
používáme 0
a 1
neboli bity. Dnes se na tento
přenos podíváme trochu hlouběji. Nyní jsme totiž v situaci, kdy víme
CO posílat, ale ještě nemáme jasno v tom JAK to
posílat.
Jak již jsme si řekli, data jsou reprezentována napětím. Nestačí nám
však mít jen jeden datový kanál (drát), který by vše obstaral sám.
Nevěděli bychom, jak s napětím pracovat či jak ho správně detekovat.
Pokud máme všude dráty, nastává jeden drobný, nepěkný, fyzikální jev.
Dráty sami vytvářejí nějaké napětí díky okolí, v počítači, kde
máme drát vedle drátu, se tím pádem tvoří hromada šumu, který chceme
odstranit. Šum nám totiž může způsobit, že chceme poslat 0
,
ale pošle se 1
či naopak. Nabízí se nám proto dvě možná
řešení:
Řešení pomocí uzemnění
Mezi vysílajícím a příjemcem budou alespoň 3 vodiče. Jeden z nich je
zem (GROUND), tzn. dostaneme referenční napětí vůči zemi a další 2 jsou
data jedním směrem a data druhým směrem (TDx a RDx). Tento, tzv. sériový
přenos, se používal dříve např. RS-232 linkou. Minule jsme si říkali,
že se někdy pro rozlišení 0
a 1
používá tzv.
floating stav neboli šedá zóna, která neznamená ani 0
ani
1
. Uvidíme, že kromě pojistky se našlo i další využití
tohoto 3. stavu.

Řešení pomocí diferenčního přenosu
Diferenční přenos je to kvůli tomu, že napětí dostáváme z diference,
tj. rozdílu mezi napětími vodičů. Náš hlavní přenašeč informace bude
vodič p_1
. Tím chceme poslat bite, třeba 1
. Vezmeme
si k němu druhý vodič p_2
a tím pošleme 0
. Víme
jistě, že nikdy se p_1
nerovná p_2
. Mějme tedy
výslednou hodnotu v
takovou, že v
se určí jako
p_1 – p_2
, takže bude-li v
kladné, vysíláme
1
, bude-li záporná, vysíláme 0
. Víme, že mohou
nastat pouze 2 varianty:
p_1 = 1, p_2 = 0 , p_1 - p_2 > 0 ---> chtěli jsme poslat 1. p_1 = 0, p_2 = 1 , p_1 - p_2 < 0 ---> chtěli jsme poslat 0.
Zmatek začíná
Nyní umíme poslat jeden bit, ale v dnešních gigabytech je to příliš
málo. Posuneme se tedy dále. Je potřeba si udělat drobnou exkurzi do
binární soustavy. Pro nás bude naprosto zásadní si uvědomit, co vlastně
znamená, že se přenáší n
bitů. Posíláme něco, co se dá
reprezentovat n
číslicemi v binární soustavě. V čem začíná
zmatek? Zkuste si poslat čísla 1
, pak 0
a nakonec
2
. V binární soustavě pošleme tedy 1010
. Jak to
ale druhá strana interpretuje? Znamená to 1 – 0 – 1 – 0
,
nebo 2 – 2
, nebo 5 – 0
, nebo 8
? Jak
to má druhá strana poznat? Proto se musíme dohodnout na nějakém formátu,
jak posílat jednotlivé bloky. Řešením pro nás bude posílat data po
bytech, tedy po osmicích.
Vsuvka
1B (byte, česky bajt) je 8b (bites, česky bitů). Jsou bohužel i bajty,
které mají 7 bitů, ale ty se již téměř nepoužívají. Pokud jste někdy
slyšeli o ASCII tabulce (později se k ní dostaneme), tak všechny
mezinárodní symboly jsou indexovány od 0
do 127
,
protože dříve byly znaky z ASCII posílány v bitech po 7 bitech. O tom ale
více později.
10010010100100000110101101010010
lze tedy poslat jako
10010010
, 10010000
, 01101011
,
01010010
.
Ať už chceme poslat jedno velké číslo, nebo něco jiného, můžeme přenést informaci jako "v dalších dvou blocích pošleme číslo". Výhoda je, že vím přesně, kdy přijímáme jaké bity a víme, že po osmi bitech končí blok.
Zmatek pokračuje
Nyní, když víme, jak chceme vytvářet bloky, přijde zpoza rohu
nečekaný problém - budeme je číst od začátku nebo od konce? Jaké bude
pořadí bitů, tzv. Bite Order? Zapíšeme číslo 4
jako
100
nebo jako 001
? Budeme zapisovat na začátku
nejméně významný bit (tzv. Least Significant Bit First) či naopak ten
nejvýznamnější bit (tzv. Most Significant Bit First). 4
můžeme rozložit na 1*2^2 + 0*2 + 0 -> 100
. V této situaci je
nejdůležitější ten bit, který násobíme nejvyšší mocninou dvojky. Ač
se to zdá jako hloupost, uvědomme si, že pro velká čísla nás možná
budou zajímat jen např. poslední 3 bity, takže je logičtější posílat
počítači čísla v LSB First.
Když už jsme si vyjasnili, zda chceme mít bity v MSB či LSB First, a tím pádem jak nám bity chodí, rádi bychom věděli, kolik jsme těch bitů vlastně dostali.
Co to vlastně přišlo?
Představte si, že někdo chce posílat samé nuly. To se docela špatně detekuje. Žádná změna signálu, maximálně nějaký divný šum odvedle...
Nejjednodušším způsobem řešení je mít pevně danou délku bitu neboli
v přijímacím i vysílacím zařízení mít dohodnutou dobu, za kterou se
přenese bit. Představte si líného hlídače parkoviště, který má
počítat auta, co přijedou, a většinu času si čte noviny. Jednou za čas
mu zazvoní budík zvedne hlavu a když uvidí auto, zapíše si 1
.
Když nikoho neuvidí, zapíše si 0
. Dejme tomu, že budík zvoní
pravidelně i v počítači. Ještě bychom nakonec potřebovali, aby si někdo
všiml, že jsme začali posílat 0
, neboli, že se změnil stav
linky z "nevysílám" na "vysílám 0
". To se udělá tak, že se
pošle jakoby 0
. bit, který nic nedělá, jen říká – hele,
teď dávej pozor. Na konci už nepotřebujeme mít další bit, který nám
řekne, že přenos končí, protože máme pevně danou délku bytu.
Celý floating přenos vypadá takto:

Tento přenos je však poměrně neefektivní a používal se pro výše zmíněnou linku RS-232. V čem je problém? Celou dobu byla ve floating stavu, takže je třeba poslat Start bit, sdělit v jakém pořadí posíláme bity, délku a nakonec dávat velmi dobrý pozor, aby se hodiny na opačných stranách přenosu nerozešly. Nakonec ještě vrátit linku do floating stavu. Pokud tuto režii děláme při každém bytu, jakmile si posíláme někam film, to abychom si udělali kávu a přečetli Babičku...
Vylepšení procesu
Jak celý proces zlepšit? Můžeme si držet informaci o hodinovém signálu bokem. Budeme mít speciální kabel, který bude pouze vysílat hodinový signál. Odpadne nám starost se začátkem a koncem. Jakmile běží hodinový signál, čteme. Neběží, nečteme. Tuto možnost používáme při diferenčním přenosu.

Na závěr zmatek vrcholí
Kromě tzv. Bite Order můžeme chtít kontrolovat ještě tzv. Byte Order,
neboli který byt v sérii se přenese první. Opět můžeme dělit na Little
endian a Big endian - neboli co je na konci přenosu. Zda je na konci nejméně
důležitý byte / nejvíce důležitý byte. Například pokud ukládáme znak
jako 2 bajty (třeba v UTF-16 znakové sadě), kde znak a
má v
decimální soustavě hodnotu 97
, na jeho uložení potřebujeme 2
bajty. V jednom bajtu bude uložená hodnota a
, v druhém bude jen
0
pro doplnění. Proč, to se dozvíme v dalších lekcích. Teď
je pro nás však důležité, že můžeme a
uložit v Little
endian jako 97 00
, nebo v Big endian jako 00 97
. Je
tedy opět potřeba si předem vyjasnit pořadí. Hlavně se nenechat zmást. A
mohu-li navnadit na příště, lekci Reprezentace čísel v počítači, zmatky zdaleka nekončí. Bez nich
by to však nebyla taková zábava
Oddechová část anebo počítání mocnin
Nyní se ještě jednou podíváme na mocniny čísla 2
. Znát
mocniny tohoto čísla jsou velmi praktické. 8b je 1B. A jak je to dál? To
záleží. Pokud jsme mezi "svými" – pokud nejsme prodavači pevných disků,
tak 1kB je 1024B, 1GB je 1024 MB atd... Samozřejmě, pokud jsme prodejci
disků, je pro nás 1MB něco jako 1000kB a pevný disk se nám zmenšil o
očekávaných 24kB. Jako obchodní technika to není až tak špatné. Všechny
ostatní fyzikální veličiny jako např. kg, km apod. pracují v desítkové
soustavě, proč by chudáci uživatelé měli pracovat v něčem jiném... Nu,
takový je svět.