Що таке "нитка" (насправді)?


236

Я намагався знайти хороше визначення та зрозуміти, що таке насправді нитка .

Здається, що я, мабуть, пропускаю щось очевидне, але кожен раз, коли я читаю про те, що таке нитка, це майже кругове визначення, а-ля «нитка - це нитка виконання» або «спосіб розділити на запущені завдання». Е-е-е. Так?

З того, що я прочитав, схоже, що нитка насправді не є щось конкретне, як процес. Це насправді лише концепція. З того, що я розумію шляху це працює, процесор виконує деякі команди для програми (яка була названа в потік виконання ), а потім , коли він повинен перемкнутися на обробку для якої - небудь іншої програми для трохи, він зберігає стан в програма, яку вона зараз виконує десь (Thread Local Storage), а потім починає виконувати вказівки іншої програми. І назад, і назад. Таким чином, потік справді є лише поняттям для "одного із шляхів виконання" програми, яка зараз працює.

На відміну від процесу, який насправді є чимось - це конгломерація ресурсів тощо.

Як приклад визначення, яке мені не дуже допомогло. . .

З Вікіпедії :

"Нитка в інформатиці є короткою для потоку виконання. Нитки - це спосіб програми розділити (називається" розділити ") на дві або більше одночасно запущених завдань (або псевдо-одночасно). Нитки та процеси відрізняються від одного Операційна система для іншої, але, як правило, потік міститься всередині процесу, і різні потоки в одному процесі мають однакові ресурси, тоді як різні процеси в одній багатозадачній операційній системі цього не роблять ".

Так я маю рацію? Неправильно? Що насправді нитка?

Редагувати: Мабуть, потоку також надається власний стек викликів, так що це дещо конкретна річ .


6
«Процес» - не менш абстрактний термін.
варить

Чи локальне зберігання потоку є лише стеком виклику для потоку?
відданий


3
Відповіді нижче: абстрактні. Простіше кажучи (і змальовуючи деякі деталі): колись комп'ютерна програма могла робити лише одне. Так це зробило A, потім після цього B, потім C, потім .... У сучасних системах це не ідеально; наприклад, ви хочете продовжувати перегляд Інтернету під час завантаження файлу. Таким чином, програми тепер мають одну або декілька 'ниток'. Кожна «нитка» може робити лише одну справу одночасно, але різні нитки можуть робити речі одночасно . Нитка 1 може зробити А, потім В, потім С; нитка 2 може зробити X, тоді Y, тоді Z. B не може початися, поки A не закінчиться, але A і X можуть статися відразу.
Мохан

@Mohan, що чудово, але чим це відрізняється від процесу?
eric

Відповіді:


152

Потік - це незалежний набір значень для регістрів процесора (для одного ядра). Оскільки це включає покажчик інструкцій (він же лічильник програм), він контролює те, що виконується в якому порядку. Він також включає вказівник стека, який краще вказував на унікальну область пам'яті для кожного потоку, інакше вони будуть заважати один одному.

Нитки - це програмний блок, на який впливає потік управління (виклик функції, цикл, goto), тому що ці вказівки діють на покажчик інструкцій і належать до певного потоку. Нитки часто плануються за певною схемою пріоритетності (хоча можна створити систему з одним потоком на ядро ​​процесора; в цьому випадку кожен потік працює завжди і не потрібно планувати).

Насправді значення вказівника інструкції та інструкції, що зберігається в цьому місці, є достатнім для визначення нового значення для вказівника інструкції. У більшості інструкцій це просто просуває IP за розміром інструкції, але вказівки потоку управління змінюють IP іншими, передбачуваними способами. Послідовність значень, яку приймає IP, формує шлях виконання, переплетений через програмний код, породжуючи назву "нитка".


10
+1. Нитка - це не що інше "конкретніше", ніж набір значень регістру.
Грег Хьюгілл

6
Що таке "набір значень"? Хто вони? Як вони визначають нитку ?
Річард

