2. diel - Prenos bitov aneb od pántov vedú drôty ...
V minulej lekcii, Princípy fungovania počítačov alebo ako to vlastne funguje , sme si vysvetlili, prečo v počítačoch
používame 0
a 1
čiže bity. Dnes sa na tento prenos
pozrieme trochu hlbšie. Teraz sme totiž v situácii, keď vieme CO
posielať, ale ešte nemáme jasno v tom AKO to posielať.
Ako už sme si povedali, dáta sú reprezentovaná napätím. Nestačí nám
však mať len jeden dátový kanál (drôt), ktorý by všetko obstaral sám.
Nevedeli by sme, ako s napätím pracovať či ako ho správne detekovať. Ak
máme všade drôty, nastáva jeden drobný, nepekný, fyzikálny jav. Drôty
sami vytvárajú nejaké napätie vďaka okolia, v počítači, kde máme drôt
vedľa drôtu, sa tým pádom tvorí hromada šumu, ktorý chceme odstrániť.
Šum nám totiž môže spôsobiť, že chceme poslať 0
, ale
pošle sa 1
či naopak. Ponúka sa nám preto dve možné
riešenia:
Riešenie pomocou uzemnenie
Medzi vysielajúcim a príjemcom budú aspoň 3 vodiče. Jeden z nich je zem
(GROUND), tzn. dostaneme referenčné napätie voči zemi a ďalšie 2 sú dáta
jedným smerom a dáta druhým smerom (TDX a RDX). Tento, tzv. Sériový prenos,
sa používal predtým napr. RS-232 linkou. Minule sme si hovorili, že sa
niekedy pre rozlíšenie 0
a 1
používa tzv. Floating
stav čiže šedá zóna, ktorá neznamená ani 0
ani
1
. Uvidíme, že okrem poistky sa našlo aj ďalšie využitie
tohto 3. stave.
Riešenie pomocou diferenčného prenosu
Diferenčný prenos je to kvôli tomu, že napätie dostávame z diferencie,
tj. Rozdielu medzi napätiami vodičov. Náš hlavný prenášač informácie
bude vodič p_1
. Tým chceme poslať bite, treba 1
.
Vezmeme si k nemu druhý vodič p_2
a tým pošleme 0
.
Vieme určite, že nikdy sa p_1
nerovná p_2
. Majme
teda výslednú hodnotu v
takú, že v
sa určí ako
p_1 – p_2
, takže ak bude v
kladné, vysielame
1
, ak bude záporná, vysielame 0
. Vieme, že môžu
nastať iba 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.
Zmätok začína
Teraz vieme poslať jeden bit, ale v dnešných gigabajtoch je to príliš
málo. Posunieme sa teda ďalej. Je potrebné si urobiť drobnú exkurziu do
binárnej sústavy. Pre nás bude úplne zásadné si uvedomiť, čo vlastne
znamená, že sa prenáša n
bitov. Posielame niečo, čo sa dá
reprezentovať n
číslicami v binárnej sústave. V čom začína
zmätok? Skúste si poslať čísla 1
, potom 0
a
nakoniec 2
. V binárnej sústave pošleme teda 1010
.
Ako to ale druhá strana interpretuje? Znamená to
1 – 0 – 1 – 0
, alebo 2 – 2
, alebo
5 – 0
, alebo 8
? Ako to má druhá strana spoznať?
Preto sa musíme dohodnúť na nejakom formáte, ako posielať jednotlivé
bloky. Riešením pre nás bude posielať dáta po bytoch, teda po Osmica.
Vsuvka
1B (byte, česky bajt) je 8b (bites, česky bitov). Sú bohužiaľ aj bajty,
ktoré majú 7 bitov, ale tie sa už takmer nepoužívajú. Ak ste niekedy
počuli o ASCII tabuľke (neskôr sa k nej dostaneme), tak všetky
medzinárodné symboly sú indexované od 0
do 127
,
pretože skôr boli znaky z ASCII posielané v bitoch po 7 bitoch. O tom ale
viac neskôr.
10010010100100000110101101010010
možno teda poslať ako
10010010
, 10010000
, 01101011
,
01010010
.
Či už chceme poslať jedno veľké číslo, alebo niečo iné, môžeme preniesť informáciu ako "v ďalších dvoch blokoch pošleme číslo". Výhoda je, že viem presne, kedy prijímame aké bity a vieme, že po ôsmich bitoch končí blok.
Zmätok pokračuje
Teraz, keď vieme, ako chceme vytvárať bloky, príde spoza rohu nečakaný
problém - budeme ich čítať od začiatku alebo od konca? Aké bude poradie
bitov, tzv. Bite Order? Zapíšeme číslo 4
ako 100
alebo ako 001
? Budeme zapisovať na začiatku najmenej významný
bit (tzv. Least Significant Bit First) či naopak ten najvýznamnejší bit
(tzv. Most Significant Bit First). 4
môžeme rozložiť na
1*2^2 + 0*2 + 0 -> 100
. V tejto situácii je najdôležitejšie
ten bit, ktorý násobíme najvyššiu mocninou dvojky. Hoci sa to zdá ako
hlúposť, uvedomme si, že pre veľké čísla nás možno budú zaujímať len
napr. Posledné 3 bity, takže je logickejšie posielať počítači čísla v
LSB First.
Keď už sme si vyjasnili, či chceme mať bity v MSB či LSB First, a tým pádom ako nám bity chodia, radi by sme vedeli, koľko sme tých bitov vlastne dostali.
Čo to vlastne prišlo?
Predstavte si, že niekto chce posielať samé nuly. To sa celkom zle detekuje. Žiadna zmena signálu, maximálne nejaký divný šum odvedľa ...
Najjednoduchším spôsobom riešenia je mať pevne danú dĺžku bitu čiže
v prijímacom aj vysielacom zariadení mať dohodnutú dobu, za ktorú sa
prenesie bit. Predstavte si lenivého strážcu parkoviska, ktorý má
počítať autá, čo prídu, a väčšinu času si číta noviny. Raz za čas
mu zazvoní budík zdvihne hlavu a keď uvidí auto, zapíše si 1
.
Keď nikoho neuvidí, zapíše si 0
. Dajme tomu, že budík zvoní
pravidelne aj v počítači. Ešte by sme nakoniec potrebovali, aby si niekto
všimol, že sme začali posielať 0
, čiže, že sa zmenil stav
linky z "nevysielajú" na "vysielam 0
". To sa urobí tak, že sa
pošle akoby 0
. bit, ktorý nič nerobí, len hovorí - hele, teraz
dávaj pozor. Na konci už nepotrebujeme mať ďalšie bit, ktorý nám povie,
že prenos končí, pretože máme pevne danú dĺžku bytu.
Celý floating prenos vyzerá takto:
Tento prenos je však pomerne neefektívny a používal sa pre vyššie zmienenú linku RS-232. V čom je problém? Celú dobu bola vo floating stave, takže je potrebné poslať Start bit, oznámiť v akom poradí posielame bity, dĺžku a nakoniec dávať veľmi dobrý pozor, aby sa hodiny na opačných stranách prenosu nerozoslať. Nakoniec ešte vrátiť linku do floating stavu. Ak túto réžii robíme pri každom bytu, akonáhle si posielame niekam film, to aby sme si urobili kávu a prečítali Babičku ...
Vylepšenia procesu
Ako celý proces zlepšiť? Môžeme si držať informáciu o hodinovom signálu bokom. Budeme mať špeciálny kábel, ktorý bude len vysielať hodinový signál. Odpadne nám starosť so začiatkom a koncom. Akonáhle beží hodinový signál, čítame. Nebeží, nečítame. Túto možnosť používame pri diferenčnom prenose.
Na záver zmätok vrcholí
Okrem tzv. Bite Order môžeme chcieť kontrolovať ešte tzv. Byte Order,
čiže ktorý byt v sérii sa prenesie prvý. Opäť môžeme deliť na Little
endian a Big endian - čiže čo je na konci prenosu. Či je na konci najmenej
dôležitý bajt / najviac dôležitý byte. Napríklad, ak ukladáme znak ako 2
bajty (napríklad v UTF-16 znakové sade), kde znak a
má v
decimálna sústave hodnotu 97
, na jeho uloženie potrebujeme 2
bajty. V jednom bajtu bude uložená hodnota a
, v druhom bude len
0
pre doplnenie. Prečo, to sa dozvieme v ďalších lekciách.
Teraz je pre nás však dôležité, že môžeme a
uložiť v
Little endian ako 97 00
, alebo v Big endian ako 00 97
.
Je teda opäť potrebné si vopred vyjasniť poradí. Hlavne sa nenechať
zmiasť. A môžem Ak navnadiť na nabudúce, lekciu Reprezentácie čísel v počítači , zmätky zďaleka
nekončí. Bez nich by to však nebola taká zábava
Oddychová časť alebo počítanie mocnín
Teraz sa ešte raz pozrieme na mocniny čísla 2
. Poznať
mocniny tohto čísla sú veľmi praktické. 8b je 1B. A ako je to ďalej? To
záleží. Ak sme medzi "svojimi" - ak nie sme predavači pevných diskov, tak
1kB je 1024B, 1GB je 1024 MB atd ... Samozrejme, ak sme predajcovia diskov, je
pre nás 1MB niečo ako 1000kB a pevný disk sa nám zmenšil o očakávaných
24KB. Ako obchodný technika to nie je až tak zlé. Všetky ostatné fyzikálne
veličiny ako napr. Kg, km pod. Pracujú v desiatkovej sústave, prečo by
chudáci užívatelia mali pracovať v niečom inom ... Nu, taký je svet.