Раздел 13.3 - Защищенные типы

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

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

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

Защищенные типы очень эффективны, поскольку для их реализации обычно не требуется таких "тяжеловесных" операций, как "полное переключение контекста". Защищенные типы часто реализуют с помощью таких механизмов как запрет прерываний, ограничение уровня приоритетов или с помощью спин-блокировок. Фактически, применение защищенных типы часто может быть более эффективным, чем непосредственное использование семафоров, что может показаться удивительным. Если Вам любопытно, почему защищенные типы могут быть настолько эффективны, можете посмотреть Ada Rationale (Часть 2, раздел 9.1.3) Впрочем, это также значит, что все защищенные операции должны быть короткими и быстрыми, а длительная обработка должна выполняться где-то в другом месте. Обычно защищенные операции выполняют такие действия как инкремент или декремент величины, установка флага, установка одного-двух ссылочных значений и другие подобные быстрые операции. Длительные операции могут увеличить максимальную латентность системы (время реакции системы на новую ситуацию), что для многих систем может быть нежелательно.

Защищенный тип может быть создан в виде единственного экземпляра (т.е. одной защищенной переменной) или в виде полноценного типа Ada. В последнем случае с защищенным объектом можно выполнять все те же действия, что и с объектом обычного типа, включая размещение защищенных объектов в записях или массивах.


Упражнение:

Допустим, мы создаем защищенный тип и хотим создать операцию, которая изменяет данные внутри него. Эта операция может выполняться всегда, то есть для ее выполнения нет необходимости ожидания выполнения определенных условий. Как должна быть описана эта защищенная операция?

  1. Как защищенная функция.
  2. Как защищенная процедура.
  3. Как защищенный вход.

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT Перейти к следующему разделу

OUTLINE Вернуться к содержанию Урока 13

David A. Wheeler ([email protected])

Перевод:   Общая редакция перевода:

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s13s3.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org