/
Similar
Text
Лабораторная работа №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.