Могут ли потоки одного и того же процесса работать на разных ядрах? - PullRequest
0 голосов
/ 15 марта 2020

Могут ли потоки, охватываемые процессом, выполняться на разных ядрах многоядерной системы?

Допустим, у меня есть процесс P, из которого я создал два потока t1 и t2, и это многоядерная система с двумя ядрами. С1 и С2. Мои вопросы:

  1. Могут ли протекторы t1 и t2 работать в том же пространстве памяти, что и процесс P?
  2. Может ли поток t1 выполняться в ядре, отличном от того, который процесс P работает? Например: Процесс P выполняется в ядре C1, а поток t1 работает в ядре C2?

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Могут ли потоки, порожденные процессом, работать на разных ядрах многоядерной системы?

Да. Предполагая, что аппаратное обеспечение имеет несколько ядер, и при условии, что операционная система поддерживает / разрешает это. (Современные операционные системы поддерживают его. Разрешено ли это, как правило, зависит от политики администратора.)

Будут ли потоки t1 и t2 работать в том же пространстве памяти, что и процесс P?

Да. Они будут использовать одну и ту же память / виртуальное адресное пространство.

Может ли поток t1 выполняться в ядре, отличном от того, на котором выполняется процесс P? Например, процесс P выполняется в ядре C1, а поток t1 выполняется в ядре C2?

Этот вопрос не имеет смысла.

Процесс POSIX не имеет умение выполнять код. Это потоки процессов, которые выполняют код. Так что идея «процесса, работающего на ядре C1» бессмысленна.

Помните: каждый (живой) процесс POSIX имеет хотя бы один поток. Процесс начинается с одного потока, и этот поток может порождать другие, если это необходимо. Фактическое распределение потоков по ядрам выполняется операционной системой и зависит от времени жизни процесса.

Так работают потоки в современных операционных системах. Для Linux текущий (POSIX-совместимый) способ реализации потоков был представлен с Linux 2.6 в 2003 году. До ядра Linux 2.6 у Linux не было настоящих собственных потоков. Вместо этого у него было средство под названием LinuxThreads:

. У LinuxThreads возник ряд проблем, в основном из-за реализации, которая использовала системный вызов clone для создания нового процесса, разделяющего родительский процесс. адресное пространство. Например, потоки имели разные идентификаторы процессов, что создавало проблемы для обработки сигналов; LinuxThreads использовал сигналы SIGUSR1 и SIGUSR2 для координации между потоками, что означало, что эти сигналы не могли использоваться программами. "

(из Wikipedia .)

В (до 2003 года!) Модели LinuxThreads «поток» был фактически процессом, и процесс мог разделять свое адресное пространство с другими процессы.

0 голосов
/ 15 марта 2020

Как правило, это зависит от того, как реализованы потоки в планировщике ОС.

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

Если har sh управление питанием на месте планировщик может предпочесть подождать один или два тика, прежде чем разбудить это простое ядро ​​- если уже работающее ядро ​​освобождается, это может сэкономить много сока.

...