Прежде всего, операционная система переводит исходящий поток в режим ядра, если его там еще нет, поскольку переключение потоков может выполняться только между потоками, работающими в режиме ядра. Затем вызывается планировщик для принятия решения о потоке, на который будет выполняться переключение. После принятия решения ядро сохраняет часть контекста потока, расположенного в ЦП (регистры ЦП), в выделенном месте в памяти (часто в верхней части стека ядра исходящего потока). Затем ядро выполняет переключение из стека ядра исходящего потока в стек ядра входящего потока. После этого ядро загружает ранее сохраненный контекст входящего потока из памяти в регистры процессора. И, наконец, возвращает управление обратно в пользовательский режим, но в пользовательский режим нового потока.
В случае, когда ОС определила, что входящий поток выполняется в другом процессе, ядро выполняет один дополнительный шаг: устанавливает новое активное виртуальное адресное пространство.
Основные затраты в обоих сценариях связаны с загрязнением кэша. В большинстве случаев рабочий набор, используемый исходящим потоком, будет значительно отличаться от рабочего набора, который используется входящим потоком. В результате входящий поток начнет свою жизнь с лавинных пропусков кеша, тем самым удаляя старые и бесполезные данные из кеша и загружая новые данные из памяти. То же самое относится и к TLB (перевод в сторону буфера, который находится на процессоре). В случае сброса виртуального адресного пространства (потоки выполняются в разных процессах) штраф еще хуже, поскольку сброс виртуального адресного пространства приводит к сбросу всего TLB, даже , если новый поток действительно нуждается в загрузить только несколько новых записей. В результате новый поток начнет свой квант времени с большим количеством пропусков TLB и частым просмотром страниц. Прямая стоимость переключения потоков также не является ничтожной (от ~ 250 и до ~ 1500-2000 циклов) и зависит от сложности процессора, состояний обоих потоков и наборов регистров, которые они фактически используют.
P.S .: Хороший пост о переключении контекста: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html