Як я можу мати 1805 потоків, коли у мене є лише 4 віртуальні процесори?


10

Мені було цікаво, чи може хтось пояснити мені, як у моєму Моніторі активності написано, що в мене зараз 1805 тем Знімок екрана OS X Monitor Monitor

Але у мене на комп’ютері є лише 4 віртуальних ядра (це означає, що я повинен мати лише 4 потоки). Чи означає кількість потоків усі потоки, якими обробляються процесори, коли вони вирішують, який потік виконати?

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


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
bmike

Відповіді:


24

Планування

Ваші 1805 потоки не запускаються одночасно . Вони торгують. Одне ядро ​​запускає трохи потоку, а потім відкладає його для виконання трохи іншого потоку. Інші сердечники роблять те ж саме. Круглі та круглі, нитки виконуються трохи за раз, не всі відразу.

Основна відповідальність операційної системи (Darwin та macOS) полягає в плануванні того, який потік потрібно виконати на якому ядрі на скільки часу.

Багато ниток не мають ніякої роботи, і тому вони залишаються в спокої і позаплановими. Аналогічно, багато потоків можуть чекати на якомусь ресурсі, наприклад, дані, які будуть вилучені зі сховища, або мережеве з'єднання, яке буде завершено, або дані, що завантажуються з бази даних. Майже нічого не залишається, окрім перевірки стану очікуваного ресурсу, такі потоки плануються досить коротко, якщо вони взагалі є.

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

Більш детально див. Сторінку Вікіпедії для багатопотокової роботи .

Одночасна багатопотокова нитка

Що стосується Вашого пов'язаного Питання , теми там дійсно такі самі, як і тут.

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

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

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

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

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

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


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
bmike

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

Ваш опис гіпертонування є неправильним. Обладнання потоків! = Програмні потоки, вони контексти виконання / логічні ядра. Обидва логічні ядра у фізичному ядрі дійсно виконують свої інструкції одночасно. Передній кінець чергується між потоками (кожен цикл), але ядро ​​виконання поза замовленням може виконувати інструкції / Uops з обох потоків в одному циклі. Це розкриває паралелізм рівня інструкцій від двох потоків до виконання OoO, щоб краще тримати одиниці виконання, що живляться роботою (це в основному суть SMT). Це не просто "оптимізована комутація контексту".
Пітер Кордес


7

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

введіть тут опис зображення

Тепер - через величини різниці в часі - процесор і кеш функціонують настільки швидко в порівнянні з отриманням даних із сховища чи мережі - що тисячі потоків можуть приходити і йти, поки одна нитка чекає на www.google.com, щоб доставити пакет або два дані, тому це причина, чому ви бачите набагато більше потоків, ніж фактичний процесор.

Якщо ви конвертуєте операції з потоком, які відбуваються на чорно-синій шкалі часу, і перетворюєте їх на одну секунду = 1 нс, то нам важливо більше, ніж диск IO, який займає 100 мікросекунд, як 4 дні, і 200 мс в Інтернеті Затримка на 20 років, якщо ви рахуєте секунди за шкалою часу процесора. Як і багато повноважень десяти вправ , майже у всіх випадках - процесор сидить в режимі очікування "місяцями", чекаючи значної роботи з дуже-дуже повільного зовнішнього світу.

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

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


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
bmike

1

Ви не задаєтеся, мабуть, більш фундаментальним питанням: "Як я можу мати 290 процесів, коли мій процесор має лише чотири ядра?" Ця відповідь є частиною історії, яка може допомогти вам зрозуміти велику картину, навіть якщо на конкретне питання вже відповіли. Я не збираюся давати версію TL; DR.

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

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

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

Таким чином, ми закінчилися персональними комп'ютерами, які створювали ілюзію одночасного запуску декількох процесів, фактично запускаючи їх по черзі протягом коротких періодів, а потім призупиняючи їх. Нитки - це по суті те саме: зрештою, люди хотіли навіть окремих процесів створити ілюзію одночасного виконання кількох речей. Спочатку автору програм довелося це впоратися: витратити трохи на оновлення графіки, призупинити це, витратити трохи на обчислення, призупинити це, витратити трохи часу на щось інше, ...

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

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

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