IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

1. diel - Úvod do viacvláknových aplikácií v C a C ++

Vitajte u prvej lekcie kurzu o programovaní viacvláknových aplikácií čiže multithreadingu v C ++ a C. Naučíme sa tu plne využívať moderné viacjadrové procesory a tiež spúšťať na pozadí úlohy, ktoré by inak zasekli hlavné vlákno aplikácie.

Úvod do teórie vlákien

Než začneme používať vlákna, popíšme si akým spôsobom spúšťa naša aplikácia operačný systém. Všetky moderné operačné systémy (Windows, Linux i MacOS) sú viacúlohový. To znamená, že dokážu spustiť viac aplikácií (úloh) naraz. To ale neplatí pre procesor samotný. Zjednodušene môžeme povedať, že jedno jadro procesora dokáže spustiť len jednu inštrukciu v jeden čas. Na druhej strane niektorí z vás vedia, že väčšina operačných systémov dokázala spúšťať viacero aplikácií naraz dlho predtým, než boli na trhu viacjadrové procesory a aj teraz si môžete spustiť neobmedzené množstvo aplikácií (alebo minimálne rozumné množstvo), a to bez ohľadu na to, kolikajádrový procesor vlastníte. Ako je to možné?

Viacvláknové aplikácie v C ++ - Paralelné programovanie a viacvláknové aplikácie v C ++

Operačný systém medzi spustenými aplikáciami jednoducho rýchlo prepína (presnejšie to robí tzv. Plánovač, anglicky scheduler ao prepínanie hovoríme ako o zmene Contextu, anglicky context switching). Systém jednu aplikáciu zastaví a spustí na okamih aplikáciu inú. Užívateľ to vníma ako by aplikácia bežali naraz, aj keď to tak v skutočnosti nie je. S príchodom viacjadrových procesorov sa princíp nezmenil, operačný systém stále prepína medzi aplikáciami, ale môže ich nechať bežať viac súčasne (v závislosti od počtu jadier).

Aplikácie, proces a vlákno

Zamyslime sa nad termíny aplikácie, proces a vlákno. Aplikáciu si iste dokážeme predstaviť, je to napr. Internetový prehliadač, v ktorom čítate tento článok. Čo je však proces a čo vlákno?

Proces

Proces je inštancia bežiace aplikácie. Pokiaľ si spustíme 3x kalkulačku, nájdeme v správcovi úloh 3x proces calc.exe (ostatné platformy prepáčia). Niektoré zložitejšie aplikácie môžu využívať niekoľko procesov, napr. Google Chrome vytvorí proces pre každú otvorenú záložku. Operačný systém medzi sebou jednotlivé procesy izoluje, to znamená, že procesy na seba navzájom nevidia (napríklad jeden proces nevidí do pamäti iného procesu). Komunikácia medzi procesmi sa potom musí riešiť cez operačný systém a jedná sa o zložitejšie problematiku, ktorou sa tu nebudeme zaoberať. Nakoniec len dodám, že väčšina aplikácií používa iba jeden proces, vzhľadom k tomu, že procesy môžu využívať viac vlákien.

Správca úloh Windows - Paralelné programovanie a viacvláknové aplikácie v C ++

Vlákno

V procese môže bežať niekoľko vlákien. Každá aplikácia má minimálne jeden proces, v ktorom beží minimálne jedno vlákno (tzv. Hlavnej vlákno). Zatiaľ, čo hlavný vlákno máme pripravené od operačného systému, ďalšie vlákna si vytvárame sami. Operačný systém spustí naše vlákno na nejakom jadre procesora a potom ho rýchlo uspáva a prebúdza (v dôsledku prepínanie) ako sa mu to zrovna hodí. Vo výsledku nám vlákna v procese beží paralelne a môžeme napr. Vykonávať nejaké zložité analýzy, bez toho aby sme zasekli hlavné vlákno aplikácie a to dokonca aj v niekoľkých vláknach naraz, pričom bude samotný výpočet niekoľkokrát rýchlejšie.

Na rozdiel od procesov, vlákna sú "ľahšie" jednotkou. Vlákna medzi sebou nie sú nijako izolovaná. To hlavne znamená, že je pamäť medzi vláknami zdieľaná, čoho sa hojne využíva. Má to ale aj svoje nevýhody, musíme zabezpečiť, aby bol prístup do pamäte synchronizovaný, tj. Aby napríklad jedno vlákno nezapisoval tam, odkiaľ druhé vlákno zrovna číta. Ďalšou nevýhodou je, že chyba v jednom vlákne ukončí celý proces a teda aj všetky ostatné vlákna.

Synchronizácia

