Многопоточность. Как ОС выбирает ядро?

Допустим у процессора 2 ядра.
Мы пишем программу на 2 потока.
Точно ли они будут выполняться на 2х ядрах, то есть параллельно?
Что если первое ядро в данный момент сильно загружено, ОС отправляет наш первый поток в менее загруженное ядро - второе, видит что второе ядро всё равно незагружено, ждёт пока выполнится наш первый поток и отправляет туда второе?
То есть даже в многоядерной системе наше многопоточное приложение не получит преимущества?
  • Вопрос задан
  • 2628 просмотров
Пригласить эксперта
Ответы на вопрос 5
@sunblossom
Да. Асинхронщина - лишь некая просьба ОС выполнить код многопоточно. На каких ядрах выполнять задачу она уже решит сама по обстоятельствам.
Ответ написан
Комментировать
@strelov1
Эти два процесса это далеко не единственные процессы которые нужно выполнять в системе. Решает что и на сколько загрузить в процессор планировщик задач. В книге Таненбаума - Современные операционные системы неплохо раскрыта эта тема
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Не указываете явно - ядро выбирает система.
Указываете явно - указанное ядро и будет использоваться для конкретного потока.

PS: это можно сделать даже на клиентском JS, в браузере, без всяких плагинов: navigator.hardwareConcurrency
Ответ написан
Комментировать
sim3x
@sim3x
Как было
https://www.itprotoday.com/windows-8/how-windows-n...

The NT dispatcher determines the order in which threads run and on which processors they run. Affinity is the tendency for a thread to run on a particular processor or set of system processors. NT uses soft affinity by default, running a thread on the same processor it ran on previously. NT also supports hard affinity to let you specify which processors a process or thread uses. Ideal affinity or preferred affinity lets you specify a preferred processor from the group of hard affinity processors. The NT dispatcher runs a process on the preferred processor if that processor is available. NCR's SMP Utilization Manager lets you set hard affinity and preferred affinity for process threads. Thus, a process can run on only a few processors, and the other processors remain free to run other processes.

Как сейчас
https://docs.microsoft.com/en-us/windows/desktop/p...

Мы пишем программу на 2 потока.
Точно ли они будут выполняться на 2х ядрах, то есть параллельно?
абсолютно снхронно - нет. Как-то синхронно - да

Что если первое ядро в данный момент сильно загружено, ОС отправляет наш первый поток в менее загруженное ядро - второе, видит что второе ядро всё равно незагружено, ждёт пока выполнится наш первый поток и отправляет туда второе?
вполне. Предполагаю, что в таком случае диспатчер, может пару раз перетасовать два ваших треда так, что разница между их окончанием не будет превышать пару (десятков) инструкций

То есть даже в многоядерной системе наше многопоточное приложение не получит преимущества?
если неправильно настроить диспатчер - да. Теортически даже можно добиться ситуации, когда ваша прога никогда не закончит работать

ПС: все выводы основываются на моей логике и могут быть неверными. Данная информация получена путем гугления и чтения
Ответ написан
Комментировать
Papayaved
@Papayaved
FPGA, MCU
От ОС и от процессора зависит. В процессорах, где много ядер или есть DSP ядра, разработчик обычно сам выбирает ядра на каких какие задачи будут работать. Надо использовать процессор и ОС для реалтайм систем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы