- •Глава 3. Управление памятью и передача данных.
- •§0. Вступление
- •§1. Адресное пространство Регионы в адресном пространстве
- •Передача региону физической памяти
- •Функция резервирования и фиксации страниц виртуальной памяти
- •Функция возврата (освобождение) физической памяти
- •Функция получения информации о текущей системе
- •Функция получения информации о текущем использовании системой физической и виртуальной памяти
- •§2. Непрерывное распределение виртуальной памяти
- •Распределение по разделам
- •Распределение по страницам
- •Распределение по сегментам
- •Выделение памяти под новый раздел
- •1. Выделение первой подходящей области.
- •2. Выделение самой подходящей области.
- •§3. Дискретное распределение виртуальной памяти.
- •Распределение по сегментам
- •Распределение по страницам
- •Странично-сегментное распределение
- •§4. Прием задач с помощью прерываний
- •§5. Проблемы межзадачного взаимодействия
- •2. Необходимо упорядочить доступ нескольких задач к общему ресурсу.
- •4. Необходима синхронизация задачи по времени.
- •1. «Гонки».
- •2. «Тупики» (взаимные блокировки).
- •3. «Инверсия приоритетов».
2. Необходимо упорядочить доступ нескольких задач к общему ресурсу.
3. Необходимо синхронизировать задачи с внешними и внутренними внештатными событиями (например, нажатие комбинации клавиш; используется механизм прерываний).
4. Необходима синхронизация задачи по времени.
Диапазон различных вариантов в этом случае достаточно широк, от привязки момента выдачи какого-либо воздействия к точному астрономическому времени до простой задержки выполнения задачи на определенный интервал времени. Для решения этих вопросов в конечном счете используются специальные аппаратные средства, которые называются таймерами.
На API-уровне поддерживается возможность синхронизации с помощью блокирующих переменных специальных системных вызовов для работы с критическими секциями семафоров, событий, мьютексов и таймеров ожиданий.
Кроме этого, можно использовать уведомление об изменении файловой системы и консольный ввод, а также процессы и потоки с ожиданием их завершения.
Важным объектом программы является её критическая секция, т. е. часть кода с доступом к разделяемым (совместно используемым) данным и непредсказуемым результатом выполнения при параллельном изменении этих данных разными потоками.
Наиболее характерными проблемами межзадачного взаимодействия являются:
1. «Гонки».
Пример. Выполняются две задачи бортового компьютера самолета: 1) определение расстояния до цели (скаляр) и направления до цели (вектор), 2) запуск ракет класса «воздух-воздух».
Если первая задача, записав глобальную структуру «расстояние до цели» прерывается другой задачей, не успев записать параметр «направление до цели», то вторая задача считает из глобальной структуры ошибочные данные и выполнит некорректный запуск.
Такие ошибки часто возникают при применении алгоритма приоритетной многозадачности с вытеснением. Они с трудом обнаруживаются на этапе тестирования ОС.
2. «Тупики» (взаимные блокировки).
Пример. Задача А захватила клавиатуру и ждет, когда освободится дисплей, тогда как задача В захватила дисплей и ждет, когда освободится клавиатура.
Такая ситуация может длиться бесконечно долго.
3. «Инверсия приоритетов».
Пример. Данная ситуация возникает, когда две задачи высокоприоритетная В и низкоприоритетная Н разделяют совместно используемый ресурс Р. Предположим, что в системе присутствует третья задача, приоритет которой находится между приоритетами задач В и Н. Назовем эту задачу С (среднее).
Если задача В переходит в состояние готовности при активной задаче Н, и задача Н заблокировала ресурс Р, то задача В вытесняет задачу Н, но ресурс Р остается заблокированным (задача Н не успела передать его семафор). Когда задаче В понадобится ресурс Р, она сама перейдет в блокированное состояние. Если в состоянии готовности находится только задача Н, то ничего страшного не произойдет: задача Н выполнится, освободит заблокированный ресурс и будет вытеснена задачей В. Но если на момент блокирования задачи В в состоянии готовности находится задача С, то активной станет именно задача С, а задача Н опять будет вытеснена и запустится на выполнение только после того, как завершится выполнение задачи С.
Такая задержка может привести к тому, что критическое время выполнения задачи В будет упущено (нарушено).