Системное программное обеспечение персональных ЭВМ


Пример 7 - часть 2


Задача нашей программы заключается в обеспечении такой работы, чтобы процесс 1 активизировался и оставался активным в течение отведенного ему времени. Затем процесс 1 прерывается и активизируется процесс 2. По истечении времени, отведенного процессу 2, он прерывается, и вновь активизируется процесс 1, причем с того самого места, на котором он был прерван, и так далее.

Понятно, что для подсчета временных интервалов мы можем использовать прерывание таймера. Но возникает вот какая сложность. При прерывании таймером процесса, например, 1 в стеке запоминается состояние процесса 1. При возврате из прерывания это же состояние и восстановится из стека. Нам же нужно, чтобы при исчерпании процессом 1 своего кванта восстанавливалось не его состояние, а состояние процесса 2, а состояние процесса 1 запоминалось до следующего переключения процессов. Такая операция в общем случае носит название "переключение контекста" с процесса 1 на процесс 2. Решение этой задачи здесь заключается в отключении от общего стека и в назначении каждому процессу своего собственного стека. При активном состоянии процесса 1 регистры SS:SP микропроцессора указывают на стек процесса 1. Если обработчик прерывания обнаруживает, что квант времени процесса 1 уже истек, он заносит в эти регистры указатель на стек процесса 2, и тогда возврат из прерывания происходит в процесс 2.

Каждый процесс состоит из двух частей - части инициализации и прикладной части. Прикладная часть в нашей программе обеспечивает индикацию на экране активности процесса, при этом позволяет увидеть, на каком шаге процесс прерывается, и убедиться, что он восстанавливается с того же шага. Методы такой индикации будут рассмотрены в главе, посвященной дисплейным адаптерам. Наличие части инициализации обусловлено тем, что перед началом работы в разделении времени, в стеке каждого процесса должно быть записано некоторое его состояние, в которое произойдет первый "возврат". В программе имеются флаги инициализации для каждого процесса и общий флаг инициализации.


- Начало -  - Назад -  - Вперед -