Команда ТБЬ

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

TSL RX,LOCK

(TSL — Test and Set Lock, то есть проверь и установи блокировку), которая работает следующим образом.

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

Следует заметить, что блокировка шины памяти существенно отличается от запрета на прерывания. Если при выполнении чтения слова памяти с последующей записью в него запретить прерывания, ничто не помешает второму центральному процессору, подключенному к шине памяти, получить доступ к слову между чтением и записью. Получается, что запрет прерываний на процессоре 1 не оказывает абсолютно никакого воздействия на процессор 2. Перекрыть процессору 2 доступ к памяти, пока процессор 1 не завершит выполнение команды, можно только одним способом — заблокировав шину, а для этого требуется специальное оборудование (в основном для этого используется линия шины, сигнал на которой блокирует шину, исключая к ней доступ всех процессоров, кроме того, который ее заблокировал).

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

Как же воспользоваться этой командой для предотвращения одновременного входа двух процессов в их критические области? Решение продемонстрировано в листинге 2.3. В нем показана подпрограмма, состоящая из четырех команд, написанная на вымышленном (но типовом) языке ассемблера. Первая команда копирует прежнее значение переменной lock в регистр, а затем присваивает ей значение 1. Затем прежнее значение сравнивается с нулем. Если оно ненулевое, значит, блокировка уже была установлена, поэтому программа просто возвращается в самое начало и повторно проверяет значение переменной.

Рано или поздно это значение превратится в 0 (когда процесс, находившийся в своей критической области, завершит в ней работу и произойдет выход из подпрограммы с установкой блокировки). Снятие блокировки осуществляется довольно просто: программе достаточно присвоить переменной lock нулевое значение. Для этого не нужны никакие специальные команды синхронизации.

Теперь суть одного из решений проблемы критических областей прояснилась. Перед входом в свою критическую область процесс вызывает функцию enter_region, которая входит в цикл активного ожидания, пока не будет снята блокировка, затем она устанавливает блокировку и возвращает управление. Завершив работу в критической области, процесс вызывает функцию leave_region, которая присваивает переменной lock нулевое значение. Как и во всех решениях проблемы критических областей, чтобы этот способ заработал, процессы должны своевременно вызывать функции enter_region
и leave_region. Если какой-нибудь из процессов не выполнит это условие, взаимное исключение не сработает. Иными словами, критические области работают, только если процессы взаимодействуют.

Листинг 2.3. Вход и выход из критической области с использованием команды TSL

| копирование lock в регистр с присвоением ей 1 | было ли значение lock нулевым?

| если оно было ненулевым, значит, блокировка | уже установлена и нужно войти в цикл | возврат управления вызывающей программе;

| вход в критическую область осуществлен leave region:

MOVE LOCK,#0 | присвоение переменной lock нулевого значения

RET | возврат управления вызывающей программе

Альтернативой команде TSL служит команда XCHG, осуществляющая атомарный обмен содержимого двух областей памяти, например регистра и слова памяти. Можно заметить, что код, показанный в листинге 2.4, практически такой же, как и в решении с использованием команды TSL. Команда XCHG используется для низкоуровневой синхронизации всеми центральными процессорами семейства Intel x86.

Листинг 2.4. Вход и выход из критической области с использованием команды XCHG

помещение 1 в регистр

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

присвоение переменной lock нулевого значения возврат управления вызывающей программе

2.3.3.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Команда ТБЬ:

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