Table of Contents

Architektura počítače; CPU, paměti, subsystémy

B0B35APO Webové stránky předmětu CompArch WebEval

1. Architektura počítače

Architektura počítače popisuje způsob, jakým je organizován a propojen hardware – zejména paměť, procesor a sběrnice. Dvě nejčastější architektury používané pro návrh počítačových systémů jsou von Neumannova architektura a Harvardská architektura.

Architektura

Von Neumannova architektura

Harvardská architektura

Sběrnice

V obou architekturách jsou paměťové jednotky spojeny se zbytkem systému pomocí tří základních typů sběrnic:

[obrázek: porovnání von Neumannovy a Harvardské architektury – ukazuje společnou paměť/sběrnici vs. oddělené části]

Kladná čísla

Počítače interně ukládají a zpracovávají všechna čísla v binární (dvojkové) soustavě. To znamená, že i běžná desítková čísla, se kterými pracujeme, musí být uvnitř reprezentována jako posloupnost bitů — tedy nul a jedniček.

Každý bit odpovídá určité mocnině čísla 2. Čím je bit „více vlevo“, tím větší mocninu reprezentuje. Například číslo `101011` znamená:

$$ 1 \cdot 2^5 + 0 \cdot 2^4 + 1 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0 = 32 + 8 + 2 + 1 = 43 $$

Tento princip je základním kamenem všech výpočtů a práce s daty uvnitř počítače.

Datové typy bez znaménka

V jazyce C a dalších systémech se s kladnými čísly pracuje pomocí tzv. unsigned datových typů. Ty nezaznamenávají znaménko a využívají všechny své bity pouze k reprezentaci kladných hodnot — díky tomu mají větší maximální hodnotu než jejich „signed“ (se znaménkem) ekvivalenty.

typ min max počet bytů
———————-———————————————-————-
`unsigned char` 0 255 1
`unsigned short` 0 65 535 2
`unsigned long` 0 4 294 967 295 4
`unsigned long long` 0 18 446 744 073 709 551 615 8

Každý z těchto typů je implementován jako pevný počet bitů, které určují možný rozsah hodnot.

Poznámka: Standard C určuje minimální rozsah jednotlivých typů, ale konkrétní implementace může použít i širší. Například `unsigned int` bývá téměř vždy 4 byty.

Velikost konkrétní proměnné nebo typu zjistíš v C pomocí:

sizeof(unsigned int)

Přesnější (a přenositelné) typy se dají zavést pomocí hlavičkového souboru `stdint.h`:

#include <stdint.h>
uint8_t x;
uint16_t y;
uint32_t z;
uint64_t w;

Zápis čísel v různých soustavách

Číselné konstanty můžeš v jazyce C zapsat v několika formátech podle toho, jakým prefixem začínají:

252 == 0xfc == 0374 == 0b11111100

Šestnáctkový (hexadecimální) zápis je čitelnější, protože každý hexadecimální znak odpovídá přesně 4 bitům. Díky tomu je rychlé převádění mezi hex a binární reprezentací.

Například:

0x123456 // zabírá 3 byty v paměti

Endianita

Když počítač pracuje s víc než jedním bytem (např. `uint32_t`, `uint64_t`), musí nějak určit, v jakém pořadí budou jednotlivé bajty uloženy do paměti.

Tato vlastnost se nazývá endianita.

adresa big endian little endian
——–—————————-
0x400 0x12 0x78
0x401 0x34 0x56
0x402 0x56 0x34
0x403 0x78 0x12

Zjednodušeně:

Little endian si snadno zapamatuješ tak, že se číslo rozebere po bajtech odzadu – první přijde ten „nejmenší“.

Například hodnota `0x12345678` se v little endian uloží jako `0x78 0x56 0x34 0x12`.

Pro komunikaci přes síť se čísla často převádějí na network byte order, což je forma big endian. Překlady do/z této formy se v C provádějí pomocí funkcí jako `htons()` nebo `ntohl()`.

Platformy a endianita:

Přehled souvisejících pojmů

Binární zápis je přirozený pro počítače, ale pro lidi je často čitelnější hexadecimální forma. Například 8bitové číslo `11110000` lze rychle přepsat jako `0xF0`.

Celá a reálná čísla

Čísla v počítači můžeme rozdělit na celá čísla (integer) a reálná čísla (floating-point). Každý z těchto typů má svá specifika, jak jsou uložena, reprezentována a zpracovávána na úrovni binární reprezentace.

