Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС / 5. ОС - Управление процессами - 2

.pdf
Скачиваний:
56
Добавлен:
01.06.2015
Размер:
408.67 Кб
Скачать

11

Объекты синхронизации

Объект – структура данных в системной памяти.

К "просто объектам" относятся, например, окна, курсоры, растровые рисунки и т.п.

К объектам ядра – открытые файлы, процессы, нити и др. Они могут иметь атрибуты защиты, а также могут иметь имя (для связи независимых процессов).

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

ксистемным функциям работы с объектом.

Отличительная черта объектов синхронизации – наличие состояния "Signaled / Not signaled".

Signaled – "Случилось что-то такое, чего мы ждали"

Not signaled – "Надо еще подождать".

Операционные системы. Управление процессами - 2

12

Функции ожидания

WaitForSingleObject(хэндл, тайм-аут);

Ожидает перехода указанного объекта синхронизации в сигнальное состояние.

Завершается либо по сигнальному состоянию объекта, либо по истечению тайм-аута (он указывается в мс, но может также быть 0 или "бесконечность").

Возвращает причину завершения.

WaitForMultipleObjects(длина_массива,

массив_хэндлов, флаг "All/Any", тайм-аут);

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

В случае "Any" возвращает номер сигнального объекта (или 0 – если тайм-аут).

Операционные системы. Управление процессами - 2

13

Типы объектов синхронизации

Процессы и нити.

Сигнальное состояние – завершение.

Назначение – понятно.

Event

Самый простой вид объекта, не имеющий никаких атрибутов, кроме состояния «Сигнальное / Несигнальное».

Создание: hEvent=CreateEvent(…);

Установка в сигнальное: функция SetEvent(hEvent);

Два вида Event: с автосбросом (сбрасываются функцией WaitFor…) и с ручным сбросом (только явно, функцией ResetEvent).

Назначение: с автосбросом – «передача эстафеты» от одного потока другому; с ручным сбросом – переключение состояния процесса: «всем потокам можно двигаться вперед» / «всем надо ждать».

Операционные системы. Управление процессами - 2

14

Типы объектов синхронизации

Mutex (двоичный семафор)

Исторически первый примитив синхронизации, предложенный Дейкстрой.

Сигнальное состояние – «свободен», несигнальное – «занят».

Освобождается функцией ReleaseMutex(hMutex), занимается функцией WaitFor…().

Поток, занявший мьютекс, становится его владельцем. Только он может освободить мьютекс.

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

Назначение – не дать двум процессам одновременно попасть в «критические секции», т.е. участки программы, где они одновременно работают с одним и тем же изменяемым ресурсом (например, редактируют одну и ту же запись БД).

Операционные системы. Управление процессами - 2

15

Типы объектов синхронизации

Semaphore (недвоичный семафор)

Содержит счетчик 0 .. N, причем несигнальное значение – только 0.

Увеличение счетчика: функция ReleaseSemaphore(..), причем можно увеличить сразу на несколько единиц;

Уменьшение счетчика – функции WaitFor…, но только на 1.

Нет понятия «владельца», т.е. вполне нормально, если один поток уменьшает семафор, а другой увеличивает.

Назначение: распределение ограниченного количества единиц ресурса в задачах типа «Поставщик / Потребитель». Например, имеется ограниченный буфер, в который один поток помещает свои сообщения, а другой должен их обрабатывать.

Для корректного решения таких задач часто требуется использовать еще и мьютекс.

Операционные системы. Управление процессами - 2

16

Типы объектов синхронизации

Waitable Timer (Таймер «для ожидания»)

Отличается от более древних таймеров, посылающих сообщения. Те таймеры даже не являлись объектами.

Создается функцией CreateWaitableTimer(…), запускается и перезапускается функцией SetWaitableTimer(…).

Номинальная точность – 100 нс.

Может быть одноразовым или периодическим.

Может быть с автосбросом или с ручным сбросом.

Можно задавать абсолютное время или относительно данного момента.

Назначение: всякая синхронизация по времени.

Операционные системы. Управление процессами - 2

17

Типы объектов синхронизации

Change Notification (Уведомление об изменении в заданном каталоге)

Задается путь к каталогу, фильтр видов отслеживаемых изменений (например, создание и удаление файлов, изменение определенных атрибутов) и флаг отслеживания подкаталогов.

Детектирует только сам факт изменения, без конкретизации.

Назначение: динамическое отображение каталогов в программах типа Проводник, Far Manager и т.п.

Console Input (Консольный ввод)

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

Назначение: ввод без ожидания с клавиатуры.

Операционные системы. Управление процессами - 2

18

Переменные типа CRITICAL_SECTION

Функционально очень близки к Mutex, но являются не объектами Windows, а просто переменными в адресном пространстве пользователя.

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

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

Вместо WaitFor… – собственный набор функций: InitializeCriticalSection(pCS), EnterCriticalSection(pCS), LeaveCriticalSection(pCS), а также TryEnterCriticalSection(pCS) – попытка входа в секцию без блокирования.

Назначение, как и для Mutex, - взаимное исключение потоков, пытающихся войти в свои критические секции.

Операционные системы. Управление процессами - 2

19

Сообщения

Сообщение – структура данных, содержащая:

тип сообщения (т.е. его смысл) – число; для обозначения известных системе сообщений используют имена констант, например, WM_PAINT, WM_KEYDOWN и т.п.

адресат сообщения (конкретное окно, все окна или нить процесса); адресат задается хэндлом соответствующего объекта;

время отправки;

координаты курсора (для сообщений от мыши);

параметры wParam и lParam, смысл которых зависит от типа сообщения.

Операционные системы. Управление процессами - 2

20

Сообщения

Сообщения могут посылаться как системой, так и пользовательскими процессами.

Основное назначение системных сообщений – работа с графическим интерфейсом программ (изменение состояния окон, курсора, клавиатуры и т.п.).

Система посылает сообщения избыточно, по принципу «вдруг процессу это интересно?». Если адресат не обрабатывает сообщение, оно обрабатывается системой по умолчанию. Часто (но не всегда) при этом вообще ничего не делается.

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

Операционные системы. Управление процессами - 2