/
Текст
Лабораторная работа №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.