Раздел 13.1 - Основы многозадачности
В языке Ada имеется встроенная поддержка параллельной обработки при помощи задач Ada. Задачи в Ada выполняются параллельно и могут взаимодействовать друг с другом при помощи нескольких различных механизмов. В сущности, каждая задача работает так, как будто она запущена на отдельном компьютере. Иногда задачи называют ``нитями'' или ``легковесными процессами''. Более часто встречающиеся термины для описания <<задачеподобного>> поведения - ``процесс'', ``агент'' или ``активный объект''.
Когда могут понадобиться задачи? Хорошо, приведем пример: представьте, что Вы разрабатываете Web-браузер. Этот браузер будет загружать информацию через некоторое (медленное) коммуникационное устройство, а затем отображать ее. Конечно же, можно подождать, пока вся информация не станет доступной и лишь затем отображать ее, но это, вероятно, заставит пользователя слишком долго ждать. Лучшим решением было бы создание двух задач, одна из которых загружала, а другая отображала информацию. По мере получения информации первая задача может по частям передавать загруженные данные второй задаче. Вторая задача может отображать информацию для пользователя, даже если первая еще не завершила загрузку всех данных. Таким образом, эти две задачи могут работать ``одновременно''.
Задачи можно стартовать (активировать) и остановить (завершить). Существует множество способов взаимодействия задач, после того, как они активированы. Приведем основные:
- Задачи могут ожидать завершения выполнения некоторых действий другими задачами.
- Задачи могут обмениваться сообщениями; это называется рандеву.
- Задачи могут использовать `защищенные объекты', которые предоставляют исключительный доступ для чтения/записи данных. Защищенные объекты - это нововведение Ada 95.
- Задачи могут взаимодействовать, изменяя глобальные переменные. Этот метод эффективен, но и опасен, особенно при отсутствии глубокого понимания вопросов распараллеливания. В Ada такой подход допустим, так как он действительно необходим некоторым разработчикам систем реального времени, тем не менее нужно использовать его с большой осторожностью.
Мы обсудим эти способы взаимодействия в следующих нескольких разделах.
Некоторые компьютерные системы в действительности состоят из нескольких компьютеров. Различные задачи могут быть запущены и на различных машинах, если Ada-компилятор и/или операционная система поддерживает такую возможность. Это может значительно ускорить работу программы.
У задач есть несколько важных особенностей:
- Ada не может сделать невозможное. На однопроцессорных машинах Ada имитирует работу нескольких компьютеров, и при этом имеются накладные расходы. Их называют ``накладными расходами на планирование'', а значительную часть потерь составляет ``время переключения контекста''. Большинство производителей компиляторов предоставляют информацию о величине этих потерь.
- Задач может быть слишком много или, наоборот, слишком мало. Некоторые создают сотни задач без всякой необходимости, а в результате получаются безобразные и медленные программы. Как и любой механизм, задачи нужно использовать там, где это действительно необходимо. Золотое правило: стоит проверить все ли Вы делаете верно, если используется более десяти-двадцати задач на одном процессоре, а в особенности, если несколько из них одновременно находятся в активном состоянии. Невзирая на то, что низкоуровневых задач (задач аппаратного уровня), выполняющих элементарные действия, может быть много, следует учесть, что, в общем случае, задачи не должны использоваться просто для выполнения каких-то тривиальных действий и передачи информации другой задаче. Не нужно слепо следовать этим правилам, просто руководствуйтесь ими до тех пор, пока полностью не разберетесь с многозадачностью.
- Если присутствует операционная система, то в ней, скорее всего, имеются достаточные средства для нормальной работы задач Ada. Современные ОС с поддержкой нитей или легковесных процессов (такие как Windows NT, Windows 95, OS/2, Mach и Solaris) обычно работают вполне удовлетворительно. Почти во всех ОС реального времени имеются механизмы, достаточные для реализации задач Ada. В Windows 3.1 и некоторых старых Unix-системах отсутствует такая поддержка, что приводит к незначительным но досадным ограничениям, о чем мы поговорим позже. В MS-DOS нет непосредственной поддержки нитей, но эта система настолько примитивна, что задачи могут быть реализованы непосредственно, минуя операционную систему (старые версии компилятора GNAT не поддерживали многозадачность под MS-DOS, но позднее такая возможность была добавлена путем реализации задач "поверх" MS-DOS).
Строго говоря, в программе на Ada всегда присутствует как минимум одна задача, которую называют задачей среды окружения, а главная (стартующая) подрограмма работает в контексте этой задачи.
Упражнение:
Программа XYZ работает на одном процессоре и содержит 10000 задач. Для каждого переключателя на пульте управления и каждого индикатора дисплея заведена отдельная задача. Хорошо ли спроектирована программа?
-
Программа, вероятно, спроектирована хорошо.
-
Программа, вероятно, спроектирована плохо.
Вы можете также:
David A. Wheeler ([email protected])
Перевод: Общая редакция перевода:
Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s13s1.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org