Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы и ответы к экзамену.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.25 Mб
Скачать

Мьютексы

Мьютекс – двоичный семафор, обычно используемый для организации согласованного доступа к неделимому общему ресурсу. Мьютекс может принимать значения 1 (свободен) и 0 (занят).

Операции над мьютексами:

  • acquire(mutex) – уменьшить (занять) мьютекс

  • release(mutex) – увеличить (освободить) мьютекс

  • tryacquire(mutex) – часто реализуемая неблокирующая операция, выполняющая попытку уменьшить (занять) мьютекс

Мьютексы в конкретных реализациях могут иметь дополнительные свойства

  • Запоминание владельца – освободить мьютекс может только поток, захвативший его

  • Рекурсивность – поток может многократно захватить мьютекс (вызывать aquire()); для освобождения мьютекса поток должен соответствующее число раз вызвать release()

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

Барьеры

Барьеры (barrier) – примитив синхронизации во времени нескольких потоков/процессов  Поток, остановившийся на барьере, ожидает другой (другие потоки), когда они «дойдут» до этого же барьера

Взаимоблокировки

Для возникновения взаимоблокировок необходимо:

  1. условия взаимного исключения – каждый ресурс или отдан одному процессу, или доступен.

  2. условия выдерживания и ожидания – процесс, использующий ресурс может запросить новый ресурс.

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

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

При возникновении взаимоблокировок используются 4 стратегии:

  1. пренебрежение взаимоблокировки.

  2. обнаружение и восстановление – при возникновении блокировки – откат

  3. избежание взаимоблокировки путем контроля распределения ресурсов

  4. избежание взаимоблокировок структурным опровержением одного из условий.

Реентерабельность

Компьютерная программа в целом или её отдельная процедура называется реентера́бельной (от англ. reentrant — повторно входимый), если она разработана таким образом, что одна и та же копия инструкций программы в памяти может быть совместно использована несколькими пользователями или процессами. При этом второй пользователь может вызвать реентерабельный код до того, как с ним завершит работу первый пользователь и это как минимум не должно привести к ошибке, а в лучшем случае не должно вызвать потери вычислений (то есть не должно появиться необходимости выполнять уже выполненные фрагменты кода).

9. Синхронизация ядра Windows при высоком IRQL. Синхронизация при низком IRQL. Механизмы синхронизации режима ядра. Объекты диспетчера ядра. Условия освобождения различных синхронизирующих объектов.

Синхронизация ядра при высоком IRQL

Ядро должно гарантировать, что в каждый момент только один процессор выполняет код в критической секции. Критическими секциями ядра являются разделы кода, модифицирующие глобальные структуры данных, например базу данных диспетчера ядра или его очередь DPC Операционная система не смогла бы корректно работать, если бы ядро не гарантировало взаимоисключающий доступ потоков к этим структурам данных. B этом плане больше всего проблем с прерываниями. Так, в момент обновления ядром глобальной структуры данных может возникнуть прерывание, процедура обработки которого изменяет ту же структуру. B простых однопроцессорных системах развитие событий по такому сценарию исключается путем отключения всех прерываний на время доступа к глобальным данным, однако в ядре Windows реализовано более сложное решение. Перед использованием глобального ресурса ядро временно маскирует прерывания, обработчики которых используют тот же ресурс. Для этого ядро повышает IRQL процессора до самого высокого уровня, используемого любым потенциальным источником прерываний, который имеет доступ к глобальным данным. Например, прерывание на уровне «DPC/dispatch» приводит к запуску диспетчера ядра, использующего диспетчерскую базу данных. Следовательно, любая другая часть ядра, имеющая дело с этой базой данных, повышает IRQL до уровня «DPC/dispatch», маскируя прерывания того же уровня перед обращением к диспетчерской базе данных. Эта стратегия хорошо работает в однопроцессорных системах, но не годится для многопроцессорных конфигураций. Повышение IRQL на одном из процессоров не исключает прерываний на другом процессоре, а ядро должно гарантировать взаимоисключающий доступ на всех процессорах.