Как делают ядра SMP, процессы, и потоки сотрудничают точно?

На одноядерном ЦП каждый процесс работает в ОС и переходах ЦП вокруг от одного процесса до другого для лучшего использования себя. Процесс может иметь много потоков, в этом случае ЦП пробегает эти потоки, когда он работает на соответствующем процессе.

Теперь, на нескольких ядро процессора:

  • Ядра работают в каждом процессе вместе, или ядра могут работать отдельно в различных процессах в одном конкретном моменте времени? Например, у Вас есть программа выполнение двух потоков. Двухъядерный ЦП может выполнить оба потока этой программы? Я думаю, что ответ должен быть да, если мы используем что-то как OpenMP. Но в то время как ядра работают в этом встроенном в OpenMP процессе, одно из ядер может просто переключиться на другой процесс?

  • Для программ, которые создаются для одноядерного при достигании 100%, почему загрузка ЦП каждого ядра распределена? (например, двухъядерный ЦП 80% и 20%. Процент использования всех ядер всегда составляет в целом 100% для этого случая.) Ядра пытаются помочь друг другу путем выполнения каждого потока, каждого процесса, до некоторой степени?

51
задан Mark Amery 6 January 2016 в 09:15
поделиться

3 ответа

Ядра (или процессоры) - это физические элементы вашего компьютера, которые выполняют код. Обычно каждое ядро ​​имеет все необходимые элементы для выполнения вычислений, регистровые файлы, линии прерывания и т. Д.

Большинство операционных систем представляют приложения как процессы . Это означает, что приложение имеет собственное адресное пространство (== представление памяти), где ОС обеспечивает изоляцию этого представления и его содержимого от других приложений.

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

Теперь к вашим конкретным вопросам:

1) ОС обычно позволяет вам, по крайней мере, давать подсказки о том, на каком ядре вы хотите выполнять определенные потоки. OpenMP генерирует код, который порождает определенное количество потоков для распределения совместной вычислительной работы из циклов вашей программы в несколько потоков. Для этого он может использовать механизм подсказок ОС (см. Сходство потоков). Однако приложения OpenMP по-прежнему будут запускаться одновременно с другими, и, таким образом, ОС может прерывать один из потоков и планировать другую (потенциально несвязанную) работу на ЦП. На самом деле существует множество различных схем планирования, которые вы, возможно, захотите применить в зависимости от вашей ситуации, но это очень специфично, и в большинстве случаев вы можете быть уверены, что ваша ОС делает правильные вещи для вас.

2) Даже если вы запускаете однопоточное приложение на многоядерном процессоре, вы замечаете, что другие процессоры тоже работают. Это происходит а) из-за того, что ОС тем временем выполняет свою работу и б) из того факта, что ваше приложение никогда не работает в одиночку - каждая работающая система состоит из целого набора одновременно выполняющихся задач. Проверьте диспетчер задач Windows (или ps / top в Linux), чтобы проверить, что работает.

48
ответ дан 7 November 2019 в 10:17
поделиться

Да, потоки и процессы могут выполняться одновременно на многоядерных процессорах, поэтому это работает так, как вы описываете (независимо от того, как вы создаете эти потоки и процессы, OpenMP или иначе). Одиночный процесс или поток одновременно работает только на одном ядре. Если количество потоков, запрашивающих процессорное время, превышает количество доступных ядер (обычно это так), планировщик операционной системы будет перемещать потоки на ядра и из них по мере необходимости.

Причина, по которой однопоточные процессы выполняются более чем на одном процессоре или ядре, связана с вашей операционной системой, а не конкретно с какой-либо особенностью оборудования. Некоторые операционные системы не имеют понятия «сходство потоков» - им все равно, на каком процессоре запущен поток - поэтому, когда приходит время переоценить, какие ресурсы используются (по крайней мере, несколько раз в секунду), они Я перенесу поток / процесс с одного ядра / процессора на другое. За исключением случаев промахов в кеше, это обычно не влияет на производительность вашего процесса.

6
ответ дан 7 November 2019 в 10:17
поделиться

Заметим также, что ОС не слишком заботится о том, от какого процесса исходят потоки. Она обычно планирует потоки по процессорам / ядрам независимо от того, из какого процесса поток. Это может привести к тому, что четыре потока из одного процесса будут работать одновременно, так же легко, как и один поток из четырех процессов, работающих в одно и то же время.

11
ответ дан 7 November 2019 в 10:17
поделиться
Другие вопросы по тегам:

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