Ответ 1
Простой ответ заключается в том, что современные процессоры предлагают архитектурные расширения, обеспечивающие несколько банков регистров, которые можно поменять местами на аппаратном уровне, поэтому до X задач можно сохранить полный набор регистров.
Более сложным ответом является то, что диспетчер при срабатывании прерывания получает полный набор регистров программы, которая выполнялась во время прерывания (за исключением счетчика программ, который предположительно распространяется через взаимно - признал "изменчивый" регистр или некоторые такие). Таким образом, диспетчер должен быть тщательно написан для хранения текущего состояния банков регистров в качестве его первой операции после запуска. Короче говоря, сам диспетчер не имеет непосредственного контекста и, следовательно, не страдает от одной и той же проблемы.
Вот попытка простого описания того, что происходит во время вызова диспетчера:
- Программа, которая в настоящее время имеет контекст, запущена на процессоре. Регистры, счетчик программ, флаги, база стека и т.д. Подходят для этой программы; за исключением, например, "зарезервированного регистра" операционной системы или какого-то такого, ничего о программе ничего не знает о диспетчере.
- Запускается прерывание по времени для функции диспетчера. Единственное, что происходит на данный момент (в случае с ванильной архитектурой) - это то, что счетчик программ сразу же переходит к тому, что указано в адресе ПК в прерывании BIOS. Это начинает выполнение подпрограммы диспетчера диспетчеризации; все остальное остается нетронутым, поэтому диспетчер видит регистры, стек и т.д. программы, которая ранее выполнялась.
- Диспетчер (как и все программы) имеет набор инструкций, которые работают с текущим набором регистров. Эти инструкции написаны таким образом, что они знают, что предыдущее исполняемое приложение оставило все свое состояние позади. Первые несколько инструкций в диспетчере будут хранить это состояние в памяти где-то.
- Диспетчер определяет, какой должна быть следующая программа для CPU, берет все ранее сохраненное состояние и заполняет регистры.
- Диспетчер переходит к соответствующему счетчику ПК, как указано в задаче, которая теперь имеет полный контекст, установленный на процессоре.
Сверху упростить; диспетчер не нуждается в регистрах, все, что он делает, записывает текущее состояние процессора в заданное место памяти, загружает состояние процессора другого процесса из предопределенной ячейки памяти и переходит к тому месту, где этот процесс прекратился.
Является ли это более ясным?