<<
>>

Команда TSL

Рассмотрим решение, поддерживаемое аппаратно. Многие компьютеры, особенно разработанные с расчетом на несколько процессоров, имеют в составе команду TSL (Test and Set Lock — проверить и заблокировать):

TSL rx,LOCK

Эта команда действует следующим образом.

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

Чтобы применить команду TSL, мы воспользуемся общедоступной переменной LOCK, координирующей доступ к общей памяти. Когда значение LOCK равно 0, любой процесс может установить ее в 1 с помощью TSL, а затем выполнить чтение или запись общей памяти. Закончив действие, процесс снова устанавливает LOCK в 0 при помощи обычной команды MOVE.

Итак, как же использовать команду TSL для реализации взаимного исключения? Решение приведено в листинге 2.3.

Здесь представлена подпрограмма из четырех команд, написанная на некотором обобщенном (но типичном) ассемблере. Первая команда копирует старое значение LOCK в регистр и затем устанавливает значение переменной в 1. Потом старое значение сравнивается с нулем. Если оно ненулевое, значит, блокировка уже была произведена, и проверка начинается сначала. Рано или поздно значение окажется нулевым (это означает, что процесс, находившийся в критической секции, покинул ее), и подпрограмма вернет управление в вызвавшую программу, установив блокировку. Сброс блокировки не представляет собой ничего сложного — просто в переменную LOCK помещается 0. Специальной команды процессора не требуется.
Листинг 2.3, Вход и выход из критической секции с помощью команды ТвЬ

Одно из решений проблемы критических секций теперь очевидно. Прежде чем попасть в критическую секцию, процесс вызывает процедуру enter_region, которая выполняет активное ожидание вплоть до снятия блокировки, затем она устанавливает блокировку и возвращает управление. По выходу из критической секции процесс вызывает процедуру leave_region, помещающую 0 в переменную LOCK. Как и во всех остальных решениях проблемы критической секции, для корректной работы процесс должен вызывать эти процедуры своевременно, в противном случае обойти взаимное исключение не удастся.

2.2.4.

<< | >>
Источник: Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание. 2007

Еще по теме Команда TSL:

  1. Определение команды.
  2. § 4.5. Деятельность команд в организации
  3. Признаки команды.
  4. Пример настройки и реабилитации в футбольной команде
  5. Работа с другими командами
  6. Четыре шага по созданию эффективной команды
  7. ШЕСТЬ СТУПЕНЕЙ НА ПУТИ СОЗДАНИЯ КОМАНДЫ.
  8. Кто становится лидером команды
  9. Создание деловой команды «Вероятно, я не лучший советчик в этом вопросе».
  10. Эд САЛЛИВАН. ВРЕМЯ — ДЕНЬГИ Создание команды разработчиков, программного обеспечения, 2001
  11. Проведение интервью
  12. Алистэр Коуберн. Каждому проекту своя методология, 1999
  13. ESTP и ESFP Экстраверты-сенсорики