20
@Richard: Точний перелік регістрів процесора залежить від архітектури, але вказівник інструкції та покажчик стека майже універсальні. Вони визначають потік, наскільки цей потік (набір значень регістру) завантажується в ядро ​​процесора, потік працює . Процесор отримує інструкції, що вимагаються потоком, і оновлює регістри потоків. Коли потрібен контекстний комутатор, процесор зберігає цей набір значень реєстру в пам'ять і завантажує набір, що належить до іншого потоку, як правило, як частина логіки обслуговування переривання.
Бен Войгт

4
Дякую Бен. Це дуже корисно.
Річард

2
Привіт thx @BenVoigt. Кілька роз’яснень, про які можуть натрапляти такі ноби, як я: що означає «регістри процесорів»? Що означає "вказівник інструкції" та "покажчик стека"?
BKSpurgeon

214

Потік - це контекст виконання, який є всією інформацією, якій потрібен процесор для виконання потоку інструкцій.

Припустимо, ви читаєте книгу і хочете зробити перерву прямо зараз, але хочете мати можливість повернутися і відновити читання з того місця, де ви зупинилися. Один із способів цього досягти - записати номер сторінки, номер рядка та номер слова. Отже, ваш контекст виконання для читання книги - це 3 числа.

Якщо у вас є сусідка по кімнаті, і вона використовує ту саму техніку, вона може взяти книгу, поки ви не користуєтесь нею, і продовжити читання з місця, де вона зупинилася. Потім ви можете взяти його назад і відновити там, де ви були.

Нитки працюють аналогічно. ЦП створює вам ілюзію, що він робить кілька обчислень одночасно. Це роблять, витрачаючи трохи часу на кожне обчислення. Це можна зробити, оскільки він має контекст виконання для кожного обчислення. Як і ви можете поділитися книгою зі своїм другом, багато завдань можуть поділитися процесором.

На більш технічному рівні контекст виконання (отже, потік) складається з значень регістрів ЦП.

Останнє: потоки відрізняються від процесів. Потік - це контекст виконання, тоді як процес - це купа ресурсів, пов'язаних з обчисленням. Процес може мати одну або багато потоків.

