- •Введение
- •1. Лабораторная работа № 1
- •1.1. Цель работы
- •1.2. Теоретическое введение
- •1.2.1. Получение информации об операционной системе
- •1.2.2. Получение информации из реестра
- •1.2.3. Получение информации о системных каталогах Windows
- •1.2.4. Получение информации о диске
- •1.3. Создание приложения для получения характеристик компьютера и операционной системы
- •Контрольные вопросы
- •2. Лабораторная работа №2
- •2.1.Цель работы
- •2.2. Теоретическое введение
- •2.2.1. Процедуры и функции для работы с виртуальной памятью
- •2.3. Создание приложения, работающего с виртуальной памятью
- •2.4. Задание для самостоятельной работы
- •Контрольные вопросы
- •3. Лабораторная работа № 3
- •3.1. Цель работы
- •3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач
- •3.3. Задания для самостоятельной работы
- •Контрольные вопросы
- •4. Лабораторная работа № 4
- •4.1. Цель работы
- •4. 2. Теоретическое введение
- •4.2.1 Создание или открытие объекта ядра «файла»
- •4.2.2 Создание объекта ядра «файл, проецируемый в память»
- •4.2.3 Проецирование файловых данных на адресное пространство процесса
- •4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»
- •4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»
- •4.3 Примеры программ, выполняющих проецирование в память
- •4.3.1 Пример 1
- •4.3.2 Пример 2
- •4.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •5. Лабораторная работа № 5
- •5.1.Цель работы
- •5.2. Теоретическое введение
- •5.2.1. Создание процесса
- •5.2.2. Запуск внешней программы функцией WinExec
- •5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute
- •При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec.
- •5.2.4. Создание потока
- •5.2.5. Завершение процесса
- •5.2.6. Завершение потока
- •5.2.7. Изменение класса приоритета процесса
- •5.2.8. Получение информации о классе приоритета процесса
- •5.2.9. Изменение уровня приоритета потока
- •5.2.10. Получение информации о приоритете потока
- •5.3. Примеры программ для работы с процессами и потоками
- •5.3.1. Создание процесса с помощью функции CreateProcess.
- •5.3.2. Создание процесса с помощью функции WinExec.
- •5.3.3. Создание процесса с помощью функции ShellExecute.
- •5.3.4. Создание многопоточного приложения.
- •5.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •6. Лабораторная работа № 6
- •6.1. Цель работы
- •6.2. Теоретическое введение
- •6.2.1. Получение «мгновенного снимка» системы
- •6.2.2. Получение информации о процессах
- •6.2.3. Получение информации о потоках
- •6.2.4. Получение информации о модулях
- •6.2.5. Информация о кучах (heap)
- •6.2.6. Информация о виртуальной памяти.
- •6.2.7. Алгоритм работы функций ToolHelp
- •6.2.8. Как получить карту памяти любого процесса
- •6.3. Пример использования функций ToolHelp
- •6.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •7. Лабораторная работа № 7
- •7.1. Цель работы
- •7.2. Теоретическое введение
- •7.2.1. Критические секции
- •7.2.2. Синхронизация с использованием объектов ядра
- •7.2.3. Wait-функции
- •7.2.4. Синхронизация с использованием процессов и потоков
- •7.2.5. Объекты Mutex
- •7.2.6. Семафоры
- •7.2.7. События
- •7.3 Примеры работы с объектами синхронизации
- •7.3.1 Пример 1
- •7.3.1 Пример 2
- •7.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •8. Лабораторная работа № 8
- •8.1. Цель работы
- •8.2 Теоретическое введение
- •8.2.1 Создание dll
- •8.2.2 Неявная загрузка dll
- •8.2.3 Явная загрузка dll
- •8.2.4 Внедрение dll в адресное пространство другого процесса
- •8.3 Пример работы с dll
- •8.3.1 Создание dll, которая выполняет перехват нажатых клавиш
- •8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.
- •8.4 Индивидуальные задания
- •Контрольные вопросы
- •9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы»
- •9.3. Пример работы системы уведомления об изменениях в файловой системе
- •9.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •214013 Г. Смоленск, Энергетический проезд, 1
5. Лабораторная работа № 5
СОЗДАНИЕ ПРОЦЕССОВ И ПОТОКОВ
5.1.Цель работы
Целью работы является изучение основных принципов организации многозадачных операционных систем. Все многозадачные операционные системы используют концепцию процесса и потока. В данной работе рассматриваются следующие вопросы:
Чередование выполнения нескольких процессов с целью повышения степени использования процессора;
Разделение ресурсов между процессами;
Организация обмена данными между процессами и потоками;
Изменение класса приоритета процесса и уровня приоритета потока.
5.2. Теоретическое введение
В теоретическом введении рассматриваются процедуры и функции ядра ОС Windows, применяемые для работы с процессами потоками.
5.2.1. Создание процесса
Для создания процесса используется функция CreateProcess, имеющая следующий вид:
function CreateProcess ( lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
bInheritHandles: Boolean; dwCreationFlags: DWORD;
lpEnvironment: Pointer; lpCurrentDirectory: PChar;
const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): Boolean; stdcall;
Входные параметры данной функции перечислены в таблице 5.1.
Таблица 5.1 Параметры функции CreateProcess
Параметр |
Описание |
1 |
2 |
lpApplicationName |
Имя исполняемого файла |
lpCommandLine |
Командная строка, передаваемая создаваемому процессу. |
lpProcessAttributes |
Определяют наследование дочерним процессом свойств родительского процесса. Обычно lpProcessAttributes и lpThreadAttributes устанавливают равным nil, а bInheritHandles =false. |
lpThreadAttributes |
|
bInheritHandles |
Продолжение таблицы 5.1
1 |
2 |
dwCreationFlags |
Флаги, определяющие характеристики данного процесса. Например, его приоритет. |
lpEnvironment |
Указывает на блок памяти, хранящий строки переменных окружения. Обычно устанавливают в nil. |
lpCurrentDirectory |
Строка, определяющая текущий каталог и диск. Если этот параметр - nil, рабочий каталог нового процесса будет тем же, что и у приложения породившего его. |
lpStartupInfo |
Указатель на структуру TStartupInfo. Из всех полей данной структуры обязательным является только заполнение поля cb- размер в байтах данной структуры. |
lpProcessInformation |
Указатель на структуру TProcessInformation, из которой родительский процесс может получить данные о создаваемом процессе. |
Структура TStartupInfo. имеет следующий вид:
TStartupInfo = record
cb: DWORD; lpReserved: Pointer; lpDesktop: Pointer;
lpTitle: Pointer; dwX: DWORD; dwY: DWORD;
dwXSize: DWORD; dwYSize: DWORD;
dwXCountChars: DWORD; dwYCountChars: DWORD;
dwFillAttribute: DWORD; dwFlags: DWORD;
wShowWindow: Word; cbReserved2: Word; lpReserved2: Byte;
hStdInput: THandle; hStdOutput: THandle; hStdError: THandle;
end;
Описание полей структуры TStartupInfo приведены в таблице 5.2.
Таблица 5.2 Основные поля структуры TStartupInfo
Поле |
Описание |
1 |
2 |
cb |
Размер структуры в байтах. Служит для контроля версий. |
lpReserved |
Зарезервировано |
lpDesktop |
Определяет имя рабочего стола, на котором запускается приложение. |
lpTitle |
Используется для консольных приложений и определяет заголовок консольного окна. Если этот параметр – nil, то в заголовок выводится имя исполняемого файла. |
dwX , dwY |
X иY координаты левого верхнего угла окна приложения. Измеряется в пикселах |
dwXSize, dwYSize |
Ширина и высота (в пикселах) окна приложения |
Продолжение таблицы 5.2
1 |
2 |
dwXCountChars, dwYCountChars |
Определяют ширину и высоту (в символах) консольных окон |
dwFillAttribute |
Задает цвет текста и фона в консольных приложениях |
dwFlags |
Содержит набор флагов, позволяющих управлять созданием дочернего процесса |
wShowWindow |
Определяет вид окна приложения |
cbReserved2 |
Зарезервировано |
lpReserved2 |
Зарезервировано |
hStdInput, hStdOutput hStdError |
Описатели буферов для консольного ввода/вывода |
Структура TProcessInformation имеет следующий вид:
TProcessInformation =record
hProcess: THandle; hThread: THandle; dwProcessId: DWORD;
dwThreadId: DWORD;
end;
Описание полей структуры TProcessInformation приведены в таблице 5.3. Структура TProcessInformation содержит выходные данные и заполняется функцией CreateProcess.
Таблица 5.3 Основные поля структуры TProcessInformation
Поле |
Описание |
hProcess |
Дескриптор созданного процесса |
hThread |
Дескриптор первичного потока |
dwProcessId |
Идентификатор процесса |
dwThreadId |
Идентификатор первичного потока |
Если функция CreateProcess успешно выполнена, она возвращает значение true. Если произошла ошибка – возвращается false. Тогда информацию об ошибке можно получить, вызвав функцию GetLastError.