Планування
Ваші 1805 потоки не запускаються одночасно . Вони торгують. Одне ядро запускає трохи потоку, а потім відкладає його для виконання трохи іншого потоку. Інші сердечники роблять те ж саме. Круглі та круглі, нитки виконуються трохи за раз, не всі відразу.
Основна відповідальність операційної системи (Darwin та macOS) полягає в плануванні того, який потік потрібно виконати на якому ядрі на скільки часу.
Багато ниток не мають ніякої роботи, і тому вони залишаються в спокої і позаплановими. Аналогічно, багато потоків можуть чекати на якомусь ресурсі, наприклад, дані, які будуть вилучені зі сховища, або мережеве з'єднання, яке буде завершено, або дані, що завантажуються з бази даних. Майже нічого не залишається, окрім перевірки стану очікуваного ресурсу, такі потоки плануються досить коротко, якщо вони взагалі є.
Програміст програми може допомогти цій операції планування, спавши її нитку протягом певного часу, коли вона знає, що очікування зовнішнього ресурсу займе певний час. І якщо запускається «щільний» цикл, який є інтенсивним процесором, не вимагаючи чекати зовнішніх ресурсів, програміст може вставити виклик волонтеру, який буде коротко відкладений, щоб не зависати ядро і тим самим дозволити виконувати інші потоки.
Більш детально див. Сторінку Вікіпедії для багатопотокової роботи .
Одночасна багатопотокова нитка
Що стосується Вашого пов'язаного Питання , теми там дійсно такі самі, як і тут.
Одним із питань є накладні витрати на перемикання між потоками, коли це заплановано ОС. Існує значна вартість часу, щоб вивантажити інструкції та дані поточного потоку з ядра, а потім завантажити інструкції та дані наступного потоку. Частина роботи операційної системи полягає у тому, щоб намагатися бути розумним у плануванні потоків, щоб оптимізувати навколо цієї накладних витрат.
Деякі виробники процесорів розробили технологію скорочення цього часу, щоб зробити перемикання між парою ниток набагато швидше. Intel називає їх технологію Hyper-Threading . Відомо загалом як одночасне багатопотокове навантаження (SMT) .
Хоча пара потоків насправді не виконується одночасно, перемикання настільки плавне і швидке, що обидва потоки здаються практично одночасними. Це працює настільки добре, що кожне ядро представляє ОС як пару віртуальних ядер. Так CPU з підтримкою SMT з чотирма фізичними ядрами, наприклад, представить себе в ОС як восьмиядерний процесор.
Незважаючи на таку оптимізацію, все ж є деякі накладні витрати на переключення між такими віртуальними ядрами. Занадто багато потоків, що вимагають процесора, усі, які вимагають запланувати час виконання на ядрі, можуть зробити систему неефективною, і жоден потік не робить багато роботи. Як три м'ячі на ігровому майданчику, що розділяються між дев'ятьма дітьми, проти обміну між дев'ятьма сотнями дітьми , де не одна дитина , на самому ділі не отримує якусь - яку серйозну зміну з м'ячем.
Отже, в прошивці процесора є варіант, коли sysadmin може переключити машину, щоб відключити SMT, якщо вона вирішить, що це принесе користь її користувачам, які працюють у програмі, яка незвично пов'язана з процесором і має дуже мало можливостей для паузи.
У такому випадку ми повертаємось до вашого первинного запитання: У цій особливій ситуації ви дійсно хочете обмежити операції, щоб не було більше цих гіперактивних потоків, ніж у вас фізичні ядра. Але дозволю повторити: це надзвичайно незвична ситуація, яка може виникнути у чомусь на зразок спеціалізованого наукового проекту збору даних, але майже ніколи не застосовуватиметься до загальних сценаріїв бізнесу / корпорацій / підприємств.