По сути, переключение контекста - это способ сохранить текущее состояние компьютера и заменить его новым. Шаги примерно такие:
- войти в привилегированный режим, где ЦП будет иметь доступ к памяти системы / ядра
- сохранить старый счетчик программ (теперь мы знаем, где мы были, когда произошло событие переключения задач - возможно, системный вызов, может быть, прерывание; в основном, запущенный процесс был вынужден вернуть управление)
- сохранить текущее состояние регистра (либо в стеке, либо в определенном наборе памяти, выделенной и управляемой ОС)
- сохранить указатель стека (если он есть у архитектуры)
- сохранить информацию о памяти для приостановленной задачи, пометив все страницы, используемые этим процессом, как пригодные для удаления (если следующей задаче или операционной системе требуется основная память, использованная старым процессом, которая будет скопирована на страницу хранилище, а затем сопоставляется с памятью в правильном адресном пространстве; в противном случае они могут зависать и быть доступными, когда задача получает контроль)
Теперь ОС может делать все, что пожелает, так как переходное состояние старого процесса сохраняется, а память безопасна. Может быть, он обрабатывает прерывание или выполняет системный вызов. Мы пропустим все это и просто переключим задачу.
- настроить память для новой задачи (сопоставить основную память с виртуальной памятью нового процесса; некоторые могут уже находиться в основной памяти, если не используется много памяти, или она была выгружена во внешнее хранилище, в в этом случае он будет загружен через «сбой страницы», когда программа попытается сослаться на него - программа будет приостановлена так же, как указано выше, ОС будет считывать данные в блоке памяти, и процесс будет возобновлен ОС)
- загрузка состояния регистра из блока управления ОС нового стека или стека
- при необходимости загрузить указатель стека
- выход из привилегированного режима
- переход к последнему счетчику приостановленной программы или точке входа для новой задачи
Ключевым моментом является то, что ОС отвечает за сохранение состояния; он управляет этим процессом в соответствии с архитектурой процессора. Регистры не «заняты», потому что процесс переключения задач сохраняет их и восстанавливает. Процесс, который потерял контроль, затем восстановил его, не имеет ни малейшего представления, что он потерял контроль; его мировое состояние сохранено и восстановлено без проблем.