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

Кто-нибудь может сказать мне, что именно делается в обеих ситуациях? Какова основная стоимость каждого из них?

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам