Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Летняя практика КОНСПЕКТ ПО ТМиЯП 2 курс.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
7.94 Mб
Скачать

Критические секции (мониторы)

Критические секции (мониторы) на программном уровне представляются специальной структурой данных (CRITICAL_SECTION). Эта структура носит системный характер, т.е. определяется на уровне API Windows. В набор системных функций Windows входят функции обеспечивающие вход в критическую секцию и выход из нее. Если поток вызывает функцию входа - EnterCriticalSection, то возможны 2 случая:

  1. Если критическая секция свободна, система фиксирует ее занятость, а поток переходит к следующей команде программного кода. Обычно этот программный код является критической областью программы.

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

Критические секции применяются для синхронизации потоков внутри процесса. Причина в том, что критическая секция это общая переменная.

Ожидание потоков может строиться двумя способами:

  1. Спин – блокировка

  2. Переход в режим ядра

В первом случае ожидаемый поток потребляет процессорное время, во втором случае диспетчер ОС Windows время потоку не выделяет. Данное состояние “полезнее” с системной точки зрения, однако, требует заметных затрат для перехода и возврата из состояния ядра. Ожидание входа в критическую секцию реализуется как комбинация двух способов, т.е. в начале спин-блокировка и по завершению таймаута переход в режим ядра.

WaitForSingleObject(…) – ожидать один объект

WaitForMultiplObject (…) – ожидать несколько объектов

Синхронизация потоков из разных процессов

Главной особенностью синхронизации в этом случае является то, что переменные для синхронизации должны создаваться в ядре ОС. ОС Windows имеет универсальный механизм для синхронизации с помощью объектов ядра. К объектам ядра относятся все объекты, которыми управляет ОС. В API имеются функции ожидания объектов; если поток вызывает функцию ожидания объекта, то, если объект свободен, поток продолжается, а если занят, то приостанавливается, переходя в режим ядра.

Понятие свободного и занятого объекта имеет различное содержание в конкретных случаях. Например, занятым считается активный поток, а свободным является приостановленный или завершившейся. Свободным является неоткрытый файл или открытый, но разделяемый, занятым является открытый неразделяемый файл и т.д.

Одним из специальных объектов для синхронизации является объект сигнал (Event). Объектом может находиться в одном из двух состояний: свободен или занят. Поток, вызывая функцию Set, устанавливает сигнал в свободное состояние. Если есть ожидающие на функции Wait, то один из потоков будет переведен в активное состояние. Вызов метода Reset переводит сигнал в занятое состояние. Любой поток вызвавший функцию Wait переводится в состоянии ядра, т.е. ожидает освобождения сигнала.

Тема №15 «Семафоры и мьютексы»

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

Семафор – это защищенная переменная, над которой допускается выполнение ограниченного набора операций. Защищенной является, потому что размещается в ядре ОС.

Операция входа в семафор Enter выполняется следующим образом, если семафор свободен S==0, то поток продолжает свою работу, а семафор переводится в состояние занято (S==1). Если семафор был занят, поток сразу же переводится в режим ожидания, т.е. в режим ядра.

Операция Exit выйти из семафора выполняется следующим образом, если имеются потоки, ожидающие на семафоре, то выбирается один из них, и переводится в активное состояние, семафор своего значения не изменяет. Правило выбора из очереди определяется ОС, при программировании не следует делать никаких предположений о принципе выбора потока из очереди. Если ожидающих нет, семафор переводится в активное состояние.

В библиотеках программирования объекты семафоры являются многозначными. Это позволяет управлять доступом к ресурсу, который может использоваться ограниченным числом потоков. В частном случае это двоичные семафоры.

Если некоторый поток занял семафор и не освобождает его в течение продолжительного времени, ОС могут использовать таймаут. В конце таймаута генерируется исключение. Если поток не освободил семафор и завершился (возможно, аварийно), ОС освобождает все выделенные ему ресурсы, в том числе и семафор. Это исключает переход в тупиковое состояние всех потоков, ожидающих на семафоре.

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