Process vs Threads, Hardware Threads vs Softvérové Threads, Hyperthreading V dnešnom svete vysoko výkonného a responzívneho softvéru, Či už budujete obchodný engine v reálnom čase, herný engine alebo jednoduchý webový server, pochopenie toho, ako vykonávať úlohy paralelne, môže dramaticky zlepšiť výkon a užívateľský zážitok. Prichádza do hry. concurrency threading V našich predchádzajúcich blogoch sme skúmali a rôzne Teraz, keď sme položili základy, je čas presunúť sa nad rámec teórie a ponoriť sa do základnej otázky: Ak ste tie predchádzajúce príbehy ešte nečítali, dôrazne odporúčam, aby ste ich najprv skontrolovali pre lepší kontext. Flynnova taxonómia paralelné programovacie modely Čo presne je thread a čo robí? Flynnova taxonómia Flynnova taxonómia paralelné programovacie modely paralelné programovacie modely Čo presne je thread a čo robí? Stiahnite si súbory pri aktualizácii rozhrania používateľa, vypočítajte výsledky pri odpovedi na vstupy používateľov alebo paralelne spracujte prichádzajúce sieťové požiadavky. , a programovacie jazyky ako C++ poskytujú výkonné nástroje na ich využitie. Hrozba umožňuje programom vykonávať viac ako jednu vec naraz: hardware threads Hrozba umožňuje programom vykonávať viac ako jednu vec naraz: Či už ste nováčik na multithreading alebo chcete posilniť svoje základy, tento príbeh vám dá pevný začiatok. Najdôležitejšie: Threads vs processes Hardware threads vs Software Threads Hyperthreading Fork/join threading model What Is a Thread? Čo je to hrozba? Jednou z prvých prekážok pre začiatočníkov, ktorí sa učia o konkurencii, je pochopenie . difference between a thread and a process a je nezávislý program, ktorý sa spúšťa. má svoj vlastný pamäťový priestor, popisníky súborov a systémové zdroje, ktoré sú izolované od iných procesov. Napríklad, keď otvoríte prehliadač alebo terminál, spustíte nový proces. Operačný systém spravuje procesy a nezdieľa pamäťový priestor, pokiaľ nie je na to výslovne nakonfigurovaný. process a , na druhej strane, je najmenšou jednotkou vykonávania v rámci procesu. viaceré vlákna môžu existovať v rámci toho istého procesu, bežia súčasne a zdieľajú rovnaký pamäťový priestor. Toto zdieľané prostredie umožňuje rýchlejšiu komunikáciu medzi vláknami, ale tiež otvára dvere na a Ak nie je riadený správne. thread race conditions synchronization issues Koncepčne môžete premýšľať o vlákne ako o - nezávislý prúd vykonávania s vlastným , , , a Ale zdieľanie s inými vláknami v rovnakom procese. lightweight process program counter registers stack heap and global memory Pri diskusii o vláknach je dôležité rozlišovať medzi a Hoci sa obe označujú ako „jednotky výkonu“, fungujú na veľmi odlišných úrovniach v počítačovej hromade. hardware threads software threads What is a Hardware Thread? Čo je Hardware Thread? a Je to exekučný prúd V skutočnosti je a v jadre, ktoré môže nezávisle vyzdvihnúť, dekódovať a vykonať tok pokynov. hardware thread directly supported by the processor dedicated control unit tradične sa, — inými slovami, jedna riadiaca jednotka na fyzický procesor. Na systémoch s viacerými zásuvkami (napr. serverové základné dosky) by Tento model sa rýchlo vyvíjal s zavedením a a architektúry. one processor equaled one hardware thread one hardware thread per socket multi-core multi-threaded V moderných CPU: Každé jadro obsahuje aspoň jeden hardvérový drôt. S simultánnym multithreading (SMT) - verzia spoločnosti Intel nazývaná Hyper-Threading - jedno jadro môže podporovať viacero hardvérových prameňov. Teraz jeden procesor (socket) môže mať viac jadier a každé jadro môže mať viacero hardvérových prameňov. Ak chcete pridať k zmätku, mnohí Takže keď skontrolujete informácie o CPU pomocou systémových nástrojov, počet zobrazených "procesorov" sa môže týkať logických prameňov, nie fyzických jadier alebo zásuviek. operating systems report hardware threads or logical cores as “processors.” Ako môžem skontrolovať počet hardvérových prameňov, ktoré mám? Okná Okná Existuje niekoľko spôsobov, ako skontrolovať počet hardvérových prameňov v systéme Windows, ale nebojte sa, toto nie je jeden z tých "10 spôsobov, ako to urobiť" blogových príspevkov. Používanie Hlavu do TAB a SELECT . Task Manager Ctrl + Shift + Esc Performance CPU Budete vidieť súhrn, ktorý zahŕňa počet a (tj, hardvérové pramene). Vyzerá to niečo takéto: cores logical processors Ďalšie možnosti, ak by ste chceli preskúmať sami: PowerShell: Alternative 1: Alternatíva 1: (Get-WmiObject -Class Win32_Processor).NumberOfLogicalProcessors Command Prompt (requires wmic): Alternative 2: Alternatíva 2: wmic cpu get NumberOfLogicalProcessors,NumberOfCores 2. linuxová 2. linuxová Ak používate akúkoľvek chuť Linuxu, konfiguráciu vášho systému a počet hardvérových prameňov môžete skontrolovať čítaním Výstup dáva jeden záznam pre každý hardvérový prameň. Jeden záznam tohto súboru vyzerá takto: /proc/cpuinfo ~$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 183 model name : 13th Gen Intel(R) Core(TM) i5-13450HX stepping : 1 microcode : 0xffffffff cpu MHz : 2611.201 cache size : 20480 KB physical id : 0 siblings : 16 core id : 0 cpu cores : 8 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 28 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni vnmi umip waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities vmx flags : vnmi invvpid ept_x_only ept_ad ept_1gb tsc_offset vtpr ept vpid unrestricted_guest ept_mode_based_exec tsc_scaling usr_wait_pause bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs retbleed eibrs_pbrsb rfds bhi bogomips : 5222.40 clflush size : 64 cache_alignment : 64 address sizes : 39 bits physical, 48 bits virtual power management: ... Z toho je potrebné poznamenať zopár vecí: CPU jadrá: To môže byť zavádzajúce pre hybridné architektúry, pretože toto číslo nemusí odrážať skutočný počet jadrá (napríklad, môj Intel i5-13 generácie má 10 jadrá: 6 P-jadry + 4 E-jadry, ale to ukazuje 8 jadrá). súrodenci: Odkazuje na celkový počet logických prameňov. Prítomnosť vlajky ht (skratka pre Hyper-Threading) potvrdzuje, že SMT je podporovaný. Existuje niekoľko alternatív k tomuto príkazu, ktoré tiež poskytujú jasnejší výstup: Alternatíva 1: Lscpu Alternatíva 1: Lscpu Dostávam nasledujúci výstup pre : lscpu ~$ lscpu | grep -E 'Core|Socket|Thread' Model name: 13th Gen Intel(R) Core(TM) i5-13450HX Thread(s) per core: 2 Core(s) per socket: 8 Socket(s): 1 Alternatíva 2: hwloc (lstopo) Alternatíva 2: hwloc (lstopo) Ďalším užitočným nástrojom na kontrolu topológie CPU vášho systému je populárny nástroj Linux , ktorý poskytuje ako príkazový riadok, tak grafické reprezentácie vášho hardvérového rozloženia.Je obzvlášť užitočný pre vizualizáciu jadier, hardvérových prameňov, úrovní vyrovnávacej pamäte a uzlov NUMA. hwloc Ak je hwloc už nainštalovaný, môžete vytvoriť vizuálnu mapu architektúry systému pomocou Na príkaz: lstopo Čo je to Hyper-Threading? Hyper-Threading (HT) je implementácia Intel Simultaneous Multithreading (SMT), ktorá umožňuje každému fyzickému jadru spustiť dva príkazové toky súčasne.Keď jeden prameň zastaví (napr. čaká na pamäť), druhý môže použiť výkonné jednotky. Lepšie využitie CPU - Zlepšený výkon pri I/O alebo multitaskingových pracovných zaťaženiach ⚠ Ale: Nezdvojnásobuje výkon – typické zisky sú okolo 15–30%. Upozornenie na paralelné programovanie: Zatiaľ čo HT využíva každodenné multitasking (napr. spustenie viacerých programov na notebooku), môže negatívne ovplyvniť výkon v HPC alebo paralelných pracovných zaťaženiach. Spustenie viacerých ťažkých prameňov na tom istom jadre môže viesť k konfliktom s zdrojmi a znížiť zrýchlenie. Príklad – i5–13450HX: 6 P-jadrov s HT → 12 prameňov 4 E-jadre bez HT → 4 vlákna ➡️ Celkom = 16 logických prameňov What is Hyper-Threading? Hyper-Threading (HT) je implementácia Intel Simultaneous Multithreading (SMT), ktorá umožňuje každému fyzickému jadru spustiť Keď jeden prameň zastaví (napr. čaká na pamäť), druhý môže použiť vykonávacie jednotky. two instruction streams Lepšie využitie CPU - Zlepšený výkon pri I/O alebo multitaskingových pracovných zaťaženiach ⚠ Ale: Nezdvojnásobuje výkon – typické zisky sú okolo 15–30%. Caution for parallel programming: Zatiaľ čo HT využíva každodenné multitasking (napr. spustenie viacerých programov na notebooku), môže Spustenie viacerých ťažkých prameňov na tom istom jadre môže viesť k a znížiť rýchlosť. to je dôvod, prečo Starostlivé plánovanie prameňov je na systémoch SMT kritické. negatively affect performance in HPC or parallel workloads resource contention many HPC centers disable HT by default Example — i5–13450HX: 6 P-jadrov s HT → 12 prameňov 4 E-jadre bez HT → 4 vlákna ➡️ Total = 16 logical threads Understanding Software Threads: The Foundation Pochopenie softvérových štruktúr: nadácia Na rozdiel od hardvérových vlákien, ktoré existujú na úrovni procesora, softvérové vlákna sú ktoré predstavujú nezávislé toky vykonávania v rámci procesu. . programming abstractions Softvérový prameň je v podstate ľahká vykonávacia jednotka, ktorá existuje v rámci procesu a zdieľa rovnaký adresný priestor pri zachovaní vlastného kontextu vykonávania. Softvérový prameň je v podstate ľahká vykonávacia jednotka, ktorá existuje v rámci procesu a zdieľa rovnaký adresný priestor pri zachovaní vlastného kontextu vykonávania. Keď vo svojom kóde vytvoríte softvérový prameň, operačný systém a prostredie spustenia pracujú spoločne, aby ho mapovali na dostupné Toto mapovanie je dynamické a závisí od plánovača prameňov, ktorý určuje, kedy a kde sa každý prameň spustí. Hardvérové drôty Hardvérové drôty Hardvérové pramene predstavujú fyzické vykonávacie jednotky dostupné na vašom procesore, zatiaľ čo softvérové pramene sú abstrakciou, s ktorou programátori pracujú.Jeden hardvérový prameň môže vykonávať viaceré softvérové pramene v priebehu času prostredníctvom prepínania kontextu a moderné systémy často podporujú tisíce softvérových prameňov bežiacich súčasne. Hardvérové pramene predstavujú fyzické vykonávacie jednotky dostupné na vašom procesore, zatiaľ čo softvérové pramene sú abstrakciou, s ktorou programátori pracujú.Jeden hardvérový prameň môže vykonávať viaceré softvérové pramene v priebehu času prostredníctvom prepínania kontextu a moderné systémy často podporujú tisíce softvérových prameňov bežiacich súčasne. The Evolution From Processes to Threads Evolúcia od procesov k prameňom Aby sme pochopili, prečo bolo zavedené šírenie, musíme najprv preskúmať tradičný procesný model.Operatívne systémy historicky spravovali procesy ako primárnu jednotku vykonávania, kde každý proces mal: Jedna exekúcia beží sekvenčne Kompletná izolácia s oddelenými adresárnymi priestormi, popismi súborov a používateľskými ID Komunikácia iba prostredníctvom mechanizmov interprocesovej komunikácie (IPC) Ťažké nadmerné využívanie zdrojov v dôsledku úplnej duplikácie procesu Threading bol zavedený s cieľom riešiť obmedzenia tohto modelu zameraného na proces tým, že umožní súbežnosť s jemnejšími zrnami. Threads poskytujú niekoľko kľúčových výhod: Simplified Data Sharing Unlike processes, threads within the same process . This eliminates the need for complex IPC mechanisms and allows for more efficient communication between concurrent execution units. share the same address space, heap, and global variables Zjednodušené zdieľanie údajov Resource Efficiency Creating a thread requires significantly fewer resources than creating a process. , while process creation involves duplicating the entire parent process address space. Thread creation typically requires only 64KB for the thread’s private data area and two system calls Efektívnosť zdrojov Enhanced Responsiveness Threads enable patterns that are essential for modern applications. Consider a web browser: one thread handles the user interface, another manages network requests, while others handle rendering and background tasks. This separation ensures that the interface remains responsive even when heavy operations are running. asynchronous behavior Zlepšená responzívnosť Operating System Level Scheduling Threads still benefit from OS-level scheduling features, including (the ability to interrupt a thread) and fair progress guarantees among threads. This provides the balance between user control and system management. preemption Plánovanie úrovne operačného systému Thread Architecture and Memory Model Architektúra a pamäťový model Každý prameň si zachováva svoj vlastný súkromný kontext vykonávania, pričom v rovnakom procese zdieľa určité zdroje s inými prameňmi. Súkromné zdroje Thread Každý kameň má svoje vlastné: Blok kontroly vlákien (TCB) obsahujúci ID vlákien, počítadlo programu, súbor registrov a informácie o plánovaní Stack pamäte pre lokálne premenné a funkčné riadenie hovorov Program Counter sleduje aktuálne vykonávané pokyny Blok na ovládanie vlákien (TCB) Stack pamäť Programy na počítanie Zdieľané zdroje Všetky pramene v procese zdieľania: containing the program instructions Code section with global and static variables Data section for dynamically allocated data Heap memory and other system resources File descriptors Sekcia kódu Data sekcia Heap pamäť Popisovanie súborov Tento model zdieľanej pamäte je silnou stránkou aj výzvou.Zatiaľ čo umožňuje efektívnu komunikáciu, zavádza aj potrebu starostlivej synchronizácie, aby sa zabránilo súťaženiu dát a zabezpečila bezpečnosť prameňov. Tento model zdieľanej pamäte je silnou stránkou aj výzvou.Zatiaľ čo umožňuje efektívnu komunikáciu, zavádza aj potrebu starostlivej synchronizácie, aby sa zabránilo súťaženiu dát a zabezpečila bezpečnosť prameňov. The Fork/Join Model: Structured Parallelism Model Fork/Join: Štruktúrovaný paralelizmus Model fork/join predstavuje najbežnejší vzor pre štruktúrované paralelné programovanie. Tento model poskytuje čistú abstrakciu pre rozdelenie práce medzi viaceré pramene a zhromažďovanie výsledkov. Sekvenčný štart: hlavný prameň začína vykonávať sekvenčne Fóra fázy: Keď je potrebná paralelná práca, hlavný prameň vytvára (forky) nové pramene, z ktorých každá začína na špecifikovanej funkcii Paralelné spustenie: Oba hlavné a zrodené pramene spustiť súčasne, potenciálne na rôznych hardvérových vlákien Pripojenie fázy: hlavný prameň čaká na dokončenie všetkých zrodených prameňov pred pokračovaním Sekvenčné pokračovanie: Vykonávanie pokračuje sekvenčne s výsledkami paralelnej práce Sekvenčný štart Fork fáza Paralelné vykonávanie: Zapojte sa do fázy: Sekvenčné pokračovanie : What’s Next? Čo je nasledujúce? Teraz sme dosiahli koniec tretej časti tejto série s viacerými prameňmi.Doteraz sme pokrývali základné pojmy prameňov a procesov, čo vám dáva pevný základ.V ďalšej časti sa posunieme z teórie do praxe a preskúmame svet prameňov v akcii. a , kde budeme písať skutočný kód, analyzovať výstupy a pochopiť, ako tieto knižnice prinášajú súbežnosť do života. POSIX threads (pthreads) C++ std::thread Suggested Reads odporúčané čítanie a) 1 Multithreaded počítačová architektúra: Zhrnutie stavu ART a) 2 Distribúcia počítačov: princípy, algoritmy a systémy - Kshemkalyani a Singhal (uic.edu)