Текст
                    Лабораторная работа №3.
Ядро операционной системы
(4 часа
)
Объекты ядра.
Наследование объектов. Разделение объектов между
процесс
ами
.
Передача информации в дочерний процесс.
Синхронизация
процессов «по завершению».
Задание 1 (разминка).
Разработайте прило
жение, которое создает
какой
-
либо объект ядра и выводит на экран информацию о нём
(наследуемый это дескриптор или нет, защищен ли он от закрытия). В
список выводимых данных добавьте информацию об общем количестве
дескрипторов Вашего приложения.
Поменяйте з
начение свойства наследования для объекта ядра и
выведите информацию о его дескрипторе ещё раз.
Указание.
В процессе выполнения лабораторной работы
Задание
2
.
Разработайте
комплект из
дв
ух
1
программ
:
программы,
создающей объекты ядра согласно Вашему вари
анту (программа
-
создатель)
и
программы, использующей объекты ядра (программа
-
пользователь)
.
Продемонстрируйте
передачу объектов ядра из процесса
программы
-
создателя в процесс программы
-
пользователя
.
Варианты условий к заданию 2:
1
)
Программа
-
создатель являет
ся родительской программой для
программы
-
пользователя. Объекты ядра для демонстрации
–
процесс и файл. Способ передачи объектов в дочерний процесс
–
наследование.
Способ передачи дескрипторов
–
командная строка
запуска дочернего процесса.
Демонстрация
–
из
менение базового
приоритета
унаследованного
процесс
а
и протоколирование в
унаследованном
открытом файле действий ро
дительского и
дочернего процессов
.
2
)
Программа
-
создатель и программа
-
пользователь не зависят друг от
друга. Объекты ядра для демонстрации
–
отд
ельный поток
программы
-
создателя, издающий звуковой сигнал и файл. Способ
передачи объектов в процесс программы
-
пользователя
–
дублирование дескриптора процессом программы
-
создателя.
Способ передачи дескрипторов
–
именованный канал.
Демонстрация
–
приостан
овка
/
продолжение звукового сигнала в
процессе программы
-
родителя из процесса программы
-
пользователя и протоколирование в
переданный файл действий
родительского и дочернего процессов.
1
Для некоторых вариантов предусматривается использование трёх программ: добавляется
программа, осуществляющая дублирование дескриптора
из процесса программы
-
создателя в процесс программы
-
пользователя.


