Гораздо проще объяснить это в обратном порядке, потому что переключение процесса всегда включает переключение потока.
Типичное переключение контекста потока на одноядерном процессоре происходит следующим образом:
Все переключатели контекста инициируются «прерыванием».Это может быть фактическое аппаратное прерывание, которое запускает драйвер (например, от сетевой карты, клавиатуры, оборудования для управления памятью или таймера), или программный вызов (системный вызов), который выполняет последовательность вызовов, подобную аппаратному прерыванию.войти в ОС.В случае прерывания драйвера ОС предоставляет точку входа, которую может вызвать драйвер, вместо выполнения «нормального» прямого возврата прерывания и, таким образом, позволяет драйверу выходить через планировщик ОС, если ему требуется ОС для установки потока.готов (например, он подал сигнал семафора).
Нетривиальным системам придется инициировать изменение уровня защиты оборудования, чтобы войти в состояние ядра, чтобы можно было получить доступ к коду / данным ядра и т. Д.
Состояние ядра для прерванного потока должно быть сохранено.В простой встроенной системе это может быть просто помещение всех регистров в стек потоков и сохранение указателя стека в его блоке управления потоками (TCB).
Многие системы переключаются на OS-выделенный стек на этом этапе, чтобы основная часть требований к внутреннему стеку ОС не накладывалась на стек каждого потока.
Может потребоваться отметить позицию стека потока, где изменениечтобы произошло состояние прерывания для разрешения вложенных прерываний.
Водитель / системный вызов выполняется и может изменить набор готовых потоков, добавляя / удаляя TCB из внутренних очередей для различных приоритетов потоковнапримерДрайвер сетевой карты, возможно, установил событие или сигнализировал семафор, которого ожидал другой поток, так что поток будет добавлен в готовый набор, или работающий поток мог вызвать sleep () и таким образом выбрать удалить себя из готового набора,
Алгоритм планировщика ОС запускается, чтобы решить, какой поток следует запустить следующим, обычно это готовый поток с наивысшим приоритетом, который находится в начале очереди для этого приоритета.Если следующий запускаемый поток принадлежит к другому процессу, отличному от ранее запущенного потока, здесь необходимо выполнить некоторые дополнительные операции (см. Далее).
Сохраненный указатель стека изTCB для этого потока извлекается и загружается в указатель аппаратного стека.
Состояние ядра для выбранного потока восстанавливается.В моей простой системе регистры будут извлечены из стека выбранного потока.Более сложные системы должны будут обрабатывать возврат к защите на уровне пользователя.
Выполняется возврат-прерывание, поэтому передача выполнения выбранному потоку.
В случае многоядерного процессора все сложнее.Планировщик может решить, что поток, который в данный момент выполняется на другом ядре, может быть необходимо остановить и заменить потоком, который только что стал готовым.Это можно сделать, используя межпроцессорный драйвер для аппаратного прерывания ядра, на котором запущен поток, который необходимо остановить.Сложность этой операции, помимо всего прочего, является хорошей причиной, чтобы не писать ядра ОС:)
Типичное переключение контекста процесса происходит следующим образом:
Переключение контекста процесса инициируется переключением контекста потока, поэтому все вышеперечисленное, 1-9, должно произойти.
На приведенном выше шаге 5 планировщикрешает запустить поток, принадлежащий процессу, отличному от того, который принадлежал ранее запущенному потоку.
Аппаратное обеспечение управления памятью должно быть загружено адресным пространством для новогопроцесс, т. е. любые селекторы / сегменты / флаги / все, что позволяет потоку / с нового процесса получать доступ к его памяти.
Контекст любого оборудования FPU необходимо сохранять / восстанавливатьс печатной платы.
Может быть другое оборудование, предназначенное для процессов, которое необходимо сохранить / восстановить.
В любой реальной системе механизмы зависят от архитектуры, и вышеприведенное является грубым и неполным руководством к последствиям любого переключения контекста. Существуют и другие издержки, генерируемые переключателем процесса, которые не являются строго частью переключателя - после переключения процесса могут происходить дополнительные очистки кэша и сбои страниц, поскольку часть его памяти могла быть выгружена в пользу страниц, принадлежащих к процессу, которому принадлежит ранее запущенный поток.