Українська
Підсумки
Висновки
Процес – ізольований контейнер ресурсів (адресний простір, дескриптори), а потік – одиниця виконання, яку планує ОС; потоки одного процесу спільно використовують пам’ять, але мають власні стеки й контексти. Витісняльний планувальник надає потокам кванти часу за пріоритетами (класи та рівні у Windows, значення nice та алгоритм EEVDF у Linux), а спорідненість обмежує набір процесорів. Клас Process запускає процеси-обчислювачі та збирає їхній вивід і коди завершення. Клас Thread створює потоки ОС: Start, Join, фонові потоки, кооперативна зупинка прапорцем; необроблений виняток у потоці завершує процес. Пул потоків повторно використовує потоки для коротких робіт, регулює їх кількість алгоритмом hill climbing і страждає від блокувальних робіт. Розбиття масиву на N потоків дає прискорення, яке обмежують накладні витрати, пам’ять і кількість фізичних ядер, тому оптимальну кількість потоків визначають вимірюванням.
Питання для самоперевірки
- Чим процес відрізняється від потоку? Які ресурси потоки процесу мають спільно, а які окремо?
- Як переглянути кількість потоків процесу у Windows і Linux?
- Що таке перемикання контексту і чому воно має непряму вартість?
- Що таке витісняльна багатозадачність і квант часу?
- Як у Windows визначається базовий пріоритет потоку?
- Що означають значення nice у Linux? Який планувальник використовує Linux, починаючи з ядра 6.6?
- Що таке спорідненість процесорів? Як задати її в C#,
cmdіtaskset? - Як запустити процес із перенаправленням виводу та отримати код завершення?
- Як передати дані в потік і отримати результат?
- Чим основний потік відрізняється від фонового?
- Які стани має керований потік?
- Чому в .NET немає
Thread.Abortі як коректно зупинити потік? - Що відбувається з необробленим винятком у потоці?
- Для чого потрібні
ThreadLocal<T>і[ThreadStatic]? - Як працює пул потоків: черги, крадіжка роботи, hill climbing, голодування?
- Що обмежує прискорення під час розбиття масиву на N потоків?
Корисні посилання
- Керовані потоки: https://learn.microsoft.com/dotnet/standard/threading/
- Пул потоків: https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool
- Клас
Thread: https://learn.microsoft.com/dotnet/api/system.threading.thread - Клас
Process: https://learn.microsoft.com/dotnet/api/system.diagnostics.process - Пріоритети планування у Windows: https://learn.microsoft.com/windows/win32/procthread/scheduling-priorities
- Метрики середовища виконання .NET: https://learn.microsoft.com/dotnet/core/diagnostics/built-in-metrics-runtime
- Утиліта
dotnet-counters: https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-counters - Планувальник EEVDF: https://docs.kernel.org/scheduler/sched-eevdf.html
- Політики планування Linux, sched(7): https://man7.org/linux/man-pages/man7/sched.7.html
- Налагодження в Rider: https://www.jetbrains.com/help/rider/Debugging_Code.html