Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции препода / Лекции для 3 курса.doc
Скачиваний:
86
Добавлен:
30.04.2013
Размер:
1.51 Mб
Скачать

Лекция 10. Флажковые команды

Процессор 80286 имеет команды для установки и сброса флажка переноса (STC, CLC), флажка направления (STD, CLD) и флажка прерывания (STI, CLI). Имеется также команда инвертирования флажка переноса (CMC). Эти команды приведены в табл. 3.21. Мы уже рассматривали исполь­зование флажков процессора: флажок переноса предназначен для арифме­тики многократной точности, флажок направления - для обработки цепо­чек и флажок прерывания - для разрешения и запрещения прерываний.

Таблица 3.21 Операции над флажками

Мнемоника команды

Описание команды

CLC сбросить флажок переноса

0 CF

CMC инвертировать флажок переноса

1 – CF CF

STC установить флажок переноса

1 CF

CLD сбросит флажок направления

0 DF

STD установить флажок направления

1 DF

CLI сбросить флажок разрешения прерываний

0 IF

STI установить флажок разрешения прерываний

1 IF

3.10. Команды синхронизации

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

Подчиненные процессоры. Хотя система команд процессора 80286 довольно мощная, в ней, конечно, нет множества команд, оперирующих, например, числами с плавающей точкой. Разумеется, можно написать

процедуру для сложения двух чисел с плавающей точкой, но намного эффективнее иметь команду сложения чисел с плавающей точкой. Еще лучше иметь отдельный процессор, способный выполнять операции над числами с плавающей точкой, и подчинить его процессору 80286. Имея такой процессор, можно включать в программу команды операций над числами с плавающей точкой; встретив такую команду, процессор 80286 будет вызывать для ее выполнения процессор с плавающей точкой. Такой процессор 80287 рассматривается в следующей главе.

Подчиненный процессор работает только во взаимодействии с процес­сором 80286. В частности, когда процессор 80286 встречает специальную команду ESC (эта мнемоника обозначает все команды, в которых процессо­ру 80286 требуется помощь), он извещает подчиненный процессор. Команда ESC показывает, какую операцию должен выполнить подчиненный процес­сор (эту информацию процессор 80286 игнорирует). Но команда ESC задает для подчиненного процессора операнд в памяти. Эту информацию процес­сор 80286 использует: он вычисляет адрес памяти операнда, а затем считы­вает или записывает в память по запросу подчиненного процессора. (На самом деле взаимодействие между процессорами осуществляется несколь­ко сложнее.)

Команда ESC применяется совместно с командой ожидания WAIT, обеспечивающей синхронизацию процессоров; с ее помощью процессор 80286 проверяет, когда подчиненный процессор заканчивает свою опера­цию. Когда подчиненный процессор работает, он выдает сигнал высокого уровня на своем выходе BUSY (занят), а команда WAIT приостанавливает процессор 80286, если он обнаруживает такой сигнал на выходе BUSY. Как и в цепочечных командах, команду WAIT разрешается прерывать до ее завершения. Подробнее о командах ESC и WAIT мы поговорим в гл. 4.

Разделение ресурсов. Еще одна форма синхронизации двух процессо­ров связана с разделением общего ресурса. Рассмотрим, например, систему резервирования авиабилетов, в которой несколько процессоров обращают­ся к общей базе данных, находящейся в разделенной памяти. Как мы покажем, база данных может быть испорчена, если двум процессорам разрешить модифицировать ее одновременно.

Предположим, что один из процессоров хочет изменить платеж Гарри Джонса за рейс 351 с кредитной карточки компании VISA на кредитную карточку компании American Express. Прежде всего процессор будет просматривать список пассажиров рейса 351 до тех пор, пока не обнаружит данные Гарри Джонса. После этого он запишет новую информацию в поле кредитной карточки этой записи. Предположим, что когда производится эта модификация, второй процессор занят проверкой кредитных карточек всех пассажиров. Когда этот процессор начинает заниматься Гарри Джон­сом, он

может обнаружить часть старого номера и часть нового, потому что первый процессор еще не закончил корректировку. В результате компа­ния, обслуживающая по кредитным карточкам, отвергнет такой непра­вильный номер.

Наверное, можно было бы решить проблему, если бы первый процессор изменял весь номер одной командой. Для этого лучше всего воспользо­ваться командой повторяющейся пересылки цепочки REP MOVS. Теперь вроде бы второй процессор не сможет считать неправильный номер, но только если он не попытается сделать это в середине команды REP MOVS первого процессора. Будьте уверены, что однажды это произойдет!

Таким образом, изменение номера карточки в одной команде решает проблему не полностью, а просто уменьшает вероятность ее возникнове­ния. Что действительно нужно сделать, чтобы процессор "Гарри" запретил всем остальным процессорам обращаться к разделенной памяти на время выполнения им командыREP MOVS? В процессоре 80286 это обеспечивается предшествующим команде префиксом блокировки LOCK:

Такая команда заставит процессор выдать сигнал LOCK на все время выполнения команды. Теперь систему резервирования авиабилетов можно спроектировать так, чтобы дать исключительное право на доступ к памяти , любому процессору, выдавшему сигнал блокировки. Если никакой другой процессор не может обратиться к разделенной памяти, то он не сможет считать запись во время ее корректировки.

Рассмотрим еще один пример, в котором требуется выдавать сигнал блокировки. Пусть некоторый процессор хочет зарезервировать билет Уильяму Смиту на рейс 351. Она находит первую незанятую запись в списке пассажиров и с помощью команды пересылки цепочки помещает в нее информацию об Уильяме Смите. Предположим, что другой процессор хочет зарезервировать билет Роберту Грину. Он может найти ту же свобод­ную запись (перед тем, как процессор "Смита" что-то туда запишет) и попытается поместить туда информацию о Роберте Грине. Неважно, какой процессор первым будет выполнять команду пересылки цепочки; главное заключается в том, что один из них "перезапишет" информацию другого. Здесь префикс LOCK перед командой пересылки цепочки не помогает.

К счастью, и такую ситуацию можно предотвратить, если воспользоваться семафором. Семафор - это просто ячейка памяти, которая сообщает процессору о том, что другой процессор работает с разделенной памятью, и заставляет первый процессор ожидать освобождения памяти. Рассмотрим, как работает

семафор. Любой процессор, желающий обратиться к разделен­ной памяти, вначале должен проверить семафор. Если семафор имеет значение 1, процессор вынужден ожидать освобождения памяти. Если же семафор имеет значение 0, процессор должен установить его значение в 1 (запрещая другим процессорам обращаться к памяти), модифицировать со­держимое памяти нужным образом, а затем сделать значением семафора 0.

Конечно, теперь возникает проблема в том, что оба процессора одно­временно проверяют семафор и обнаруживают его нулевое значение. Оба процессора установят его значение в 1 и оба попытаются одновременно работать с разделенной памятью. Такую ситуацию можно предотвратить, если считывать значение семафора и устанавливать его в 1 одной командой и выдавать на время ее выполнения сигнал блокировки. Такой ко­мандой оказывается команда обменаXCHG, используемая следующим образом:

С командой XCHG надо было бы указать префикс LOCK, чтобы на время ее выполнения действовал сигнал блокировки. Однако применение команды XCHG для установки и проверки семафоров настолько важно, что процессор 80286 автоматически выдает сигнал блокировки независимо от наличия или отсутствия префикса LOCK.

Соседние файлы в папке Лекции препода