Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 3. Конспекты (06_06_19).rtf
Скачиваний:
62
Добавлен:
10.09.2019
Размер:
201.15 Кб
Скачать

2. Необходимо упорядочить доступ нескольких задач к общему ресурсу.

3. Необходимо синхронизировать задачи с внешними и внутренними внештатными событиями (например, нажатие комбинации клавиш; используется механизм прерываний).

4. Необходима синхронизация задачи по времени.

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

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

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

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

Наиболее характерными проблемами межзадачного взаимодействия являются:

1. «Гонки».

Пример. Выполняются две задачи бортового компьютера самолета: 1) определение расстояния до цели (скаляр) и направления до цели (вектор), 2) запуск ракет класса «воздух-воздух».

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

Такие ошибки часто возникают при применении алгоритма приоритетной многозадачности с вытеснением. Они с трудом обнаруживаются на этапе тестирования ОС.

2. «Тупики» (взаимные блокировки).

Пример. Задача А захватила клавиатуру и ждет, когда освободится дисплей, тогда как задача В захватила дисплей и ждет, когда освободится клавиатура.

Такая ситуация может длиться бесконечно долго.

3. «Инверсия приоритетов».

Пример. Данная ситуация возникает, когда две задачи высокоприоритетная В и низкоприоритетная Н разделяют совместно используемый ресурс Р. Предположим, что в системе присутствует третья задача, приоритет которой находится между приоритетами задач В и Н. Назовем эту задачу С (среднее).

Если задача В переходит в состояние готовности при активной задаче Н, и задача Н заблокировала ресурс Р, то задача В вытесняет задачу Н, но ресурс Р остается заблокированным (задача Н не успела передать его семафор). Когда задаче В понадобится ресурс Р, она сама перейдет в блокированное состояние. Если в состоянии готовности находится только задача Н, то ничего страшного не произойдет: задача Н выполнится, освободит заблокированный ресурс и будет вытеснена задачей В. Но если на момент блокирования задачи В в состоянии готовности находится задача С, то активной станет именно задача С, а задача Н опять будет вытеснена и запустится на выполнение только после того, как завершится выполнение задачи С.

Такая задержка может привести к тому, что критическое время выполнения задачи В будет упущено (нарушено).