====== Vstup a výstup (I/O - Input/Output) ====== V informatice pojem **I/O** (zkratka z anglického //Input/Output//, česky vstup a výstup) označuje veškerou komunikaci mezi systémem pro zpracování informací (počítačem, mikrokontrolérem) a vnějším prostředím. Tímto prostředím může být lidský uživatel, jiný počítač, síť nebo jakékoliv periferní hardwarové zařízení. Jednoduše řečeno: **Vstupy** jsou data a signály, které systém přijímá ke zpracování, zatímco **výstupy** jsou výsledky zpracování, které systém odesílá ven. Koncept I/O je absolutním základem architektury počítačů (tzv. Von Neumannovy architektury) – bez něj by počítač byl jen izolovanou černou skříňkou, do které nelze dostat žádná data a ze které nelze přečíst žádné výsledky. ===== 1. Hardwarové I/O zařízení (Periferie) ===== Fyzická zařízení, která zprostředkovávají I/O operace, se nazývají periferie. Dělí se do tří základních kategorií: * **Vstupní zařízení (Input):** Transformují podněty z fyzického světa do digitálních dat srozumitelných pro počítač. Patří sem klávesnice, myš, mikrofon, skener, webkamera nebo různé senzory (teploměr, GPS). * **Výstupní zařízení (Output):** Přijímají digitální data z počítače a převádějí je do formy srozumitelné pro člověka nebo jiný fyzický systém. Typickým zástupcem je monitor, tiskárna, reproduktory nebo robotické rameno v továrně. * **Kombinovaná I/O zařízení:** Slouží k obousměrné komunikaci. Příkladem jsou pevné disky (HDD/SSD) a flash disky (můžeme z nich data číst i na ně zapisovat), síťové karty (NIC) nebo dotykové obrazovky. ===== 2. Jak počítač komunikuje s I/O zařízeními ===== Aby mohl centrální procesor (CPU) efektivně komunikovat s pomalejšími periferiemi, využívá počítačová architektura několik klíčových mechanismů: ==== Adresování periferií ==== * **Memory-Mapped I/O (MMIO):** V tomto přístupu sdílí I/O zařízení stejný adresní prostor jako hlavní operační paměť (RAM). Pokud chce procesor poslat data na grafickou kartu, zapíše je jednoduše na specifickou adresu v paměti. * **Port-Mapped I/O (PMIO):** Zařízení mají svůj vlastní, izolovaný adresní prostor (tzv. I/O porty). K přístupu do něj musí procesor používat speciální instrukce. ==== Správa přenosu dat ==== * **Polling (Dotazování):** Procesor v cyklu neustále kontroluje I/O zařízení a ptá se: //"Máš pro mě nová data?"// Tento způsob je velmi neefektivní a plýtvá výpočetním výkonem CPU. * **Interrupts (Přerušení):** Mnohem chytřejší metoda. Procesor si hledí své práce. Když má I/O zařízení připravená data (např. uživatel stiskl klávesu), pošle procesoru hardwarový signál přerušení (IRQ). Procesor okamžitě přeruší stávající činnost, obslouží vstup a pak se vrátí k původní práci. * **DMA (Direct Memory Access):** Přímý přístup do paměti. Speciální čip na základní desce umožňuje zařízením (např. pevnému disku nebo síťové kartě) zapisovat a číst data z operační paměti zcela samostatně, a to bez jakékoliv asistence hlavního procesoru. CPU je díky tomu ušetřeno masivních přesunů dat a může se věnovat výpočtům. ===== 3. Softwarové I/O a programování ===== Z pohledu operačního systému a softwarového vývoje neznamená I/O jen klávesnici a monitor. Jde primárně o **File I/O** (čtení a zápis souborů na disku) a **Network I/O** (stahování a odesílání dat přes síť). Tyto operace jsou z hlediska procesoru extrémně pomalé. Programovací jazyky k tomu přistupují dvěma způsoby: ==== Blokující vs. Neblokující I/O ==== * **Synchronní (Blokující) I/O:** Program požádá o načtení velkého souboru z disku. Během čekání na fyzické přečtení dat diskem se běh celého programu zastaví (zablokuje se) a aplikace může působit zamrzle. * **Asynchronní (Neblokující) I/O:** Program zadá operačnímu systému požadavek na načtení souboru a okamžitě pokračuje v provádění dalšího kódu. Jakmile systém data z disku načte, pošle programu upozornění (např. přes tzv. //callback//). Tento přístup je kritický pro tvorbu rychlých webových serverů (např. framework Node.js). ===== 4. I/O jako úzké hrdlo (Bottleneck) ===== Rychlost procesorů a operačních pamětí roste historicky mnohem rychleji než propustnost pevných disků nebo síťových spojení. Z tohoto důvodu se IT systémy často dělí podle toho, co je nejvíce omezuje: * **CPU Bound (Limitováno procesorem):** Úlohy jako renderování 3D grafiky, trénování AI nebo komprese videa. Procesor běží na 100 % a zpracování brzdí jen jeho výpočetní výkon. * **I/O Bound (Limitováno vstupem/výstupem):** Úlohy jako kopírování tisíců malých souborů, prohledávání rozsáhlých databází nebo stahování z pomalého internetu. Procesor se drtivou většinu času "nudí" a jen nečinně čeká, až pevný disk nebo síťová karta dodají požadovaná data. K měření výkonnosti úložných I/O zařízení se nejčastěji používá metrika **IOPS (Input/Output Operations Per Second)**, která udává, kolik operací čtení/zápisu dokáže úložiště zpracovat za jednu vteřinu (moderní NVMe SSD disky dosahují i více než milionu IOPS). ===== Rychlé srovnání I/O pojmů ===== ^ Aspekt ^ Popis ^ Typický příklad ^ | **Vstupní zařízení** | Posílá data do počítače | Klávesnice, čtečka čárových kódů | | **Výstupní zařízení** | Přijímá data z počítače pro zobrazení | Monitor, tiskárna, LED dioda | | **I/O Bound proces** | Brzděn pomalým přísunem dat | Zálohování velkých složek, databázové dotazy | | **Synchronní I/O** | Blokuje běh programu do dokončení operace | Tradiční čtení souboru (např. v Pythonu) | | **DMA (Direct Memory Access)** | Hardware obchází procesor při přesunu dat | Načítání textur z disku přímo do grafické paměti | ~~NOTOC~~