
- •Проверил ______________________ Беляков с.Л.
- •Отношения между классами
- •Интерфейс и реализация класса.
- •Разработка приложений с графическим интерфейсом.
- •Класс Queue (Очередь)
- •Класс Stack
- •Базы данных
- •Язык sql
- •Выполнение команд sql
- •Выполнение агрегатной функции
- •Растровая графика
- •Критические секции (мониторы)
- •Синхронизация потоков из разных процессов
- •Компонентные технологии (com, corba)
Критические секции (мониторы)
Критические секции (мониторы) на программном уровне представляются специальной структурой данных (CRITICAL_SECTION). Эта структура носит системный характер, т.е. определяется на уровне API Windows. В набор системных функций Windows входят функции обеспечивающие вход в критическую секцию и выход из нее. Если поток вызывает функцию входа - EnterCriticalSection, то возможны 2 случая:
Если критическая секция свободна, система фиксирует ее занятость, а поток переходит к следующей команде программного кода. Обычно этот программный код является критической областью программы.
Если критическая секция занята, поток приостанавливается и ожидает освобождения критической секции. Критическая секция будет освобождена занявшим ее потоком через вызов функции «покинуть критическую секцию» LeaveCriticalSection. Если несколько потоков ожидают освобождения критической секции, они выстраиваются в очередь, из которой будет выбран один поток по установленным в системе принципам. При программировании не допускается делать предположения о порядке выбора из очереди.
Критические секции применяются для синхронизации потоков внутри процесса. Причина в том, что критическая секция это общая переменная.
Ожидание потоков может строиться двумя способами:
Спин – блокировка
Переход в режим ядра
В первом случае ожидаемый поток потребляет процессорное время, во втором случае диспетчер ОС Windows время потоку не выделяет. Данное состояние “полезнее” с системной точки зрения, однако, требует заметных затрат для перехода и возврата из состояния ядра. Ожидание входа в критическую секцию реализуется как комбинация двух способов, т.е. в начале спин-блокировка и по завершению таймаута переход в режим ядра.
WaitForSingleObject(…) – ожидать один объект
WaitForMultiplObject (…) – ожидать несколько объектов
Синхронизация потоков из разных процессов
Главной особенностью синхронизации в этом случае является то, что переменные для синхронизации должны создаваться в ядре ОС. ОС Windows имеет универсальный механизм для синхронизации с помощью объектов ядра. К объектам ядра относятся все объекты, которыми управляет ОС. В API имеются функции ожидания объектов; если поток вызывает функцию ожидания объекта, то, если объект свободен, поток продолжается, а если занят, то приостанавливается, переходя в режим ядра.
Понятие свободного и занятого объекта имеет различное содержание в конкретных случаях. Например, занятым считается активный поток, а свободным является приостановленный или завершившейся. Свободным является неоткрытый файл или открытый, но разделяемый, занятым является открытый неразделяемый файл и т.д.
Одним из специальных объектов для синхронизации является объект сигнал (Event). Объектом может находиться в одном из двух состояний: свободен или занят. Поток, вызывая функцию Set, устанавливает сигнал в свободное состояние. Если есть ожидающие на функции Wait, то один из потоков будет переведен в активное состояние. Вызов метода Reset переводит сигнал в занятое состояние. Любой поток вызвавший функцию Wait переводится в состоянии ядра, т.е. ожидает освобождения сигнала.
Тема №15 «Семафоры и мьютексы»
Синхронизация с помощью событий предполагает, что ожидание освобождения сигнала как объекта ядра возлагается на поток, использующий сигнал. Более функционально наполненными являются объекты семафоры.
Семафор – это защищенная переменная, над которой допускается выполнение ограниченного набора операций. Защищенной является, потому что размещается в ядре ОС.
Операция входа в семафор Enter выполняется следующим образом, если семафор свободен S==0, то поток продолжает свою работу, а семафор переводится в состояние занято (S==1). Если семафор был занят, поток сразу же переводится в режим ожидания, т.е. в режим ядра.
Операция Exit выйти из семафора выполняется следующим образом, если имеются потоки, ожидающие на семафоре, то выбирается один из них, и переводится в активное состояние, семафор своего значения не изменяет. Правило выбора из очереди определяется ОС, при программировании не следует делать никаких предположений о принципе выбора потока из очереди. Если ожидающих нет, семафор переводится в активное состояние.
В библиотеках программирования объекты семафоры являются многозначными. Это позволяет управлять доступом к ресурсу, который может использоваться ограниченным числом потоков. В частном случае это двоичные семафоры.
Если некоторый поток занял семафор и не освобождает его в течение продолжительного времени, ОС могут использовать таймаут. В конце таймаута генерируется исключение. Если поток не освободил семафор и завершился (возможно, аварийно), ОС освобождает все выделенные ему ресурсы, в том числе и семафор. Это исключает переход в тупиковое состояние всех потоков, ожидающих на семафоре.
Мьютекс является разновидностью семафора, который является только двоичным и способен хранить информацию о дескрипторе потока, который захватил мьютекс. Потоковладельцу разрешается повторно входить в мьютекс, несмотря на его занятость, при этом поток должен освобождать мьютекс такое же число раз.