Процес проти ниток, апаратні нитки проти програмних ниток, гіпертрейдинг У сучасному світі високопродуктивного і реактивного програмного забезпечення, Незалежно від того, чи будуєте ви двигун торгівлі в реальному часі, ігровий двигун або простий веб-сервер, розуміння того, як виконувати завдання паралельно, може значно поліпшити продуктивність та досвід користувача. Вступає в гру. concurrency threading У наших попередніх блогах ми досліджували і різноманітні Тепер, коли ми заклали основи, настав час вийти за рамки теорії і зануритися в основне питання: Якщо ви ще не прочитали ті попередні історії, я настійно рекомендую перевірити їх спочатку для кращого контексту. Таксономія Флінна Паралельні моделі програмування Що саме є нитка, і що вона робить? Таксономія Флінна Таксономія Флінна Паралельні моделі програмування Паралельні моделі програмування Що саме є нитка, і що вона робить? завантажити файли під час оновлення інтерфейсу користувача, обчислити результати під час відповіді на вхід користувача або паралельно обробляти вхідні мережеві запити. , а мови програмування, такі як C++, надають потужні інструменти, щоб скористатися ними. Загроза дозволяє програмам робити більше ніж одну річ одночасно: hardware threads Загроза дозволяє програмам робити більше ніж одну річ одночасно: Незалежно від того, чи є ви новим у мультитрейдингу або хочете зміцнити свої фундаменти, ця історія дасть вам міцний початок. Основні теги: Threads vs processes Hardware threads vs Software Threads Hyperthreading Fork/join threading model What Is a Thread? Що таке Thread? Однією з перших перешкод для початківців, щоб дізнатися про конкуренції, є розуміння . difference between a thread and a process А Вона має власний простір пам'яті, описи файлів та системні ресурси, ізольовані від інших процесів. Наприклад, коли ви відкриваєте браузер або термінал, ви запускаєте новий процес. process А , з іншого боку, є найменшою одиницею виконання в процесі. Кілька ниток можуть існувати в одному процесі, працюючи одночасно і ділячись тим же простором пам'яті.Це спільне середовище дозволяє швидше спілкуватися між нитками, але також відкриває двері до та Якщо не правильно управляти. thread race conditions synchronization issues Концептуально, ви можете подумати про нитку як про - незалежний потік виконання з власним , І Але поділитися З іншими трендами в тому ж процесі. lightweight process program counter registers stack heap and global memory Під час обговорення теми важливо відрізнити між та Незважаючи на те, що вони обидва посилаються на «одиниці виконання», вони працюють на дуже різних рівнях в обчислювальному стеку. hardware threads software threads What is a Hardware Thread? Що таке Hardware Thread? А Це екзекуційний потік Це фактично а в ядрі, яке може самостійно отримувати, декодувати і виконувати потік інструкцій. hardware thread directly supported by the processor dedicated control unit Традиційно — іншими словами, одна контрольна одиниця на фізичний процесор. На системах з декількома роз'ємами (наприклад, на серверних материнських платах) Але ця модель швидко розвивалася з введенням та Архітектурні проекти . one processor equaled one hardware thread one hardware thread per socket multi-core multi-threaded У сучасних вугіллях: Кожне ядро містить принаймні один апаратний струм. З Simultaneous Multithreading (SMT) — версією Intel під назвою Hyper-Threading — одне ядро може підтримувати кілька апаратних ниток. Тепер один процесор (сокет) може мати кілька ядер, і кожне ядро може мати кілька ниток апаратного забезпечення. Щоб додати до плутанини, багато Отже, коли ви перевіряєте інформацію про процесор за допомогою системних інструментів, кількість показаних "процесорів" може посилатися на логічні нитки, а не на фізичні ядра або розетки. operating systems report hardware threads or logical cores as “processors.” Як перевірити кількість апаратних ниток, які у мене є? Windows Windows Є кілька способів перевірити кількість апаратних ниток на Windows, але не хвилюйтеся, це не один з тих "10 способів зробити це" блог-постів. Використання Голова до Таб і вибір . Task Manager Ctrl + Shift + Esc Performance CPU Ви побачите резюме, яке включає в себе кількість та (тобто, хардверні нитки). Він виглядає дещо так: cores logical processors Інші варіанти, якщо ви хочете досліджувати самостійно: PowerShell: Alternative 1: Альтернатива 1: (Get-WmiObject -Class Win32_Processor).NumberOfLogicalProcessors Command Prompt (requires wmic): Alternative 2: Альтернатива 2: wmic cpu get NumberOfLogicalProcessors,NumberOfCores 2 Лінукс 2 Лінукс Якщо ви використовуєте будь-який смак Linux, можна перевірити конфігурацію вашої системи і кількість апаратних ниток, прочитавши Вихід дає один запис для кожної нитки обладнання. Один запис цього файлу виглядає так: /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: ... Кілька речей, які слід відзначити з цього: CPU ядра: Це може бути хибним для гібридних архітектур, оскільки це число може не відображати фактичне число ядер (наприклад, мій Intel i5-13 Gen має 10 ядер: 6 P-ядер + 4 E-ядра, але він показує 8 ядер). брати і сестри: відноситься до загальної кількості логічних ниток. Наявність флага ht (скорочення для Hyper-Threading) підтверджує, що SMT підтримується. Існує кілька альтернатив цій команді, які також дають більш чіткий вихід: Альтернатива 1: Lscpu Альтернатива 1: Lscpu Я отримав наступний результат для : 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 Альтернатива 2: hwloc (lstopo) Альтернатива 2: hwloc (lstopo) Ще одним корисним інструментом для перевірки топології CPU вашої системи є популярний інструмент Linux. , який забезпечує як командний ряд, так і графічні представлення вашого апаратного розташування. Це особливо зручно для візуалізації ядер, апаратних ниток, рівнів кешу та вузлів NUMA. hwloc Якщо hwloc вже встановлено, ви можете створити візуальну карту архітектури вашої системи за допомогою Команди : lstopo Що таке гіпертривога? Hyper-Threading (HT) - це впровадження Intel Simultaneous Multithreading (SMT), що дозволяє кожному фізичному ядреві одночасно виконувати два потоки інструкцій.Коли одна нитка зупиняється (наприклад, чекає на пам'ять), інша може використовувати одиниці виконання. Краще використання CPU - Поліпшення продуктивності в I/O-bound або багатозадачних робочих навантаженнях Але: він не подвоює продуктивність - типові прибутки становлять близько 15-30%. Застосування паралельного програмування: Хоча HT сприяє повсякденному багатозадачному виконанню (наприклад, виконанню декількох програм на ноутбуці), це може негативно вплинути на продуктивність в HPC або паралельних робочих навантаженнях. Приклад — i5–13450HX: 6 P-ядер з HT → 12 ниток 4 Е-ядра без HT → 4 нитки ➡️ Всього = 16 логічних ниток What is Hyper-Threading? Hyper-Threading (HT) - це впровадження Intel Simultaneous Multithreading (SMT), що дозволяє кожному фізичному ядрі працювати. одночасно. Коли одна нитка зупиняється (наприклад, чекає на пам'ять), інша може використовувати одиниці виконання. two instruction streams Краще використання CPU - Поліпшення продуктивності в I/O-bound або багатозадачних робочих навантаженнях Це не подвоює продуктивність - типові прибутки є навколо . But 15–30% Caution for parallel programming: Хоча HT сприяє повсякденному багатозадачному виконанню (наприклад, виконанню декількох програм на ноутбуці), це може негативно вплинути на продуктивність в HPC або паралельних робочих навантаженнях. Example — i5–13450HX: 6 P-ядер з HT → 12 ниток 4 Е-ядра без HT → 4 нитки ➡️ Total = 16 logical threads Understanding Software Threads: The Foundation Розуміння програмних потоків: Фонд На відміну від апаратних ниток, які існують на рівні процесора, програмні нитки Вони представляють собою незалежні потоки виконання в межах процесу. . programming abstractions Програмна нитка, по суті, є легкою одиницею виконання, яка існує всередині процесу, розділяючи той самий адресний простір, зберігаючи свій власний контекст виконання. Програмна нитка, по суті, є легкою одиницею виконання, яка існує всередині процесу, розділяючи той самий адресний простір, зберігаючи свій власний контекст виконання. Коли ви створюєте програмну нитку у своєму коді, операційна система і середовище Runtime працюють разом, щоб охарактеризувати її на доступних Це мапірування є динамічним і залежить від планувальника ниток, який визначає, коли і де працює кожен ниток. Хардверні тріади Хардверні тріади Різниця між програмними та апаратними нитками є вирішальною. апаратні нитки представляють фізичні одиниці виконання, доступні на вашому процесорі, в той час як програмні нитки є абстракцією, з якою працюють програмісти. Відмінність між програмними та апаратними нитками має вирішальне значення.Технологічні нитки представляють фізичні одиниці виконання, доступні на вашому процесорі, а програмні нитки є абстракцією, з якою працюють програмісти. A single hardware thread can execute multiple software threads over time through context switching, and modern systems often support thousands of software threads running concurrently. The Evolution From Processes to Threads Еволюція від процесів до ниток Щоб зрозуміти, чому було введено нитки, ми повинні спочатку вивчити традиційну модель процесу.Операційні системи історично керували процесами як первинною одиницею виконання, де кожен процес мав: Один поток виконання, що виконується послідовно Повна ізоляція з окремими адресними просторами, описами файлів та ідентифікаторами користувачів Комунікація тільки через механізми міжпроцесової комунікації (IPC) Надлишок важких ресурсів через повне дублювання процесу Threading був запроваджений, щоб вирішити обмеження цієї моделі, орієнтованої на процеси, дозволяючи більш тонкі зразки однорідності. Threads надають кілька ключових переваг: 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 Спрощений обмін даними 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 Ресурсна ефективність 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 Підвищена реактивність 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 Планування рівня операційної системи Thread Architecture and Memory Model Архітектура і модель пам'яті Кожна нитка підтримує свій власний контекст приватного виконання, обмінюючись певними ресурсами з іншими нитками в тому ж процесі. Приватні ресурси Thread Кожен трейлер має свою: Блок керування нитками (TCB), що містить ідентифікатор нитки, лічильник програми, набір реєстру та інформацію про планування Пам'ять для локальних змінних та управління функціями викликів Програма Counter відстежує поточну інструкцію, яка виконується Блок контролю за нитками (TCB) Стак пам'яті Програма Counter Спільні ресурси Всі нитки в процесі поділяються: 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 Код розділу Секція даних Гарна пам'ять Опис файлів Ця модель спільної пам'яті є як силою, так і викликом.Хоча вона дозволяє ефективне спілкування, вона також вводить необхідність ретельного синхронізації, щоб запобігти гонкам даних і забезпечити безпеку ниток. Ця модель спільної пам'яті є як силою, так і викликом.Хоча вона дозволяє ефективне спілкування, вона також вводить необхідність ретельного синхронізації, щоб запобігти гонкам даних і забезпечити безпеку ниток. The Fork/Join Model: Structured Parallelism Модель Fork/Join: структурований паралелізм Модель fork/join являє собою найпоширеніший зразок для структурованого паралельного програмування. Ця модель забезпечує чисту абстракцію для розподілу роботи між кількома нитками і збору результатів. Послідовний старт: основний ниток починає виконуватися послідовно Форк-фаза: коли потрібна паралельна робота, головна нитка створює (форкує) нові нитки, кожна починаючи з певної функції Паралельне виконання: як основні, так і породжені нитки виконуються одночасно, потенційно на різних апаратних нитках Фаза приєднання: головна нитка чекає на завершення всіх вироджених ниток, перш ніж продовжувати Секвенційне продовження: виконання продовжується послідовно з результатами паралельної роботи Початок послідовності Форк фази Паралельне виконання: Приєднуйтесь до етапу: Продовження послідовності: What’s Next? Що буде далі? Тепер ми досягли кінця третього розділу цієї багатопровідної серії. Дотепер ми охопили основні концепції ниток і процесів, даючи вам міцний фундамент, на якому можна будувати.У наступній частині ми перейдемо від теорії до практики та дослідимо світ ниток в дії. та , де ми напишемо реальний код, проаналізуємо вихід, і зрозуміємо, як ці бібліотеки приносять співпрацю до життя. POSIX threads (pthreads) C++ std::thread Suggested Reads Рекомендовані читачі [1] Наприклад Багатопровідна комп'ютерна архітектура: резюме стану мистецтва [2] Наприклад Розподілені обчислювальні системи: принципи, алгоритми та системи — Кшемкаліані і Сінгал (uic.edu)