Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

Алгоритмические основы программной инженерии

Конспекты с дополнениями

Глава 2. Синхронизация задач с использованием api-функций и механизмов ядра.

Рекомендуемая и используемая литература

1. Рихтер Дж. Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows / Пер. с англ. — 4-е изд. — Спб.: Питер; М.: Издательство «Русская редакция»; 2008. — 720 стр.: ил.

2. Щупак Ю. А. Win32 API. Эффективная разработка приложений. — СПб.: Питер, 2007. — 572 с.: ил.

Примечания

1. Для работоспособности функций требуется подключить заголовочный файл windows.h (С/C++: #include <windows.h>).

2. Синтаксис всех функций приведен в соответствии с информацией на официальных сайтах Microsoft: msdn.microsoft.com и docs.microsoft.com.

3. Все примеры, приведенные на C++, были проверены на работоспособность в стандартной сборке Dev-C++ 5.11 (встроенный в сборку компилятор — TDM-GCC 4.9.2).

4. На сайте Microsoft имеются примеры использования объектов синхронизации (C/C++).

https://docs.microsoft.com/en-us/windows/desktop/sync/using-synchronization

§0. Объекты ядра. Основы.

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

Операционная система Windows позволяет создавать объекты ядра и оперировать ими.

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

— не нарушать целостность структур объектов ядра;

— вводить, убирать или изменять элементы структур, не нарушая работы каких-либо приложений.

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

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

Учет пользователей объектов ядра

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

Ядру известно, сколько процессов использует конкретный объект ядра, поскольку в каждом объекте есть счетчик числа его пользователей. Этот счетчик — один из элементов данных, общих для всех типов объектов ядра. В момент создания объекта счетчику присваивается 1. Когда к существующему объекту ядра обращается другой процесс, счетчик увеличивается на 1. А когда какой-то процесс завершается, счетчики всех используемых им объектов ядра автоматически уменьшаются на 1. Как только счетчик какого-либо объекта обнуляется, ядро уничтожает этот объект.

Защита

Объекты ядра можно защитить дескриптором защиты (security descriptor), который описывает, кто создал объект и кто имеет права на доступ к нему. Дескрипторы защиты обычно используют при написании серверных приложений; создавая клиентское приложение, Вы можете игнорировать это свойство объектов ядра.

Большинство приложений вместо этого аргумента передает NULL и создает объект с защитой по умолчанию. Такая защита подразумевает, что создатель объекта и любой член группы администраторов получают к нему полный доступ, а все прочие к объекту не допускаются: вызов функции GetLastError() возвратит ERROR_ACCESS_DENIED. Однако Вы можете создать и инициализировать структуру SECURITY_ATTRIBUTES, а затем передать ее адрес.