Переключатель контекста потока Vs. переключатель контекста процесса

Ответы:

205

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

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

Абхай Бух
источник
8
Все это предполагает, что TLB и кеш не хранят pid для каждой записи.
dramzy
2
IMHO @dramzy прав, ОС может поддерживать быстрое переключение контекста, о котором вкратце упоминается здесь: youtu.be/3akTtCu_F_k?t=46m8s (посмотрите с самого начала, чтобы узнать больше о виртуальной памяти, таблицах страниц и TLB).
piotrwest
@piotrwest Поддерживает ли какая-либо из основных ОС быстрое переключение контекста?
max
2
@dramzy Вы имели в виду, что операционная система или оборудование могут хранить pid? Является ли это значение?
max
На мой взгляд, в Linux есть только переключатель потока (не уверен), поэтому ОС Linux будет проверять, имеет ли следующий запускаемый поток идентификатор сохранения с запущенным потоком, который будет запланирован?
roachsinai
16

Переключение контекста процесса включает переключение адресного пространства памяти. Сюда входят адреса памяти, сопоставления, таблицы страниц и ресурсы ядра - относительно дорогая операция. На некоторых архитектурах это даже означает очистку различных кешей процессоров, которые нельзя использовать в адресных пространствах. Например, x86 должен очистить TLB, а некоторые процессоры ARM должны полностью очистить кеш L1!

Переключение потоков - это переключение контекста от одного потока к другому в одном и том же процессе (переключение с потока на поток между процессами - это просто переключение процесса). Переключение состояния процессора (например, счетчика программ и содержимого регистра) обычно очень эффективно.

Адитья Догра
источник
13

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

Основные затраты в обоих сценариях связаны с загрязнением кеша. В большинстве случаев рабочий набор, используемый исходящим потоком, будет значительно отличаться от рабочего набора, который используется входящим потоком. В результате входящий поток начнет свою жизнь с лавины промахов в кэше, таким образом сбрасывая старые и бесполезные данные из кешей и загружая новые данные из памяти. То же самое верно и для TLB (буфер просмотра трансляции, который находится на ЦП). В случае сброса виртуального адресного пространства (потоки выполняются в разных процессах) штраф еще хуже, потому что сброс виртуального адресного пространства приводит к сбросу всего TLB, дажеесли новому потоку действительно нужно загрузить только несколько новых записей. В результате новый поток начнет свой квант времени с большого количества пропусков TLB и частого обхода страниц. Прямая стоимость переключения потоков также не является незначительной (от ~ 250 до ~ 1500-2000 циклов) и зависит от сложности процессора, состояний обоих потоков и наборов регистров, которые они фактически используют.

PS: Хороший пост о накладных расходах на переключение контекста: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html

Заратустра
источник
3
  • переключение процессов: это переход между двумя резидентными процессами в памяти в многопрограммной среде;
  • переключение контекста: это изменение контекста от выполняющейся программы к программе обслуживания прерывания (ISR).
Джон
источник
2

При переключении контекста потока пространство виртуальной памяти остается неизменным, в то время как в случае переключения контекста процесса это не так. Кроме того, переключение контекста процесса дороже, чем переключение контекста потока.

Палак Джайн
источник
0

Я думаю, что основное отличие заключается в вызове, switch_mm()который обрабатывает дескрипторы памяти старой и новой задачи. В случае потоков адресное пространство виртуальной памяти не изменяется (потоки совместно используют виртуальную память), поэтому нужно сделать очень немногое и, следовательно, с меньшими затратами.

Дражен Г.
источник
0

Хотя переключение контекста потока должно изменить контекст выполнения (регистры, указатели стека, счетчики программ), им не нужно изменять адресное пространство, как это делают переключатели контекста процессов. При переключении адресного пространства, дополнительном доступе к памяти (разбиение на страницы, сегментация и т. Д.) Возникают дополнительные затраты, и вам нужно очищать TLB при входе или выходе из нового процесса ...

Герр Гюнтер
источник
-1

Короче говоря, переключатель контекста потока не назначает новый набор памяти и pid, он использует то же, что и родительский, поскольку он выполняется в том же процессе. Один процесс порождает новый процесс и, таким образом, назначает новые mem и pid.

Есть еще много чего. Они написали об этом книги.

Что касается стоимости, переключение контекста процесса >>>> поток, поскольку вам нужно сбросить все счетчики стека и т. Д.

CtrlDot
источник
-1

Предполагая, что к процессору, на котором работает ОС, подключено несколько устройств с высокой задержкой,

Имеет смысл запустить еще один поток адресного пространства процесса, пока устройство с высокой задержкой отвечает.

Но если устройство с высокой задержкой реагирует быстрее, чем необходимо, при настройке таблицы + трансляции виртуальной памяти в физическую для НОВОГО процесса, то сомнительно, что переключение вообще необходимо.

Кроме того, HOT-кеш (данные, необходимые для запуска процесса / потока, доступны за меньшее время) - лучший выбор.

удали меня
источник