Уточнення: ресурси, пов'язані з процесом, включають сторінки пам'яті (усі потоки процесу мають однаковий вигляд пам'яті), дескриптори файлів (наприклад, відкриті сокети) та облікові дані безпеки (наприклад, ідентифікатор користувача, який запустив процес).


20
Кращою аналогією було б прирівняти людину до процесора (обидва щось роблять ), а книгу зрівняти з адресним простором (обидва просто існують). Таким чином, закладки в різних книгах є як нитки в різних процесах. Єдина книга з більш ніж однією закладкою була б аналогом багатопотокового процесу, що саме люди зазвичай мають на увазі, коли говорять "нитки". Він працює для однієї процесорної машини, але дещо руйнується, коли ви говорите про багатообробну обробку. Нікого не цікавить, який процесор виконує функцію f (), але не важливо, хто читає розділ 11.
Соломон повільно

@pwnall, велике спасибі за перетравлення складних концепцій для таких, як я! Чи багатопотокове читання бере участь у багатопроцесорній роботі (або паралельно запускає процес на багатьох процесорах, якщо я використовую неправильний термін)?
aerijman

51

Щоб формально визначити потік, спершу ми повинні зрозуміти межі того, де працює потік.

Комп'ютерна програма стає процесом, коли вона завантажується з якогось сховища в пам'ять комп'ютера і починає виконання. Процес може бути виконаний процесором або набором процесорів. Опис процесу в пам'яті містить життєво важливу інформацію, таку як лічильник програми, який відстежує поточну позицію в програмі (тобто, яка інструкція зараз виконується), регістри, сховища змінних, ручки файлів, сигнали тощо.

Потік являє собою послідовність таких інструкцій в рамках програми , яка може бути виконана незалежно від іншого коду. На малюнку зображено поняття: введіть тут опис зображення

Нитки знаходяться в одному і тому ж адресному просторі процесу , таким чином, значна частина інформації, що присутня в описі пам'яті процесу, може бути розподілена через нитки.

Деяку інформацію неможливо повторити, наприклад стек (вказівник стека на іншу область пам'яті на потік), регістри та дані, що стосуються потоку. Цієї інформації достатньо для того, щоб дозволити планування потоків незалежно від основного потоку програми та, можливо, одного чи більше інших потоків у програмі.

Для запуску багатопотокових програм необхідна явна підтримка операційної системи. На щастя, більшість сучасних операційних систем підтримують потоки, такі як Linux (через NPTL), варіанти BSD, Mac OS X, Windows, Solaris, AIX, HP-UX тощо. Операційні системи можуть використовувати різні механізми для реалізації багатопотокової підтримки.

Тут графічно представлено поняття.

Тут ви можете знайти більше інформації про тему. Це було і моє джерело інформації.

Дозвольте мені просто додати пропозицію приходячи від Введення в Embedded System від Едварда Лі і Seshia :

Нитки - це імперативні програми, які працюють одночасно і діляться простором пам'яті. Вони можуть отримати доступ до змінних один одного. Багато практикуючих фахівців у цій галузі використовують термін "нитки" більш вузько для позначення конкретних способів побудови програм, що діляться пам'яттю, [інші] в цілому посилаються на будь-який механізм, де імперативні програми працюють одночасно і діляться пам'яттю. У цьому широкому сенсі нитки існують у вигляді переривань майже на всіх мікропроцесорах, навіть без будь-якої операційної системи (голого заліза).


45

Процеси - це як двоє людей, які використовують два різних комп’ютери, які використовують мережу для обміну даними, коли це необхідно. Нитки схожі на двох людей, що користуються одним комп’ютером, яким не потрібно чітко ділитися даними, але повинні ретельно по черзі.

Концептуально нитки - це просто кілька бджіл-робітників, які гудуть навколо в одному адресному просторі. Кожен потік має власний стек, власний лічильник програм тощо, але всі потоки в процесі мають однакову пам'ять. Уявіть, що дві програми працюють одночасно, але вони обидва можуть отримати доступ до одних і тих же об'єктів.

Контрастуйте це з процесами. Кожен процес має свій власний адресний простір, тобто вказівник одного процесу не може використовуватися для посилання на об'єкт в іншому (якщо ви не використовуєте спільну пам'ять).

Я думаю, ключові речі, які слід зрозуміти:

  • І процеси, і потоки можуть "працювати одночасно".
  • Процеси не діляться пам'яттю (за замовчуванням), але потоки діляться всією своєю пам'яттю з іншими потоками в тому ж процесі.
  • Кожен потік у процесі має власний стек та свій власний вказівник.

Ви говорите, що "процеси не поділяють нічого (за замовчуванням)", але у вашій аналогії ви заявляєте, що "процеси - це як двоє людей, що використовують два різних комп'ютери, які використовують мережу для обміну даними, коли це необхідно".
скоєний

@commissandroider: Хороший дзвінок. Я відредагував свою відповідь, сказавши, що процеси не ділять пам’ять (за замовчуванням), але потоки ділять усю пам'ять.
Джої Адамс

36

Я буду використовувати багато тексту з книги Концепції операційних систем ABRAHAM SILBERSCHATZ, PETER BAER GALVIN та GREG GAGNE разом із власним розумінням речей.

Процес

Будь-яка програма знаходиться в комп'ютері у вигляді тексту (або коду).

Ми підкреслюємо, що програма сама по собі не є процесом. Програма - це пасивна сутність, наприклад файл, що містить перелік інструкцій, що зберігаються на диску (часто їх називають виконуваним файлом).

Коли ми запускаємо програму, ми створюємо екземпляр виконання. Цей екземпляр виконання називається процесом. EDIT: (Відповідно до моєї інтерпретації, аналогічно класу та екземпляру класу; примірник класу є процесом.)

Приклад процесів - це Google Chrome. Коли ми запускаємо Google Chrome, породжуються три процеси:

• Процес браузера відповідає за керування інтерфейсом користувача, а також дисковим і мережевим введенням / виведенням. При запуску Chrome створюється новий процес браузера. Створюється лише один процес браузера.

Renderer процеси містять логіку для рендеринга веб - сторінок. Таким чином, вони містять логіку обробки HTML, Javascript, зображень тощо. Як правило, для кожного веб-сайту, відкритого на новій вкладці, створюється новий процес візуалізації, і тому одночасно можуть бути активними кілька процесів рендерінгу.

• Процес підключення створюється для кожного типу плагінів (наприклад, Flash або QuickTime), які використовуються. Процеси підключення містять код для плагіна, а також додатковий код, який дозволяє плагіну спілкуватися з пов'язаними процесами рендерінгу та процесом браузера.

Нитка

Щоб відповісти на це, я думаю, ви повинні спочатку знати, що таке процесор. Процесор - це обладнання, яке фактично виконує обчислення. EDIT: (Обчислення, такі як додавання двох чисел, сортування масиву, в основному виконання написаного коду)

Тепер переходимо до визначення потоку.

Потік - це основна одиниця використання процесора ; він містить ідентифікатор потоку, лічильник програми, набір реєстру та стек.

EDIT: Визначення теми з веб-сайту Intel:

Нитка або нитка виконання - це програмний термін для основної впорядкованої послідовності інструкцій, яка може бути передана або оброблена одним ядром процесора.

Отже, якщо процес Renderer з програми Chrome сортує масив чисел, сортування відбуватиметься за потоком / потоком виконання. (Граматика щодо ниток здається мені заплутаною)

Моє тлумачення речей

Процес - це екземпляр виконання. Нитки - це фактичні працівники, які виконують обчислення через доступ до процесора. Коли для процесу працює кілька потоків, процес забезпечує загальну пам'ять.

EDIT: Інша інформація, яку я вважаю корисною, щоб надати більше контексту

У всіх сучасних комп’ютерах є кілька потоків. Кількість потоків у комп’ютері залежить від кількості ядер у комп’ютері.

Паралельні обчислення :

З Вікіпедії:

Одночасні обчислення - це форма обчислень, в якій кілька обчислень виконуються протягом періодів, що перекриваються - одночасно - замість послідовно (один завершується до наступного запуску). Це властивість системи - це може бути окрема програма, комп'ютер або мережа - і для кожного обчислення ("процес") існує окрема точка виконання або "нитка управління".

Отже, я міг би написати програму, яка обчислює суму 4 чисел:

(1 + 3) + (4 + 5)

У програмі для обчислення цієї суми (яка буде одним процесом, запущеним на потоці виконання) я можу розписати інший процес, який може працювати на іншому потоці для обчислення (4 + 5) і повертати результат у вихідний процес, тоді як вихідний процес обчислює суму (1 + 3).


5
ось справжня відповідь на угоду
Suhail Mumtaz Awan

1
Допомагав багато. Ось так виглядає пояснення.
Дінеш Кумар

Велика цінність цієї відповіді полягає в тому, що вона містить довідник, де ви можете знайти більше деталей, якщо це потрібно. Дякую @chatuur!
деса

7

На жаль, нитки існують. Нитка - щось відчутне. Ви можете вбити одного, а інші все одно будуть працювати. Ви можете створити нові теми .... хоча кожен потік - це не власний процес, вони запускаються окремо всередині процесу. На багатоядерних машинах одночасно можуть працювати 2 потоки.

http://en.wikipedia.org/wiki/Sim istovremeno_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf


1
Що це робить його "чимось відчутним"? Це просто ті дані, що зберігаються в TLS та його стеці викликів?
Річард

Що це не просто абстракція для розуміння ... Якби це справді була лише одна нитка, яка рухалася туди-сюди, маскуючись під декілька потоків, ОП було б правильно, але так, я б сказав, що ці дані зробили б це відчутним .
Орбіта

Просвіти мене. . . так що відповідь?
Річард

@ Річард, не бажаючи вступати в дискусію щодо семантики, просто сформулював мою відповідь, щоб спробувати прояснити концептуально ОП.
Орбіта

@richard Що таке TLS?
відданийандройдер

6

Потік - це не що інше, як контекст пам’яті (або як краще вкладає Tanenbaum, групування ресурсів) з правилами виконання. Це програмне забезпечення. Процесор не має поняття, що таке потік (деякі винятки тут, деякі процесори мають апаратні потоки), він просто виконує інструкції.

Ядро вводить концепцію потоку та процесу для управління порядком пам'яті та інструкцій змістовно.


5

Це було взято з відповіді Yahoo:

Потік - це конструкція кодування, яка не впливає на архітектуру програми. Один процес часто може містити кілька потоків. Нитки також можуть безпосередньо спілкуватися між собою, оскільки вони мають однакові змінні.

Процеси - це незалежні виконавчі підрозділи з власною інформацією про стан. Вони також використовують власні адресні простори і можуть взаємодіяти з іншими процесами лише за допомогою міжпроцесорних механізмів зв'язку.

Однак, простіше кажучи, нитки схожі на різні "завдання". Тож подумайте, коли ви щось робите, наприклад, ви записуєте формулу на одному папері. Це можна вважати однією ниткою. Потім іншою ниткою ви пишете щось інше на іншому аркуші паперу. Саме тут входить багатозадачність.

Кажуть, що процесори Intel мають "гіперпотоку" (AMD це теж має), і це означає, що вони зможуть виконувати кілька "потоків" або багатозадачність набагато краще.

Я не впевнений у логістиці того, як обробляється нитка. Я пам'ятаю, як слухав про те, що процесор рухається між ними назад, але я не на 100% впевнений у цьому, і, сподіваюся, хтось ще може відповісти на це.


Як процесори Intel краще обробляють кілька потоків? З одним ядром одночасно має виконуватися лише одна нитка. Я погоджуюся з процесором, який рухається вперед і назад. Ти справді не можеш так краще зробити?
прихильнийдорожник

Це оптимізація, яка дає кращі показники для деяких випадків використання. Про гіпер-нитки ви можете прочитати тут: en.wikipedia.org/wiki/Hyper-threading
Джеремі Фріснер

5

Відповідь варіюється в дуже різних системах і різних реалізацій, але найбільш важливі частини:

  1. Потік має незалежну нитку виконання (тобто ви можете переключитися з неї на контекст і повернути назад, і він відновиться там, де він був).
  2. Нитка має термін експлуатації (її можна створити іншою ниткою, а інша нитка може зачекати, поки вона закінчиться).
  3. До нього, мабуть, додається менше багажу, ніж "процес".

Крім цього: потоки можуть бути реалізовані в рамках одного процесу за допомогою мовного виконання, потоки можуть бути супровідними програмами, потоки можуть бути реалізовані в рамках одного процесу за допомогою бібліотеки потоків, або потоки можуть бути конструкцією ядра.

У кількох сучасних системах Unix, включаючи Linux, з якими я найбільше знайомий, все є потоками - процес є лише типом потоку, який розділяє порівняно мало речей зі своїм батьківським (тобто він отримує власні відображення пам'яті, власну таблицю файлів і дозволу тощо) Читання man 2 clone, особливо перелік прапорів, тут справді повчальне.


Чи є контекстний перемикач саме тоді, коли процесор переходить від однієї нитки до іншої (будь то в тому чи іншому процесі)?
відданий

-1

Я не дуже задоволений жодною з цих відповідей, тому я збираюся додати тут свою власну :) Нитка - це абстракція ядра для планування роботи над процесором, нитка - це те, що ядро ​​дає вам керувати процесорним часом і ділитися роботою з іншими


1
-1 Ядра не повинні створювати ядро. Нитки з підтримкою на рівні ядра дійсно заплановані ядром (де видається якась syscall). Але також є потоки з підтримкою на рівні бібліотеки користувачів, таблиця потоків знаходиться в просторі користувача.
ОлександрХ

-1

Дозвольте спочатку пояснити різницю між процесом та потоками.

Процес може мати {1..N} кількість потоків. Невелике пояснення щодо віртуальної пам'яті та віртуального процесора.

Віртуальна пам'ять

Використовується як обмінний простір, щоб процес думав, що він сидить на основній пам'яті для виконання.

Віртуальний процесор

Та ж концепція, що і віртуальна пам'ять, за винятком цієї процесори. Для процесу, схоже, це єдине, що використовує процесор.

ОС подбає про розподіл віртуальної пам’яті та віртуального процесора до процесу та здійснення заміни між процесами та виконання виконання.

Усі потоки в процесі будуть мати спільну віртуальну пам'ять. Але кожен потік матиме свій індивідуальний віртуальний процесор, призначений їм, щоб їх можна було виконати окремо.

Таким чином заощаджуючи пам'ять, а також використовуючи процесор для його потенціалу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.