Могут ли потоки, порожденные процессом, работать на разных ядрах многоядерной системы?
Да. Предполагая, что аппаратное обеспечение имеет несколько ядер, и при условии, что операционная система поддерживает / разрешает это. (Современные операционные системы поддерживают его. Разрешено ли это, как правило, зависит от политики администратора.)
Будут ли потоки 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 «поток» был фактически процессом, и процесс мог разделять свое адресное пространство с другими процессы.