Потік (Thread) — це одиниця роботи, яка виконується в межах процесу. У межах одного процесу може працювати кілька потоків. Потік — це не фізичне поняття, а абстракція. Потік працює як одиниця виконання для процесора (CPU) і забезпечує доступ до даних у пам'яті для виконання необхідних операцій.
Простими словами, робочі одиниці виконуються процесором у межах потоків.
Якщо уявити ресторан як процес, то працівники ресторану будуть потоками. Кожен працівник має виділені або спільно використовувані ресурси та простори, такі як персональні робочі номери, спеціальний одяг, кухонне обладнання або кімнати для відпочинку, а також загальні кухонні інструменти та зони. Так само й у потоках є свої приватні та спільно доступні області.
Вміст потоку
Потік містить наступні елементи:
Thread ID:
- Унікальний ідентифікатор потоку.
Stack:
- Особлива область пам'яті, що зберігає локальні змінні, виклики функцій та адреси повернення для кожного потоку.
Registers:
- Тимчасові обчислення потоку (наприклад, математичні операції) та регістри процесора (наприклад, лічильник програм, реєстраційні записи, вказівник стеку).
Thread State:
- Статус потоку під час його життєвого циклу (RUNNABLE, BLOCKED, WAITING, TERMINATED тощо).
Program Counter:
- Відстежує команду, що виконується потоком, та визначає місце для наступної команди. У таких мовах, як Java, програмний лічильник є абстракцією, яку емулює JVM, хоча на низькому рівні він присутній у апаратному забезпеченні процесора. Вона працює з адресами пам'яті та забезпечує незалежність між потоками. Коли потік призупиняється й відновлюється, програмний лічильник допомагає продовжити виконання з того місця, де було зупинено.
Потоки часто називають “легкими процесами” (lightweight process), тому що вони споживають менше системних ресурсів порівняно з процесами і, зазвичай, працюють у межах одного процесу. Завдяки цим властивостям потоки значно знижують витрати на перемикання контексту між процесами і можуть працювати швидше.
Перемикання контексту (context switch) — це процес, під час якого операційна система переходить від виконання одного процесу або потоку до іншого. Під час цього процесу процесор зберігає стан поточного завдання і завантажує стан нового завдання. Ця механіка є основою мультитаскінгу (multitasking) та паралелізму (concurrency).
Як і в процесі, при створенні потоку також формується структура даних Thread Control Block (TCB). TCB містить інформацію, необхідну для виконання потоку, і використовується операційною системою для відстеження його стану.
Вміст TCB
Thread Control Block містить такі елементи:
Thread ID
- Унікальний ідентифікатор потоку. Забезпечує його розпізнавання операційною системою та планувальником.
Program Counter
- Адреса поточної команди, що виконується. Використовується для визначення місця, з якого потік продовжить виконання, коли перейде до іншого потоку.
Registers
- Стан поточних регістрів процесора.
(Stack Pointer, Program Sayacı тощо) Ця інформація зберігається для того, щоб потік міг коректно продовжити виконання при повторному запуску.
Stack Pointer
- Показує верхню точку стеку, що належить потоку.
Статус потоку (Thread State)
Вказує на поточний статус потоку:
- New: Потік створений, але ще не запущений.
- Runnable: Потік готовий до виконання, але чекає на доступ до CPU.
- Running: Потік виконується на CPU.
- Blocked/Waiting: Потік чекає.
- Terminated: Потік завершено.
Пріоритет (Priority)
- Вказує на пріоритет потоку в планувальнику операційної системи. Значення пріоритету визначають порядок виконання потоків. Це значення допомагає визначити порядок виконання (до/після). (1..10)
- Thread.MIN_PRIORITY : 1
- Thread.NORM_PRIORITY :5
- Thread.MAX_PRIORITY : 10
Ресурси (Resources)
- Зберігаються дані про ресурси, що використовуються потоком: пам’ять, файли, сокети, з’єднання з базами даних, блокування (наприклад, об’єкти lock) або інші спільні ресурси та інформація про їх використання.
Інформація про синхронізацію (Synchronization Info)
- Визначає, як потоки використовують спільно доступні ресурси та порядок доступу до них.
Відносини між батьківським та дочірнім потоками (Parent and Child Thread Relations)
- Містить інформацію про батьківські потоки та дочірні потоки, які були створені потоком.
Інформація про планування (Scheduling Info)
- Показує, скільки часу потік працював на CPU або скільки ще часу він продовжить виконання.
Інформація про процес, до якого належить потік (Process Info)
- Зберігається інформація про процес, до якого належить потік. (PID)
Інформація про потоки та вміст Thread Control Block
Інформація про потоки та Thread Control Block
Інформація про потоки, така як Thread State, Thread ID, та елементи в Thread Control Block, такі як State, ID, мають відмінності. Наприклад, інформація про Process ID в потоці є на рівні програми, тоді як ID в TCB знаходиться на рівні ядра операційної системи. Інформація, що зберігається в потоці, є абстракцією, яка призначена для використання розробниками на рівні коду (у Java, ця абстракція надається JVM). Її наявність допомагає розробникам взаємодіяти з фізичними даними операційної системи.
Методи класу Thread
- Управління станом потоку та його контроль
Стани потоку (States of Thread)
- start(): Метод, що запускає потік. Стан потоку змінюється з New на Runnable.
- run(): Виконується функція, яка повинна бути виконана при запуску потоку.
- interrupt() — isInterrupted(): Перериває виконання потоку. Потік може бути розбуджений або буде викинуто InterruptedException.
- join(): Чекає завершення виконання потоку, що викликає цей метод.
- sleep(milliseconds): Призупиняє виконання потоку на певний час.
- wait(): Призупиняє виконання потоку на об'єкті. Потік потрапляє в “wait set” список і буде розбуджений при виклику notify() або notifyAll().
- yield(): Пропонує потоку тимчасово відмовитися від CPU. Це не гарантує, що інший потік буде виконуватись. Все залежить від планувальника.
2. Управління властивостями потоку
- getName(): Отримує ім’я потоку.
- setName(String name): Встановлює ім’я потоку.
- getId(): Отримує унікальний ID потоку.
- getPriority(): Отримує рівень пріоритету потоку.
- setPriority(int priority): Встановлює рівень пріоритету потоку.
- setDaemon(boolean on): Встановлює потік як daemon.
-
isDaemon(): Перевіряє, чи є потік daemon.
Отримання інформації та стану потоку (Thread) -
getState(): Отримує поточний стан потоку (NEW, RUNNABLE, BLOCKED, WAITING тощо).
-
isAlive(): Перевіряє, чи потік все ще працює.
-
currentThread(): Отримує посилання на потік, який виконується зараз.
-
enumerate(Thread[] threads): Отримує список всіх активних потоків.
-
activeCount(): Отримує загальну кількість активних потоків.
[
Що таке процес?
Процес — це екземпляр програми, що виконується в операційній системі. Це приклад часу виконання програми на CPU...
medium.com
](/@omerfarukgzl/process-nedir-8267bb090af1?source=post_page-----3f7a015c4ddb--------------------------------)
[
Що таке багатопотокове програмування?
Багатопотокове програмування — це виконання функцій одночасно або паралельно з кількома різними потоками, в окремих...
medium.com
](/@omerfarukgzl/multithread-programlama-nedir-e8e4d153809b?source=post_page-----3f7a015c4ddb--------------------------------)
Вони сказали: “Ми хвалимо Тебе, адже ми не знаємо нічого, окрім того, що Ти нам повідомив. Безсумнівно, Ти є наймудрішим і найвідомішим.” (Бакара 32)
Перекладено з: Thread Nedir?