Celá čísla (signed integers)

Pro reprezentaci záporných celých čísel se historicky používaly různé způsoby:

  1. Kladné číslo $X$ se reprezentuje běžným způsobem.
  2. Záporné číslo $X$ se reprezentuje jako $2^k - |X|$, kde $k$ je počet bitů.

Výhoda: není třeba speciální obvod pro odčítání — záporná čísla lze přičítat jako kladná.

Např. pro 8bitové číslo:

Rozsah čísel, která lze zapsat pomocí $k$ bitů:

$$ [-2^{k-1}, 2^{k-1} - 1] $$

Např. 8bitový typ `char` má rozsah:

$$ [-128, 127] $$

Jak vytvořit záporné číslo v two’s complement

  1. Převeď číslo $X$ na binární tvar.
  2. Zneguj (invertuj) všechny bity – získáš 1’s complement.
  3. Přičti 1 – tím získáš 2’s complement.

Příklad: $-6$

6    = 00000110
~6   = 11111001  (negace bitů)
+1   = 11111010  (přičtení 1)

Typy celých čísel v jazyce C

typ min max bajtů
————————————–———————————–
`char` -128 127 1
`short` -32 768 32 767 2
`long` -2 147 483 648 2 147 483 647 4
`long long` -9 223 372 … 808 9 223 372 … 807 8

Při sčítání může dojít k přetečení, pokud výsledek přesáhne možný rozsah typu. Například:

[příklad binárního přetečení dvou čísel, např. 150 + 120 → přetečení na 14, protože nejvyšší bit je znaménkový]

Převod celého čísla z binární do desítkové soustavy

Pro libovolné binární číslo platí:

$$ \sum_{i=0}^{k-1} b_i \cdot 2^i $$

kde $k$ je počet cifer a $b_i$ je hodnota cifry (0 nebo 1) na daném indexu zleva zprava (od nejméně významného bitu).

Příklad:

$$ 0100101_{(2)} = 2^0 + 2^2 + 2^5 = 1 + 4 + 32 = 37_{(10)} $$

Stejný princip lze aplikovat i na reálná čísla, kde za desetinou čárkou používáme záporné exponenty:

$$ \sum_{i=-j}^{k} b_i \cdot 2^i $$

Příklad:

$$ 0100101,11_{(2)} = 2^0 + 2^2 + 2^5 + 2^{-1} + 2^{-2} = 1 + 4 + 32 + 0.5 + 0.25 = 37.75_{(10)} $$

Převod do vědeckého zápisu (floating point)

Podobně jako v desítkové soustavě zapisujeme čísla ve vědeckém tvaru, lze to udělat i binárně:

$$ 110110000000000,0_{(2)} = 1,1011_{(2)} \cdot 2^{14} = 1.1011E14 = 29696_{(10)} $$

Záporný příklad:

$$ −0,00000000000000011101_{(2)} = −1,1101_{(2)} \cdot 2^{−16} = −1.1101E − 16 $$

Poznámka: Vědecká notace se vyznačuje tím, že žádné číslo (kromě nuly) nezačíná nulou. Mantisa má vždy tvar $1.xxxx$, což odpovídá normalizovanému binárnímu číslu.

Reálná čísla (float, double)

Počítače reprezentují desetinná čísla podle standardu IEEE 754, který definuje:

Například pro 32bitový float:

IEEE zápis: | s | gggggggg | fffffffffffffffffffffff |

Binární vědecký zápis (normalizace)

Každé desetinné číslo se převede do vědeckého binárního zápisu. Tento zápis je obdobou vědeckého zápisu v desítkové soustavě, kde číslo zapisujeme ve tvaru:

$$ x = m \cdot 2^e $$

kde:

Například:

$$ 0{,}828125_{(10)} = 2^{-1} + 2^{-2} + 2^{-4} + 2^{-6} = 0{,}110101_{(2)} $$

Následně převedeme binární číslo do normalizované (vědecké) formy:

$$ 0{,}110101_{(2)} = 1{,}10101 \cdot 2^{-1} $$

Z této podoby lze přímo získat:

Vzorec pro exponent

Exponent se ve formátu IEEE 754 neukládá přímo, ale v tzv. posunuté (excess-K) formě, kde:

