Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab7.doc
Скачиваний:
3
Добавлен:
12.11.2019
Размер:
286.72 Кб
Скачать

26

Министерство образования и науки Российской Федерации

Казанский государственный технический университет

имени А.Н. Туполева

____________________________________________

Межкафедральный филиал факультета № 4 в ОАО ICL-КПО ВС

Р.Ф. Миннибаев

Методическое руководство к

лабораторной работе

“Синхронизация потоков с помощью объектов ядра”

по дисциплине “Системное программирование”

КАЗАНЬ 2004.

Содержание

1.Объекты ядра 3

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

3. Защита объектов ядра 3

4. Таблица описателей объектов ядра 5

5. Создание объекта ядра 5

6. Закрытие объекта ядра 6

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

8. Наследование описателя объекта 7

9. Изменение флагов описателя 8

10. Именованные объекты 9

11. Дублирование описателей объектов 12

12. Синхронизация с потоков с помощью объектов ядра 13

13. Wait-функции 15

13.1. Побочные эффекты успешного ожидания 17

14. События 18

15. Семафоры 20

16. Мьютексы 21

17. Отказ от объекта-мьютекса 23

18. Мьютексы и критические секции 23

19. Сводная таблица объектов, используемых для синхронизации потоков 24

20. Порядок выполнения работы 25

21. Контрольные вопросы 25

1.Объекты ядра

Создание, открытие и прочие операции с объектами ядра являются при разработке Windows-приложений, повседневной рутиной. Система позволяет создавать и оперировать с несколькими типами таких объектов, в том числе, маркерами доступа (access token objects), файлами (file objects), проекциями файлов (file-mapping objects), портами завершения ввода-вывода (I/O completion port objects), заданиями (job objects), почтовыми ящиками (mailslot objects), мьютексами (mutex objects), каналами (pipe objects), процессами (process objects), семафорами (semaphore objects), потоками (thread objects) и ожидаемыми таймерами (waitable timer objects).

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

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]