переключатель контекста потока vs переключатель контекста процесса
может ли кто-нибудь сказать мне, что именно делается в обеих ситуациях? какова основная стоимость каждого из них?
7 ответов
основное различие между коммутатором потоков и коммутатором процессов заключается в том, что во время коммутатора потоков пространство виртуальной памяти остается неизменным, а во время коммутатора процессов-нет. Оба типа включают передачу управления ядру операционной системы для выполнения переключения контекста. Процесс включения и выключения ядра ОС наряду с затратами на выключение регистров является самой большой фиксированной стоимостью выполнения контекстного переключения.
более нечеткая стоимость что контекстный переключатель возится с механизмами кэширования процессоров. В принципе, при переключении контекста все адреса памяти, которые процессор "запоминает" в кэше, становятся бесполезными. Одно большое различие здесь заключается в том, что при изменении пространств виртуальной памяти буфер Lookaside перевода процессора (TLB) или его эквивалент сбрасывается, что делает доступ к памяти намного дороже на некоторое время. Это не происходит во время переключения потока.
переключение контекста процесса включает переключение адресного пространства памяти. Это включает в себя адреса памяти, сопоставления, таблицы страниц и ресурсы ядра-относительно дорогая операция. В некоторых архитектурах это даже означает промывку различных кэшей процессоров, которые не доступны для совместного использования в адресных пространствах. Например, x86 должен очистить TLB, а некоторые процессоры ARM должны очистить весь кэш L1!
переключение потоков-это переключение контекста из одного потока в другой в тот же процесс (переключение с потока на поток между процессами-это просто переключение процессов).Переключение состояния процессора (например, счетчика программ и содержимого регистра), как правило, очень эффективно.
прежде всего, операционная система выводит исходящий поток в режим ядра, если его еще нет, потому что переключение потоков может выполняться только между потоками, которые работают в режиме ядра. Затем вызывается планировщик, чтобы принять решение о потоке, к которому будет выполняться переключение. После принятия решения ядро сохраняет часть контекста потока, который находится в CPU (регистрах cpu), в выделенное место в памяти (часто в верхней части стека ядра исходящего потока). Затем ядро Выполняет переключение из стека ядра исходящего потока на стек ядра входящего потока. После этого ядро загружает ранее сохраненный контекст входящего потока из памяти в регистры ЦП. И, наконец, возвращает управление обратно в пользовательский режим, но в пользовательском режиме нового потока. В случае, когда ОС определила, что входящий поток выполняется в другом процессе, ядро выполняет еще один шаг: задает новое активное виртуальное адресное пространство.
основная стоимость в обоих сценарии связаны с загрязнением кэша. В большинстве случаев рабочий набор, используемый исходящим потоком, будет существенно отличаться от рабочего набора, используемого входящим потоком. В результате входящий поток начнет свою жизнь с лавины пропусков кэша, тем самым смывая старые и бесполезные данные из кэшей и загружая новые данные из памяти. То же самое верно и для TLB. В случае сброса виртуального адресного пространства (потоки работают в разных процессах) штраф еще хуже, потому что сброс виртуального адресного пространства приводит к промывке TLB. Печальная история заключается в том, что весь TLB сброшен, даже если новому потоку действительно нужно загрузить только несколько новых записей. В результате новый поток начнет свой квант времени с пропусков TLB и частых прогулок по страницам. Прямая стоимость переключения потоков также не пренебрежимо мала (от ~250 и до ~1500-2000 циклов) и зависит от сложности процессора, состояний обоих потоков и наборов регистров, которые они фактически используют.
С. П.: хороший пост о накладных расходах на переключение контекста:http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
- процесс переключения: это переход между двумя резидентами памяти процесса в многопрограммной среде;
- переключение контекста: это изменяющийся контекст от исполняющей программы к подпрограмме службы прерываний (ISR).
при переключении контекста потока виртуальное пространство памяти остается тем же, что и в случае переключения контекста процесса. Кроме того, переключатель контекста процесса дороже, чем переключатель контекста потока.
короче говоря, переключатель контекста потока не назначает новый набор памяти и pid, он использует то же самое, что и родитель, поскольку он работает в том же процессе. Процесс порождает новый процесс и, таким образом, назначает новые mem и pid.
есть но больше. Они написали об этом книги.
Что касается стоимости, переключатель контекста процесса > > > > поток, поскольку вы должны сбросить все счетчики стека и т. д.
предполагая, что процессор, на котором работает ОС, имеет некоторые устройства с высокой задержкой,
имеет смысл запустить другой поток адресного пространства процесса, в то время как устройство с высокой задержкой отвечает.
но, если устройство с высокой задержкой отвечает быстрее, чем время, необходимое для настройки таблицы + перевода виртуальных в физические памяти для нового процесса, то сомнительно, что коммутатор вообще необходим.
кроме того, горячий кэш(необходимые данные для запуска процесса / поток достижим за меньшее время) - лучший выбор.