$$ E_{\text{uložený}} = E_{\text{skutečný}} + 2^{j-1} - 1 $$

kde:

V našem příkladu:

$$ E_{\text{skutečný}} = -1 \Rightarrow E_{\text{uložený}} = -1 + 127 = 126 $$

Tato hodnota (126) je to, co se ve skutečnosti uloží do příslušných 8 bitů exponentu v IEEE formátu pro 32bitové float.

Nyní můžeme hledané desetinné číslo zapsat jako

Speciální případy v IEEE 754

Podle hodnoty exponentu a mantisy lze ve formátu IEEE 754 rozeznat několik speciálních hodnot. To je důležité pro detekci výjimek, extrémních hodnot nebo výpočtových chyb.

Exponent Mantisa Hodnota / Význam
————–————-—————————————————————-
`00000000` `0` 0.0 – čistá nula (kladná nebo záporná podle znaménka)
`00000000` ≠0 Denormalizovaná čísla – velmi malá čísla blízká nule
`00000001` `0` Nejmenší normalizované číslo se skrytou jedničkou
`00000001`–`11111110` cokoliv Normalizovaná čísla, skrytá 1 v mantise
`11111111` `0` +∞ nebo -∞, podle hodnoty znaménkového bitu
`11111111` ≠0 NaN – „Not a Number“, výsledek nedefinované operace

Denormalizovaná čísla

Denormalizovaná čísla (někdy také subnormální) vznikají tehdy, když je exponent nulový (`00000000`), ale mantisa není nulová. Liší se od běžných normalizovaných čísel tím, že:

Příklad:

Denormalizace tak tvoří jakýsi „most“ mezi nulou a nejmenší normalizovanou hodnotou.

Přehled přesností a rozsahů

Formát IEEE 754 existuje v několika variantách podle bitové šířky. Čím více bitů, tím větší rozsah a vyšší přesnost.

Typ Bitů Přesnost (cca) Rozsah hodnot (přibližně)
———-————————–——————————–
`float` 32 ~7 desetinných míst ±3,4 · 10³⁸
`double` 64 ~15–17 číslic ±1,8 · 10³⁰⁸

Nejmenší kladná hodnota pro `float` (normalizovaná):

$$ \approx 1{,}17 \cdot 10^{-38} $$

Tato hodnota odpovídá nejnižšímu možnému exponentu `00000001` a mantise `000…0`, tedy normalizovanému číslu s minimální velikostí.

Výpočet převodu desetinného čísla do IEEE 754

  1. Urči znaménko (0 = kladné, 1 = záporné).
  2. Převeď číslo do binární soustavy (celou i desetinnou část).
  3. Normalizuj číslo do tvaru 1.xxxx × 2^e.
  4. Exponent ulož jako e + bias (např. +127 pro float).
  5. Mantisa = binární čísla za desetinnou čárkou (bez úvodní 1), doplň na 23 bitů.

Příklad pro číslo: -12.625

Výsledný IEEE 754 zápis: 1 10000010 10010100000000000000000

Výpočetní náročnost základních operací (float/double)

Pořadí podle rychlosti (od nejrychlejšího):

Důvodem je složitost a potřeba normalizace/denormalizace během výpočtů.

Shrnutí

2. CPU

RISC vs. CISC architektura

RISC (Reduced Instruction Set Computer) a CISC (Complex Instruction Set Computer) jsou dva různé přístupy k návrhu instrukční sady procesoru.

Registry

Registry jsou paměťové buňky uvnitř procesoru, které uchovávají mezivýsledky a stav výpočtu. Hrají klíčovou roli při provádění instrukcí.

Registr Popis
——–——-
`PC` Program Counter – adresa právě prováděné (nebo následující) instrukce
`IR` Instruction Register – obsahuje kód prováděné instrukce načtený z paměti
`GPR` General Purpose Registers – obecné uživatelské registry (někdy oddělené na datové a adresové), nebo univerzální
`SP` Stack Pointer – ukazuje na vrchol zásobníku, využívá se při volání funkcí a správě lokálních dat
`PSW` Program Status Word – definuje stav procesoru (např. příznaky přetečení, znaménka, nulový výsledek)
`IM` Interrupt Mask – kontrola přerušení (která přerušení mohou být obsloužena)
`FPR` Floating Point Registers – rozšíření pro práci s reálnými čísly a často i vektorovými či SIMD operacemi

Příklad specifických registrů u architektury RISC-V:

Formát RISC instrukcí

RISC instrukce mají typicky pevnou délku, například 32 bitů. Jsou navrženy tak, aby se snadno dekódovaly a zpracovávaly.

Příklady RISC-V instrukcí:

Porovnání: jednocyklový vs. zřetězený procesor

Jednocyklový procesor (non-pipelined)

  1. Každá instrukce se provádí samostatně, krok za krokem:
    1. Načtení instrukce,
    2. Dekódování,
    3. Provedení,
    4. Paměťový přístup,
    5. Zápis výsledku.
  2. Nová instrukce může začít až po dokončení předchozí.
  3. Jednoduché řízení, ale nízká propustnost.

Zřetězený procesor (pipelined)

  1. Instrukce se dělí na fáze, které se překrývají.
  2. Umožňuje paralelní zpracování více instrukcí najednou (v různých fázích).
  3. Zvyšuje propustnost bez zvyšování taktovací frekvence.

Pětistupňová pipeline:

  1. IF – Instruction Fetch – načtení instrukce z paměti.
  2. ID – Instruction Decode – dekódování instrukce, načtení registrů.
  3. EX – Execute – výpočet operace (např. sčítání v ALU).
  4. MEM – Memory – přístup do paměti (čtení/zápis).
  5. WB – Write Back – zápis výsledku do registru.

Obrázek pipeline:

400

Problémy při zřetězeném zpracování – datové a řídicí hazardy

Datový hazard – instrukce potřebuje výsledek, který ještě není zapsán:

Řídicí hazard – nevíme, zda instrukce typu `beq` provede skok, než se spočítá podmínka:

Superskalární architektura – využívá více ALU jednotek a přejmenovávání registrů (register renaming), čímž dále zvyšuje paralelismus a zabraňuje konfliktům v zápisu do registrů.

3. Predikce skoků

jak lze predikovat skoky v programu, jak se přiřadí prediktor k instrukci, co je to spekulativní vykonávání instrukcí.

Superskalární paralelismus a větvení

Superskalární procesory mají více výpočetních jednotek (např. více ALU), které umožňují paralelní vykonávání více instrukcí.

Rozlišení architektur:

Dle typu větví:

Pozor na tzv. interferenci skoku – pokud dvě skokové instrukce mají podobnou adresu (např. stejné poslední bity), může to rozhazovat predikce kvůli sdíleným prediktorovým tabulkám.

Přehled predikce skoků

Skoky (branch instructions) mění tok řízení programu – buď bezpodmíněně (např. `jmp`) nebo podmíněně (např. `beq`, `bne`).

V moderních procesorech, které používají pipeline a prefetch, je potřeba vědět dopředu, kterou instrukci načíst jako další. Pokud není jasné, zda bude podmínka skoku splněna, může dojít ke zdržení nebo ke špatnému větvení, což způsobuje výkonnostní penalizaci.

Řešením je použití predikce skoků – procesor odhaduje, zda bude skok vykonán (taken, T) nebo ne (not taken, NT), a na základě toho spekulativně vykonává instrukce.

Statistiky:

Statické prediktory

Statické prediktory nemění svou predikci v čase – mají pro každou skokovou instrukci pevně danou předpověď, která nezávisí na tom, jak se daná instrukce chovala v minulosti. Tento přístup je velmi jednoduchý na implementaci a nezatěžuje hardware, ale je omezený v přesnosti, protože nedokáže reagovat na změny v běhu programu.

Prediktor "vždy taken"

Tento prediktor vždy předpokládá, že skok bude proveden – tedy že řízení programu skutečně skočí na novou adresu.

Tento přístup je založen na pozorování, že většina zpětných skoků (např. v cyklech) bývá skutečně provedena. Neřeší ale, zda jde o cyklus nebo větvení, zkrátka predikuje vždy stejně.

Výhoda: extrémně jednoduchá implementace – není potřeba žádná analýza ani tabulky.

Nevýhoda: ignoruje skutečné chování programu, a tedy může často chybovat, hlavně u větví, které nejsou často prováděny.

Výpočet úspěšnosti:

Bereme v úvahu:

Spočítáme tedy vážený průměr:

$$ p_{taken} = 0.66 \cdot 0.4 + 0.34 \cdot 0.99 = 0.264 + 0.3366 = 0.6006 $$