3 ) Программа - создатель и программа - пользователь не зависят друг от друга. Об ъекты ядра для демонстрации – мьютекс, контролирующий выполнение потока, выводящего в консоль произвольные символы и файл. Способ передачи объектов в процесс программы - пользователя – именование. Демонстрация – приостановка / продолжение вывода символов в окн е процесса программы - создателя при захвате / освобождении мьютекса по команде в процессе программы - пользователя и протоколиро вание в переданный файл действий родительского и дочернего процессов. 4 ) Программа - создатель является родительской программой для програ ммы - пользователя. Объекты ядра для демонстрации – именованная проекция файла в память и безымянный мьютекс, контролирующий к ней доступ . Способ передачи объектов в дочерний процесс – наследование. Способ передачи их дескрипторов – наследование через переме нные окружения Демонстрация – запись в разделяемый через проекцию в память файл из процесса программы - родителя и процесса программы - пользователя с контролем доступа к файлу через разделяемый мьютекс . 5 ) Программа - создатель и программа - пользователь не зависят друг от друга. Объекты ядра для демонстрации – процесс и файл. Способ передачи объектов в процесс программы - пользователя – дублирование дескриптора. Способ передачи значений дескрипторов разделяемых объектов ядра – запись в известный обеим программам файл. Демонстрация – завершение по команде пользователя унаследованного процесса с протоколированием действий родительского и дочернего процесса в разделяемый файл. 6 ) Программа - создатель является родительской программой для программы - пользователя. Объекты ядра дл я демонстрации – безымянное событие и дочерний процесс программы - создателя. Способ передачи объектов ядра в дочерний процесс – наследование. Способ передачи их дескрипторов – анонимный канал. Демонстрация – завершение унаследованного процесса процессом про граммы - пользователя при установке унаследованного события в сигнальное состояние процессом программы - родителя . 7 ) Программа - создатель и программа - пользователь не зависят друг от друга. Объекты ядра для демонстрации – событие и именованная проекция некоторого текстового файла. Способ передачи объектов ядра в процесс программы - пользователя – именование. Демонстрация – запись процессом программы - пользователя в именованную проекцию файла второй половины фразы, первую часть которой в файл записывает программа - созда тель . 
Оповещение о записи выполняет программа - создатель установкой события в сигнальное состояние по команде пользователя. 8 ) Программа - создатель является родительской программой для программы - пользователя. Объекты ядра для демонстрации – поток родительского процесса и событие . Способ передачи объектов в дочерний процесс – дублирование дескриптора . Способ передачи дескрипторов – запись в условленный файл. Демонстрация – завершение по сигнальному состоянию события потока в родительском приложении процессом программы - пользователя . 9 ) Программа - создатель является родительской программой для программы - пользователя. Объекты ядра для демонстрации - не именованный мьютекс и файл. Способ передачи объектов ядра в процесс прог раммы - пользователя – наследование. Способ передачи дескрипторов наследуемых объектов – через mailslot . Демонстрация – запись в файл некоторого текста после успешного захвата мьютекса пр оцессом программы - пользователя (мьютекс должен создаваться процессом пр ограммы - создателя в захваченном состоянии и освобождаться по команде пользователя). 10 ) Программа - создатель и программа - пользователь не зависят друг от друга. Объекты ядра для демонстрации – процесс, запущенный программой - создателем и неименованный мьютекс. Сп особ передачи объектов в процесс программы - пользователя – дублирование дескрипторов. Способ передачи значений дескрипторов – mailslot . Демонстрация – установка низкого приоритета унаследованному процессу после освобождения мьютекса процессом программы - созд ателя. Мьютекс должен создаваться в захваченном состоянии и освобождаться по команде пользователя в процессе программы - создателя. Дополнительный материал Основные способы разделения объектов ядра между процессами включают следующие варианты:  Наследование дочерним процессом наследуемых объектов ядра родительского процесса;  Приём дублированного дескриптора объекта ядра от другого процесса;  Использование именования объектов (для тех объектов ядра, которые эту возможность поддерживают). Алгоритм наследования объектов ядра рассмотрен в соответствующей лекции . Дублирование дескриптора основывается на использовании функции DuplicateHandle , которая позволяет для объекта ядра принадлежащего 
одному процессу получить дескриптор, который может быть передан для исполь зования другому процессу. Также смотрите [1] , [2] и [3] . Вспомогательные функции, используемые в лабораторной работе: Для получения информации о дескрипторе некоторого объекта может быть использована функция: BOOL GetHandleInformation( HANDLE hObject, L PDWORD lpdwFlags ); Здесь hObject – дескриптор объекта, информацию о котором необходимо получить; lpdwFlags – указатель на переменную, которая получит набор битовых флагов, задающих свойства дескриптора объекта ядра или значение 0 . Битовые флаги включают в себя: HANDLE _ FLAG _ INHERIT – наследование этого объекта разрешено; HANDLE _ FLAG _ PROTECT _ FROM _ CLOSE – при вызове CloseHandle дескриптор объекта ядра не будет закрыт. Для установки переменной окружения вызывающего процесса может быть использована функция: BO OL SetEnvironmentVariable( LPCTSTR lpName, LPCTSTR lpValue ); Здесь lpName – имя переменной окружения. Операционная система создаст такую переменную окружения если она не существует и если задаваемое ей значение не равно NULL ; lpValue – значение перемен ной окружения. Не должно превышать 32767 символов. Если значение этого параметра NULL , то переменная с заданным в lpName именем удаляется из окружения процесса. Для чтения переменной окружения вызывающего процесса может быть использована функция: DWORD Get EnvironmentVar iable( LPCTSTR lpName, LPTSTR lpBuffer, DWORD nSize ); Здесь lpName – имя переменной окружения; 
lpBuffer – указатель на буфер в который будет занесено значение переменной окружения в виде строки. nSize – размер буфера lpBuffer для чтения п еременной в символах. Для управления приоритетом процесса используется функция со следующим прототипом: BOOL SetPriorityClass( HANDLE hProcess, DWORD dwPriorityClass ); Здесь hProcess – дескриптор процесса, приоритет которого следует изменить (для дес криптора должно быть установлено право доступа PROCESS _ SET _ INFORMATION ); dwPriorityClass – устанавливаемый класс приоритета для процесса (константа из списка: NORMAL _ PRIORITY _ CLASS , BELOW _ NORMAL _ PRIORITY _ CLASS , ABOVE _ NORMAL _ PRIORITY _ CLASS , REALTIME _ PRIORIT Y _ CLASS , HIGH _ PRIORITY _ CLASS , IDLE _ PRIORITY _ CLASS ). Если функция завершается успешно – возвращается не нулевое значение, иначе – 0 . Дополнительная литература : 1. Джефри Рихтер, Кристофер Назар, Windows via С / С++, материалы для обязательного чтения, глава 3 (доступна на lib . vsu . by ). 2. Джефри Рихтер, Windows для профессионалов. Создание эффективных WIN 32 - приложений с учётом специфики 64 - разрядной версии Windows . (доступна на program.vsu ). 3. Александр Побегайло, Системное программирование в Windows , Глава 4 . Процессы в Windows , 4.4 – 4.6.