- •Глава 2. Синхронизация задач с использованием api-функций и механизмов ядра.
- •§0. Объекты ядра. Основы.
- •Учет пользователей объектов ядра
- •Процесс и поток: краткая характеристика
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Синхронизация объектов
- •Наследование описателей объекта
- •Именованные объекты
- •3. После этого вызова система проверяет, существует ли уже объект ядра с таким же именем. Если существует, то
- •Open-функции
- •Дублирование описателей объектов
- •1) Процесс-катализатор.
- •2) Процесс-источник.
- •3) Процесс-приемник.
- •Исходное состояние
- •1 0XF0000000 (неприм.) (неприм.)
- •1 0XF0000000 (неприм.) (неприм.)
- •Состояние после вызова DuplicateHandle
- •§1. Синхронизация задач с использованием функций ожидания.
- •Функция ожидания одного объекта
- •Функция ожидания нескольких объектов
- •Функция ожидания нескольких объектов и сообщений
- •Функция создания дочернего процесса
- •Функция завершения дочернего процесса из самого дочернего процесса
- •Функция завершения дочернего процесса из процесса родителя
- •Функция создания вторичного потока
- •Функция завершения дочернего потока из самого дочернего потока (only c)
- •Функция завершения дочернего потока из потока родителя
- •If (my_file.Is_open()) { /// Если удалось открыть
- •Функция создания вторичного потока _beginthread
- •Функция создания вторичного потока _beginthreadex
- •§2. Синхронизация задач с помощью объектов ядра «событие» (Event).
- •Функция создания события
- •Функция установки сигнального состояния события
- •Функция установки несигнального состояния события
- •Функция открытия существующего именованного объекта события
- •Дескриптор защиты (структура)
- •§3. Синхронизация задач с помощью объектов ядра «семафор» (Semaphore).
- •Функция создания семафора
- •Функция открытия семафора
- •Функция увеличения счетчика семафора на указанное количество
- •If (!ReleaseSemaphore( ghSemaphore, 1, null)) /// Если ошибка
- •§4. Синхронизация задач с помощью объектов ядра «мьютекс» (Mutex).
- •Функция создания мьютекса
- •Функция открытия существующего именованного объекта мьютекса
- •Функция освобождения владельца указанного объекта мьютекса
- •§5. Синхронизация задач с помощью объектов ядра «уведомление об изменении» (Change Notification).
- •Функция создания объекта ядра «уведомление об изменении»
- •Функция перезапуска объекта ядра «уведомление об изменении»
- •Функция остановки мониторинга дескриптора объекта ядра «уведомление об изменении»
- •§6. Синхронизация задач с помощью объектов ядра «таймер ожидания» (Waitable Timer).
- •Функция создания объекта ядра «таймер ожидания»
- •Функция активации объекта ядра «ожидаемый таймер»
- •Функция открытия объекта ядра «ожидаемый таймер»
- •1. Функцией CancelWaitableTimer().
- •2. Функцией SetWaitableTimer().
- •If (bSuccess) /// Если успешно, то
- •If (bSuccess) /// Если успешно, то
- •§7. Синхронизация задач с помощью объектов ядра «канал» (Pipe).
- •Анонимный канал
- •Создание анонимных каналов
- •Соединение клиентов с анонимным каналом
- •Обмен данными по анонимному каналу
- •Именованный канал
- •Функция создания именованного канала
- •Функция соединения сервера с клиентом
- •Отключение сервера от клиента
- •Функция ожидания операции именованного канала
- •Функция объединения функций именованного канала
- •Подключение клиента к серверу
Дескриптор защиты (структура)
typedef struct _SECURITY_DESCRIPTOR {
BYTE Revision; /// Ревизия структуры
BYTE Sbz1; /// Биты менеджера ресурсов
SECURITY_DESCRIPTOR_CONTROL Control; /// Битовые флаги управления доступом
PSID Owner; /// SID владельца
PSID Group; /// SID группы
PACL Sacl; /// SACL
PACL Dacl; /// DACL
} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
Краткое описание.
Объекты, к которым могут получать доступ процессы, имеют специальный атрибут — дескриптор защиты (security descriptor), содержащий информацию обо всех пользователях, которым разрешен или запрещен доступ к объекту.
Параметры и описание:
(1) Revision — определяет 8-битное значение без знака, указывающее ревизию структуры SECURITY_DESCRIPTOR. Это поле должно быть установлено в единицу.
(2) Sbz1 — определяет 8-битное значение без знака, если только бит Control RM не установлен в 0x1. Если бит Control RM установлен в 0x1, Sbz1 интерпретируется как управляющие биты менеджера ресурсов.
(3) Control — определяет 16-битное поле без знака, которое задает битовые флаги управления доступом.
(4) Owner — определяет идентификатор безопасности владельца (SID владельца).
(5) Group — определяет идентификатор безопасности основной группы (SID первичной группы).
(6) Sacl — определяет системный список управления доступом (system access-control list, SACL). Указывает, какие операции и каких пользователей должны регистрироваться в журнале аудита безопасности.
(7) Dacl — определяет список избирательного управления доступом (discretionary access-control list, DACL). Указывает, кто может получать доступ к объекту и какие виды доступа.
Создание собственного дескриптора безопасности вряд ли когда-либо Вам пригодится. Поэтому здесь нет примера, однако приведена ссылка на пример от Microsoft (английский язык, C++). URL:
docs.microsoft.com/en-us/windows/desktop/secauthz/creating-a-security-descriptor-for-a-new-object-in-c--
§3. Синхронизация задач с помощью объектов ядра «семафор» (Semaphore).
Семафор — объект, ограничивающий количество потоков, которые могут войти в заданный участок кода.
Поток получает доступ к ресурсу, вызывая одну из wаit-функций и передавая ей дескриптор семафора, охраняющего этот ресурс. Wаit-функция проверяет у семафора значение счетчика текущего числа ресурсов. Если оно больше нуля и семафор свободен, то значение счетчика уменьшается на единицу, а вызывающий поток продолжает выполнение. Очень важно, что эта операция выполняется для семафора на уровне атомарного доступа. Иначе говоря, пока wаit-функция не вернет управление, операционная система не позволит прервать эту операцию никакому другому потоку.
Если wаit-функция определяет, что счетчик текущего числа ресурсов равен нулю (семафор занят), то система переводит вызывающий поток в состояние ожидания.
Когда другой поток увеличит значение этого счетчика, система вспомнит о ждущем потоке и снова начнет выделять ему процессорное время. А он, захватив ресурс, уменьшит значение счетчика на единицу.
Если семафор может принимать только значения 0 или 1, то его называют двоичным семафором.
При создании семафора для него задается максимальное число его счетчика.
Состояние семафора сигнализируется, когда его счетчик больше нуля, и не сигнализируется, когда он равен нулю.
Счетчик семафора уменьшается на единицу, когда функция ожидания освобождает поток, который ожидал семафор. Счетчик семафора увеличивается на указанную величину путем вызова функции ReleaseSemaphore. Счетчик никогда не может быть меньше нуля или больше максимального значения.