Přibližně 60% úspěšnost – to znamená, že v průměru 6 z 10 predikcí bude správných.

Prediktor BTFNT (Backwards Taken, Forwards Not Taken)

Tento prediktor bere v úvahu směr skoku a předpokládá:

Tento prediktor vychází z toho, jak programy typicky vypadají:

Tímto přístupem se snaží prediktor inteligentněji odhadnout chování bez potřeby historie. Oproti prediktoru „vždy taken“ má výrazně lepší výsledky.

Výpočet úspěšnosti:

Opět vážený průměr:

$$ p_{BTFNT} = 0.66 \cdot 0.6 + 0.34 \cdot 0.99 = 0.396 + 0.3366 = 0.7326 $$

Tedy přibližně 73% úspěšnost, což je výrazně lepší než u prediktoru „vždy taken“.

Statická predikce je jednoduchá a nezatěžuje hardware, ale neposkytuje dostatečnou flexibilitu při složitějším chování programů.

Dynamické prediktory

Dynamické prediktory se snaží zjistit, zda se skoková instrukce provede, a to na základě jejího předchozího chování. Jinými slovy, sledují minulost konkrétní skokové instrukce a podle toho se snaží odhadnout, zda se tentokrát skočí nebo ne.

Protože počet prediktorů v procesoru je omezený (z důvodů výkonu a velikosti), ne každá skoková instrukce má svůj vlastní prediktor. Místo toho se sdílí mezi více instrukcemi.

V praxi bývá počet prediktorů obvykle $2^n$, protože to umožňuje jednoduše použít $n$ nejnižších bitů z adresy skokové instrukce jako index do tabulky prediktorů. Tento přístup je efektivní z hlediska hardwarové implementace.

1-bitový Smithův prediktor

Tento prediktor je nejjednodušší formou dynamického prediktoru. Používá pouze 1 bit k uchování stavu, což znamená, že má pouze dva možné stavy. Nejjednodušší prediktor, který má pouze 2 stavy.

Má následující stavy:

Ve výchozím stavu bývá predikce nastavena na „taken“, což znamená, že se předpokládá, že se skok vykoná. Pokud je predikce správná (odpovídá skutečnosti), stav se nemění. Pokud je predikce chybná, bit se přepne na opačnou hodnotu. Tento přístup je rychlý, ale citlivý na výkyvy – například při střídavém chování skoku (např. skok se provede jednou ano, jednou ne) může často selhávat.

Tento typ prediktoru je rychlý a jednoduchý, ale také snadno podléhá chybným odhadům, pokud se chování skoku často mění.

2-bitový Smithův prediktor

Tato varianta Smithova prediktoru používá 2 bity k uchování stavu, což umožňuje rozlišit čtyři různé úrovně „jistoty“ ohledně predikce.

Díky dvěma bitům si prediktor může dovolit „chybu navíc“, než změní svůj názor. To znamená, že je stabilnější a méně přecitlivělý na výjimky.

Má čtyři stavy:

Výhoda tohoto prediktoru je, že není tak citlivý na náhodnou odchylku. Například, pokud instrukce většinou skáče, ale jednou neskočí, prediktor se nepřepne hned do opačného režimu – místo toho musí být chyba potvrzena ještě jednou, aby došlo k přepnutí.

2-bitový prediktor s hysterezí

Tento prediktor je mírně odlišnou variantou 2-bitového Smithova prediktoru. Podobně jako on má čtyři stavy, ale interpretace těchto stavů je zaměřena na zachování hystereze – tedy odolnosti vůči jednorázovým výkyvům.

Hystereze zde znamená, že prediktor nezmění názor ihned po první chybě, ale až po opakované. Tím se eliminuje „přepínání sem a tam“, které by nastávalo u prediktoru bez hystereze, když se chování skoku často mění.

Prediktor má 4 stavy a pro přechod mezi skupinami „skok“ a „neskok“ je třeba dvou po sobě jdoucích opačných výsledků. Díky tomu se předpověď mění méně často a je stabilnější.

Prediktor s hysterezí je v podstatě standardní 2-bitový prediktor – pokud je ale konkrétní zápis výslovně odlišen jako “s hysterezí”, zdůrazňuje právě tuto schopnost stabilního rozhodování.

Hodnocení prediktorů

Nelze jednoznačně říct, který prediktor je nejlepší, protože jejich výkonnost se liší podle konkrétního programu. Některé prediktory jsou lepší při pravidelném chování skoků, jiné při složitějších vzorcích.

