Multithreading

V minulém díle jsem pojmenoval pojmy jako proces, entry point, vlákno, hlavní vlákno a stavy vláken.

Operační systém má na starost evidenci, vytváření a přidělování vláken. Jak se ale operační systém rozhoduje, které vlákno má zrovna běžet?

HALT instrukce

Už víš, že procesor je zařízení, do kterého se prostě neustále sypou instrukce. Jakmile zapneš počítač a nic na něm neděláš tak to operační systém kompenzuje HALT instrukcí, která prostě jen pozastaví procesor na krátký časový úsek, třeba 0,001 vteřiny.

Context switching

Jakmile začnou v počítači vznikat další vlákna, operační systém jednoduše sníží počet HALT instrukcí a uvolní výpočetní kapacitu procesoru novému vláknu.

Vláken může běžet najednou libovolné množství – jsme omezeni pouze pamětí a výkonem procesoru.

Jenže bacha – vzpomeň si, jak funguje procesor: zpracovává instrukce za sebou. Procesor (jednoduchý, jednojádrový procesor) neumí zpracovávat několik instrukcí současně. Jasně, umí zpracovat 5 miliard instrukcí za vteřinu ale neumí zpracovat 2 instrukce najednou, ve stejný čas. Instrukce zpracovává v sérii (za sebou) nikoliv paralelně (vedle sebe).

Jak to tedy operační systémy dělají, že umožňují paralelní běh několika vláken najednou?

Neumožňují. Operační systém prostě jen neustále přepíná mezi tím, které vlákno má zrovna přidělený čas procesoru. Tomuto přepínání se říká context switching a schopnosti takto spouštět jednotlivá vlákna se říká multithreading.

Na tomto jednoduchém schématu je vyznačeno, jak se vláknům přiděluje čas procesoru. Na oko to může vypadat, že obě vlákna běží paralelně, ve skutečnosti chvíli běží první vlákno (Thread #1), chvíli druhé (Thread #2).
Zdroj: Wikipedie

To je celé.

Plyne z toho jeden závěr: se zvyšujícím se počtem běžících vláken se zpomaluje rychlost každého běžícího vlákna, jinými slovy, zpomaluje se na oko práce s celým počítačem.

Moderní procesory jsou však tak brutálně rychlé, že z pohledu lidského vnímání na nich mohou běžet stovky vláken „najednou“. Ve zlomku vteřiny procesor přidělí dostatečný čas každému vláknu a z pohledu uživatele všechny vlákna běží paralelně.

Scheduler

Scheduler je název pro tu část operačního systému, která se stará o správu běžících procesů, vláken a o context switching.

V IT je však scheduler obecnější název pro jakýkoliv mechanismus, který má na starosti nějaké plánování.

Vícejádrové procesory

Moderní procesory jsou ve skutečnosti „multičipy“, které obsahují několik „podprocesorů“ ale těmto podprocesorům se říká „jádra“. Například „procesor s 8 jádry“ ve skutečnosti lze označit za „8 procesorů“, které běží paralelně, každý s frekvencí 5 miliard instrukcí za vteřinu.

V těchto vícejádrových procesorech skutečně běží několik instrukcí najednou. V jakém jádru ale běží jaké konkrétní vlákno si určuje operační systém.

Multithreading je podporován v každém jádře. V každém jádře stále může běžet více vláken najednou ale díky většímu počtu jader lze provozovat větší počet vláken bez znatelné ztráty výkonu v porovnání s nudným, „jednojádrovým“ procesorem.

Nelze ale automaticky říct, že procesor s více jádry je výkonnější, než jednojádrový procesor. Záleží na použití.

Aplikace, která spouští spoustu vláken, jako např. počítačová hra, bude těžit z vyššího počtu jader víc, než z jednojádrového procesoru. Aplikace, ve které běží jen jedno vlákno, bude běžet stejně rychle na jednojádrovém i vícejádrovém procesoru.

Shrnutí

  • HALT je instrukce, kterou operační systém v procesoru spouští, pokud zrovna nemá co dělat. Tato instrukce na velmi krátký časový úsek procesor pozastaví.
  • Procesor, nebo jádro procesoru, zpracovává instrukce vlákna v sérii = za sebou = nejdřív zpracuje jednu instrukci a pak tu, která za ní následuje.
  • Multithreading je schopnost spouštět několik vláken na jednou – ve skutečnosti operační systém neustále přepíná přidělený čas procesoru běžícím vláknům. Tomuto přepínání se říká context switch.
  • Moderní procesory jsou ve skutečnosti „multiprocesory“ – je to několik procesorů najednou. Těmto podprocesorům se říká „jádra“.
  • Operační systém určuje, jaké vlákno běží v jakém jádře.