процессору нужно получить доступ к структуре данных, он должен считать переменную и, если она равна 0, придать ей значение 1. Проблема заключается в том, что два центральных процессора могут считывать переменную на последовательных циклах шины. Если каждый процессор обнаружит, что переменная равна О, а затем поменяет значение переменной на 1, как будто только он один использует эту структуру данных, то такая последовательность событий приведет к хаосу.
Чтобы не допустить подобной ситуации, в многопроцессорных системах предусмотрен специальный цикл шины, который дает возможность любому процессору считать слово из памяти, проверить и изменить его, а затем записать обратно в память; весь этот процесс происходит без освобождения шины. Такой цикл не дает возможности другим центральным процессорам использовать шину и, следовательно, мешать работе первого процессора.
Еще один важный цикл шины — цикл обработки прерываний. Когда центральный процессор командует устройству ввода-вывода выполнить какое-то действие, он ожидает прерывания после завершения работы. Для сигнала прерывания нужна шина.
Поскольку может сложиться ситуация, когда несколько устройств одновременно захотят выполнить прерывание, здесь имеют место те же проблемы разрешения конфликтных ситуаций, что и в обычных циклах шины. Чтобы избежать таких проблем, нужно каждому устройству приписать определенный приоритет и для распределения приоритетов поддерживать централизованный арбитраж. Существует стандартный контроллер прерываний, который широко используется. В компьютерах IBM PC и последующих моделях для этого служит микросхема Intel 8259А. Она изображена на рис. 3.40.
Рис. 3.40. Контроллер прерываний 8259А
До восьми контроллеров ввода-вывода могут быть непосредственно связаны с восемью входами IRx (Interrupt Request — запрос прерывания) микросхемы 8259А. Когда любое из этих устройств решит выполнить прерывание, оно запускает свою линию входа. Если активизируется один или несколько входов, контроллер 8259А выдает сигнал INT (INTerrupt — прерывание), который подается на соответствующий вход центрального процессора. Если центральный процессор способен обработать прерывание, он посылает микросхеме 8259А импульс через вывод INTA (INTerrupt Acknowledge — подтверждение прерывания). В этот
момент микросхема 8259А должна определить, на какой именно вход поступил сигнал прерывания. Для этого она помещает номер входа на информационную шину. Эта операция требует особого цикла шины. Центральный процессор использует этот номер для обращения к таблице указателей, которую называют таблицей векторов прерываний, чтобы найти адрес процедуры обработки этого прерывания.
Микросхема 8259А содержит несколько регистров, которые центральный процессор может считывать и записывать, используя обычные циклы шины и выводы RD (ReaD — чтение), WR (WRite — запись), CS (Chip Select — выбор элемента памяти) и АО. Когда программное обеспечение обработало прерывание и готово получить следующее, оно записывает специальный код в один из регистров, который вызывает сброс сигнала INT микросхемой 8259А, если не появляется другое прерывание. Регистры также могут записываться для того, чтобы перевести микросхему 8259А в один из нескольких режимов, и для выполнения некоторых других функций.