Z tohoto důvodu se kvalita prediktorů hodnotí statisticky – například měřením úspěšnosti predikce na sadě různých programů. Tabulka níže ukazuje typické výsledky takového srovnání:

Typ prediktoru Úspěšnost predikce
—————-———————
Statický prediktor – vždy skočí 59.25 %
1-bitový Smithův prediktor 68.75 %
2-bitový prediktor s hysterezí 83.50 %

Z tabulky je patrné, že i jednoduchý 1-bitový prediktor přináší výrazné zlepšení oproti statické predikci. Ještě větší úspěšnost pak poskytuje 2-bitová varianta. Prediktor s hysterezí jde ještě dál a dosahuje nejvyšší úspěšnosti ze všech zde uvedených Smithových typů.

Historie skoků - korelované prediktory

Registr BHR (Branch History Register) uchovává historii posledních $n$ skoků. Na základě této historie se určuje, jaký prediktor se použije pro danou skokovou instrukci.

Díky tomu má procesor přehled o tom, jak vypadala nedávná historie větvení a může ji využít k přesnější predikci.

Vybíráme prediktor podle BHR a adresy skokové instrukce. Takže místo toho abychom prediktor vybírali jen podle adresy skokové instrukce, tak vybíráme prediktor podle adresy skokové instrukce a historie posledních skoků.

Gshare

Varianta korelovaného prediktoru. Místo přímého spojení adresy skoku a historie využívá XOR (bitovou exkluzivní disjunkci) mezi BHR a adresou skoku.

Výpočet indexu: $index = BHR \oplus PC_{\text{lower bits}}$

Výhoda:

Turnajový prediktor

Kombinuje více prediktorů (např. 2-bitový Smithův + Gshare) a vybírá ten, který má v daném kontextu vyšší úspěšnost.

1-bitový turnajový prediktor funguje následovně:

  1. Nechá oba prediktory (P1, P2) spočítat predikci.
  2. Pokud se shodují → použije se jejich predikce.
  3. Pokud se liší, zvolí se predikce podle toho, který byl naposledy úspěšnější (uloženo v jednom bitu).
  4. Po skutečném vykonání skoku se informace o úspěšnosti aktualizuje.

Výhoda:

Moderní neuronové prediktory

Moderní prediktory používají neuronové sítě k určení toho, zda se skok vykoná nebo ne. Například Zen 2 používá neuronovou síť kde pro $2^k$ skokových instrukcích existuje pro každou sada vah pro neuronovou síť. Neuronová síť používá jako vstup BHR.

4. Paměti - hierarchie pamětí, porovnání ceny, velikosti a rychlosti. Cache – organizace cache a její velikost, plně asociativní cache oproti n-cestné cache – výhody, nevýhody, rychlost a velikost.

Paměť je jedna ze základních částí počítače. Do paměti se ukládají všechna data zpracovávaná procesorem, včetně instrukcí programů.

Hiearchie

Každý moderní počítač má několik úrovní paměti, které se liší svou velikostí, rychlostí, latencí a funkcí. Hiearchie pamětí se může trochu lišit napříč architekturami a konkrétními sestavami.

Registers

RAM

Disk

Cache

Cache je rychlá volatilní paměť přímo v procesoru, která se snaží snížit dopad relativně velmi pomalých pamětí RAM. Historicky rostl výpočetní výkon procesorů mnohem rychleji než rychlost pamětí RAM a proto je cache stále více a více důležitý, aby nebyl procesor omezován (bottleneck). Moderní procesory mají několik úrovní cache pro optimální výkon:

Organizace Cache

Plně asociativní cache

Znamená, že $\text{Degree of associativity} = \text{Number of blocks}$. Každý řádek má svou vlastní tabulku, což znamená, že index má 0 bitů a celá adresa kromě offsetu se ukládá do tagu.

Přímo mapovaná cache

N-asociativní cache

5. Vstupně výstupní periferie

periferie mapované do paměti, sériový port, sběrnice – sériová/paralelní, half-duplex/full-duplex, sběrnice PCI.

Periferie mapované do paměti

Sériová vs paralelní sběrnice

Sériový port (UART)

Half-duplex vs Full-duplex

Asynchronní sběrnice

Synchronní sběrnice

PCI

PCIe