Переключением задач занимается модуль
ОС, называемый
диспетчером процессов. По сути дела, переключение задач представляет собой передачу управления от одной задачи (
процесса) другой задаче (процессу). Это может быть сделано с помощью команд МП
JMP (безусловный переход) или
CALL (вызов подпрограммы).
Однако есть одна особенность. Переключение задач должно выполняться незаметно для самих исполняемых задач. Следовательно, перед тем, как активизировать другую задачу, необходимо сохранить где-то адрес следующей исполняемой команды данной задачи (для того, чтобы потом продолжить ее выполнение с этого же места), а также содержимое всех внутренних регистров МП (для того, чтобы при возобновлении выполнения данной задачи восстановить содержимое всех регистров, сделав сам факт переключения незаметным для задачи). Очевидно, что задачу сохранения/восстановления контекста может решить только сам МП, и делать это он должен автоматически при переключении задачи операционной системой. Поддержка операции переключения задач появилась впервые в процессоре Intel 80286.
Для сохранения контекста задачи используется специальная область памяти, называемая
сегментом состояния задачи (TSS — Task State Segment). TSS создается ОС для каждой задачи. Обобщенный формат TSS приведен на рис. 1.
Процессор имеет специальный регистр, в котором хранится адрес TSS текущей задачи. Для выполнения переключения на другую задачу необходимо выполнить команду JMP или CALL, указав в качестве адреса перехода селектор дескриптора TSS. Процессор обнаруживает, что указанный селектор соответствует дескриптору TSS и выполняет следующие действия:
- Сохраняет контекст текущей задачи в ее TSS.
- Восстанавливает контекст активизируемой задачи из ее TSS.
- Передает управление новой задаче по адресу последней выполнявшейся команды, взятому из TSS.
Если селектор дескриптора TSS указать в таблице векторов прерываний в качестве адреса подпрограммы обработки прерывания, при возникновении этого прерывания управление будет автоматически передано задаче, соответствующей указанному TSS. Это позволяет легко реализовать
диспетчеризацию процессов. Достаточно в обработчике прерываний указать TSS задачи —
диспетчера процессов, а для активизации этого прерывания использовать сигнал от программируемого таймера. При поступлении сигнала от таймера управление будет передано диспетчеру процессов, который, в свою очередь, выполнив перепланирование, передаст управление какому-то процессу в соответствии с логикой своей работы.