Zvýšenie výkonu, priepustnosti, odozvy a ďalších atribútov aplikácie znie skvele, že? Vlákna sa však v praxi používajú naozaj len pokiaľ je nutne potrebujeme. Je s nimi totiž spojený jeden obrovský problém a tým je synchronizácia. Nikdy nevieme, kedy budú naše vlákna uspanie, systém to vykoná bez ohľadu na to, čo dané vlákno práve robí. Asi si dokážeme predstaviť, že sa metóda vlákna zasekne na nejakom riadku zdrojového kódu. V skutočnosti sa však môže zaseknúť aj napr. V polovici sčítanie, pretože na 32-bitovom procesore sú ku sčítanie 64bitových čísel potrebné 2 inštrukcie. Ak túto hodnotu použijeme iným vláknom, môže v nej byť nezmysel. Ukazovatele sa tiež v jadrách procesora cachují, takže sa môže stať, že má v rovnaký čas rovnaká premenná niekoľko rôznych hodnôt. K problémom synchronizácia sa dostaneme počas kurzu pomerne podrobne a naučíme sa je tiež riešiť.

Vlákna určite nie sú niečo, čo by každá aplikácia musela nutne obsahovať a hoci sa inžinieri snažia čo môžu, aby prácu s nimi čo najviac zjednodušili (a že sa im to darí), stále vo výsledku aplikácii skomplikujú (a v horšom prípade aj môžu aplikáciu degradovať ). Určite je používajte s rozvahou a iba ak k tomu máte dôvod.

Vlákna v C a C ++

Situácia s vláknami je v C a C ++ trochu komplikovaná. Je to dané historickým vývojom a hlavne faktom, že C je hlavný jazyk pre programovanie operačného systému. Z historického hľadiska bolo niekoľko snáh o zavedenie tzv. Multitasking systémov (teda schopných spustiť niekoľko úloh súčasne). K tomu boli použité rôzne technológie (námatkovo vymenujme napríklad nepreemptivní plánovanie alebo vlákna implementovaná v užívateľskom priestore, kedy operačný systém o vláknach vôbec nevedel).

Táto a ďalšie rozhrania sa v niektorých prípadoch dochovala až do dnešných dní. Napríklad v linuxovom svete sa môžete stále stretnúť s označením lightweight process, ktorý nie je nič iné ako označenie vlákna (ang. Thread), ktoré sa zachovalo z minulosti. Z tohto (a milióna ďalších) dôvodov je rozhranie pre prácu s vláknami roztrieštené. Konkrétne sa v kurze pozrieme na tieto rozhrania:

  • Knižnica threads.h, ktorá je určená pre C a je pridaná v štandarde C11. Každý kompiler, ktorý podporuje C11, by mal byť schopný túto knižnicu použiť bez ohľadu na operačný systém, pre ktorý programujeme.
  • Knižnica thread. Toto je knižnica, ktorá je určená pre C ++, pretože programátori v C ++ chcú pracovať s objektmi. Bola pridaná v štandarde C ++ 11 a mala by ponúknuť rovnakú funkcionalitu na všetkých platformách.
  • Knižnica pthread čiže POSIX threads. Ide opäť o knižnicu pre C a je de facto štandardnou knižnicou pre prácu s vláknami pre UNIX-like operačné systémy (teda Linux a MacOS).
  • Windows Threading Library je určená pre jazyk C a operačný systém Windows.

Spomínané knižnice sa medzi sebou líšia viac, než by sme si my ako programátori priali. Čo sa vytváranie a práca sa vláknami týka, knižnice sú takmer identické (konieckoncov, vytváranie a mazanie vlákna je potreba všade). Rozdiel nastáva v synchronizačných entitách (tj. V objektoch, ktoré riadia synchronizáciu medzi vláknami). Rôzne knižnice poskytujú rôzne prostriedky, ktoré môžu v iných knižniciach chýbať.

Primárne sa budeme zaoberať knižnicou thread pre C ++. Po prebratí základov sa pozrieme na ostatné knižnice a povieme si, čo u nich chýba alebo čo naopak ponúkajú navyše. Ako v ďalších lekciách uvidíme, tieto rozdiely nie sú zas tak drastické, ako by sa na prvý pohľad mohlo zdať. Spoznáme totiž, že nám stačí iba jeden synchronizačný mechanizmus (ktorý poskytujú všetky knižnice) na to, aby sme dokázali prepísať všetky ostatné. Použitie inej knižnice nám potom môže ušetriť nejaký čas, ale rozhodne kvôli tomu nebudeme musieť prepísať celý projekt.

Kurz ukončíme niekoľkými praktickými príkladmi, kde si ukážeme najčastejšou viacvláknové návrhové vzory, vysvetlíme si ako fungujú a použijeme ich v nejakej zjednodušené aplikácii.

V budúcej lekcii, Prvý viacvláknové aplikácie v C ++ , sa pozrieme na vytváranie vlákien na rôznych platformách.


 

Všetky články v sekcii
Paralelné programovanie a viacvláknové aplikácie v C ++
Preskočiť článok
(neodporúčame)
Prvý viacvláknové aplikácie v C ++
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
1 hlasov
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity