Cтраница 4
Теперь, после знакомства с таблицей процессов, можно сказать еще несколько слов о том, как поддерживается иллюзия нескольких последовательных процессов на машине с одним процессором и несколькими устройствами ввода-вывода. С каждым классом устройств ввода-вывода ( гибкий диск, жесткий диск, таймер, терминал) связана область памяти ( обычно расположенная в нижних адресах), называемая вектором прерываний. Вектор прерываний содержит адрес процедуры обработки прерываний. Содержимое счетчика команд процесса, слово состояния программы и, возможно, один или несколько регистров записываются в ( текущий) стек аппаратными средствами прерывания. Затем происходит переход по адресу, указанному в векторе прерывания диска. Вот и все, что делают аппаратные средства прерывания. С этого момента вся остальная обработка прерывания производится программным обеспечением, например процедурой обработки прерываний. [46]
Однако напомним, что проблема состоит в том, что процедура withdraw возобновляется точно с той точки, где была прервана. До возникновения прерывания она создает локальную копию переменной cnt и уменьшает ее значение. Эта копия сохраняется, пока работает процедура обработки прерывания, а после окончания обработки прерывания процедура withdraw помещает уже некорректное значение в переменную cnt. Увеличение cnt, выполненное процедурой обработки прерывания, игнорировано. [47]
![]() |
Блок-схема процесса прерываний при чтении с перфоленты. [48] |
Соответствующая блок-схема показана на рис. 7.17. Программа написана в коде Р1С и включает установку вектора прерываний ( ячейка памяти 70) для устройства ввода перфоленты. В ней используются две отдельные процедуры. Первая, начинающаяся с метки INIT, инициализирует счетчик слов для процедуры обработки прерываний и затем вычисляет фактор перемещаемости на основе смещения PRSER - X - 2 следующим образом. [49]
Оператор DISABLE переводит процессор в состояние, при котором замаскированы все прерывания. Оператор ENABLE выводит процессор из этого состояния, разрешая обработку прерываний по мере их появления. Процессор всегда начинает работу с замаскированными прерываниями, поэтому в программе, содержащей процедуры обработки прерываний, необходимо разрешить прерывания оператором ENABLE до того, как произойдет обращение к любой из процедур обработки прерываний. [50]