
- •Процессы и задачи в Microsoft Windows
- •Запуск задач
- •Управление запущенными задачами
- •Изменение приоритета задачи
- •Определение приоритета задачи
- •Приостановка и возобновление выполнения задачи
- •Временная приостановка работы задачи
- •Завершение задачи
- •Освобождение идентификатора задачи
- •Критические секции
- •Инициализация критической секции
- •Удаление критической секции
- •Вход в критическую секцию и выход из нее
- •4. Контрольные вопросы
- •5. Содержание работы
- •Создание объекта - событие
- •Открытие объекта - событие
- •Управление состоянием объекта - событие
- •Объекты – событие с автосбросом
- •Создание объекта Mutex
- •Освобождение идентификатора объекта Mutex
- •Открытие объекта Mutex
- •Как завладеть объектом Mutex
- •Освобождение объекта Mutex
- •Как работает семафор
- •Функции для работы с семафорами
- •Создание семафора
- •Уничтожение семафора •
- •Увеличение значения счетчика семафора
- •Уменьшение значения счетчика семафора
- •Определение текущего значения счетчика семафора
- •Создание и открытие ожидаемого таймера
- •Функции для работы с ожидаемым таймером
- •Контрольные вопросы
- •Содержание работы
- •Содержание отчета
- •Теоретический материал
- •7.1. Универсальные функции для работы с файлами в операционных системах Microsoft Windows
- •Функция CreateFile
- •Функция CloseHandle
- •Функции ReadFile и WriteFile
- •Механизм отображения файлов на память
- •Создание отображения файла
- •Выполнение отображения файла в память
- •Открытие отображения
- •Отмена отображения файла
- •Принудительная запись измененных данных
- •Обмен через файлы, отображаемые на память
- •Пример приложения, использующего файлы, отображаемые на память
- •Именованные и анонимные каналы
- •Имена каналов
- •Реализации каналов
- •Создание канала
- •Установка соединения с каналом со стороны сервера
- •Пример приложения, использующего каналы передачи данных Pipes
- •Создание канала Mailslot
- •Открытие канала Mailslot
- •Запись сообщений в канал Mailslot
- •Чтение сообщений из канала Mailslot
- •Определение состояния канала Mailslot
- •Изменение состояния канала Mailslot
- •Пример приложения, использующего каналы передачи данных MailSlot
- •Пример приложения, использующего передачу сообщений между процессами
Введение
Бурное развитие вычислительной техники и системного программного обеспечения способствовало активному применению методов и алгоритмов теории вычислительных процессов (теории параллельных вычислений) при построении современных операционных систем. Мультизадачность и параллельные вычисления стали основными требованиями при построении современных операционных систем.
В данном методическом пособии рассмотрены примеры практического построения мультизадачных приложений в операционных системах Microsoft Windows, обеспечения синхронизации работы параллельно выполняющихся задач и приложений, а также механизмы передачи данных между приложениями.
Пособие предназначено для выполнения лабораторных работ по курсу «Теория вычислительных процессов» студентами специальности 220400 – «Программное обеспечение вычислительной техники и автоматизированных систем».
Лабораторная работа №1
«Разработка и исследование мультизадачных приложений в операционных системах Microsoft Windows»
Цель занятия
Изучение способов построения мультизадачных приложений в операционных системах Microsoft Windows. Разработка и исследование учебного мультизадачного приложения.
Литература
1.Фролов А.В., Фролов Г.В. Программирование для Windows NT. – М: ДИАЛОГ-МИФИ, 1996. – 272 с. – (Библиотека системного программиста; Т.26).
2.Фролов А.В., Фролов Г.В. Операционная система Windows 95 для программиста. – М: ДИАЛОГ-МИФИ, 1996. – (Библиотека системного программиста; Т.22).
3.Фролов А.В., Фролов Г.В. Графический интерфейс GDI в Microsoft Windows. – М: ДИАЛОГ-МИФИ, 1994. – (Библиотека системного программиста; Т.14).
4.Саймон Р. Windows 2000 API Энциклопедия. – М: ДиаСофт, 2002.- 1088 с.
5.Неббет Г. Справочник по базовым функциям API Windows NT/2000. – М: Вильямс, 2002. – 528 с.
Выполнение работы
Изучить:
способы построения мультизадачных приложений (создание, запуск, остановка, завершение, а также изменение приоритета задач);
синхронизацию выполняющихся задач с помощью критических секций;
способы рисования геометрических фигур;
разработать алгоритм работы учебного мультизадачного приложения;
программно реализовать учебное мультизадачное приложение;
исследовать работу, разработанного приложения;
составить отчет по проделанной работе в соответствии с требованиями, предъявляемыми в пункте 6 настоящего пособия.
Контрольные вопросы
Что такое процесс, задача? Чем процесс отличается от задачи?
Каким образом осуществляется запуск задачи? Какие еще существуют способы запуска процесса?
Каким образом можно узнать приоритет выполняемой задачи?
Каким образом можно задать необходимый приоритет для выполняемой задачи?
Какие виды приоритетов вам известны? Какие значения может принимать приоритет?
Как можно приостановить выполнение задачи? Каким образом продолжить выполнение приостановленной задачи;
Как временно приостановить выполнение задачи?
Как завершается выполнение запроса?
Что такое критическая секция и для чего она предназначена?
Прокомментируйте работу с критическими секциями
Содержание работы
Ознакомиться с кратким теоретическим материалом, ответить на контрольные вопросы;
определить номер выполняемого варианта;
разработать алгоритм работы учебного мультизадачного приложения;
разработать и отладить программу работы учебного мультизадачного приложения;
требования к разрабатываемому учебному мультизадачному приложению:
должно обеспечивать запуск неограниченного числа задач;
перед запуском задачи пользователь должен указать ее приоритет;
пользователь должен иметь возможность приостановить выполнение выбранной задачи, а также продолжить ее выполнение после остановки;
пользователь должен иметь возможность завершать выбранную задачу;
пользователь должен иметь возможность изменять приоритет выбранной задачи;
пользователь должен иметь возможность получить информацию о приоритете выбранной задачи и ее идентификаторе (handle);
каждая задача должна последовательно выполнять рисование следующих геометрических объектов в окне: эллипсов, прямоугольников, а также выводить произвольный текст. Координаты местоположения геометрических объектов и текста в окне, а также их размеры и цвет выбираются каждый раз произвольно при помощи генератора случайных чисел.
каждая задача для всех типов геометрических объектов и текста должна вести учет количества ранее нарисованных объектов начиная с момента запуска задачи. Приостановка выполнения задачи пользователем не должна изменять учитываемые значения. Пользователь должен иметь возможность обнулять учитываемые значения как для выбранной задачи, так и для всех запущенных задач;
каждая задача должна рисовать геометрические объекты в окне приложения (SDI-приложение);
синхронизация процесса рисования между выполняющимися задачами должна производиться при помощи критической секции
произвести исследование работы учебного мультизадачного приложения:
необходимо провести пять серий измерений количества выведенных геометрических объектов и текста для каждой задачи в соответствии с вариантом задания;
выполнение приложения для получения результатов должно производиться одну минуту;
полученные результаты необходимо занести в таблицу:
№ серии |
Номер Задачи |
Приори-тет задачи |
Количество объектов, нарисованных задачей |
||
Эллип-сов |
Прямо-угольни-ков |
Текста |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сделать вывод о зависимости скорости выполнения задачи от ее приоритета;
Содержание отчета
Отчет должен содержать следующее:
титульный лист с указанием наименования и цели занятия; фамилии, имени, отчества и номера группы студента; фамилии, имени, отчества преподавателя;
дату выполнения работы;
цель занятия;
номер выполняемого варианта;
условия предложенной задачи;
код программы, реализующей учебное мультизадачное приложение;
результаты исследований работы учебного мультизадачного приложения:
выводы о проделанной работе.
Краткий теоретический материал
Процессы и задачи в Microsoft Windows
В операционных системах Microsoft Windows существует два понятия, имеющие отношение к мультизадачности. Это процессы и задачи.
Процесс (process) создается, когда программа загружается в память для выполнения. Вы создаете процессы, запуская, например, консольные программы или графические приложения при помощи Проводника. Процессу выделяется в монопольное владение 2 Гбайт изолированного адресного пространства, в которое другие процессы не имеют никакого доступа.
Сразу после запуска процесса создается одна задача (thread), или, как ее еще называют в литературе, поток. Задача - это просто фрагмент кода приложения, который может выполняться автономно и независимо от других задач в рамках одного процесса. При необходимости эта задача может запускать другие задачи, реализуя, таким образом, мультизадачность в рамках процесса. Все задачи имеют доступ к памяти, выделенной запустившему их процессу.
Из сказанного выше следует, что, с одной стороны, в операционных системах Microsoft Windows могут работать одновременно несколько процессов, с другой - в рамках каждого процесса могут параллельно работать несколько задач. Пользователь может запустить процесс, загрузив ту или иную программу в память для выполнения, но он не может запустить задачу, так как эта операция выполняется только процессами.
Запуск задач
Для запуска задач будем использовать функцию CreateThread. Прототип данной функции приводится ниже:
HANDLE CreateThread( |
|
|
|
LPSECURITY_ATTRIBUTES lpThreadAttributes, |
// атрибуты защиты |
|
DWORD dwStackSize, |
// начальный размер стека в // байтах |
|
LPTHREAD_START_ROUTINE lpStartAddress, |
// адрес функции задачи |
|
LPVOID lpPar// флаг наследования // идентификатора ameter, |
// параметры для задачи |
|
DWORD dwCreationFlags, |
// параметры создания задачи |
|
LPWORD lpThreadId); |
// адрес переменной для // идентификатора задачи |
Через параметр IpThreadAttributes передается адрес структуры SECURITY_ATTRIBUTES, определяющей атрибуты защиты для создаваемой задачи, или значение NULL. В последнем случае для задачи будут использованы атрибуты защиты, принятые по умолчанию. Это означает, что идентификатор созданной задачи можно использовать в любых функциях, выполняющих любые операции над задачами. Указывая атрибуты защиты, вы можете запретить использование тех или иных функций. Приведем структуру SECURITY_ATTRIBUTES:
typedef struct _SECURITY_ATTRIBUTES |
|
|
{ |
|
|
|
DWORD nLength; |
// размер структуры в байтах |
|
LPVOID IpSecurityDescriptor; |
// указатель на дескриптор // защиты |
|
BOOL blnheritHandle; |
// флаг наследования // идентификатора |
} |
SECURITY_ATTRIBUTES; |
|
При подготовке структуры в поле nLength следует записать размер структуры SECURITY_ATTRIBUTES.
Поле указателя на дескриптор защиты IpSecurityDescriptor не заполняется приложением непосредственно. Вместо этого для установки дескриптора защиты используется набор функций, которым в качестве одного из параметров передается указатель на структуру SECURITY_ATTRIBUTES. Эти функции подробно описаны в SDK.
Параметр dwStackSize функции CreateThread позволяет указать начальный размер стека для запускаемой задачи. Если указать для этого параметра нулевое значение, размер стека запущенной задачи будет равен размеру стека главной задачи процесса. При необходимости размер стека автоматически увеличивается.
Таким образом, первые два параметра функции CreateThread не вызывают затруднений. Они могут быть в большинстве случаев указаны соответственно как NULL и 0.
Параметр IpStartAddress задает адрес функции, которая будет выполняться как отдельная задача. Здесь вы можете просто указать имя этой функции. Функция задачи имеет один 32-разрядный параметр и возвращает 32-разрядное значение. Указанный параметр передается функции CreateThread через параметр IpParameter.
Если значение параметра dwCreationFlags равно нулю, после вызова функции CreateThread задача немедленно начнет свое выполнение. Если же в этом параметре указать значение CREATE_SUSPENDED, задача будет загружена, но приостановлена. Возобновить выполнение приостановленной! задачи можно будет позже с помощью функции ResumeThread.
И наконец, через параметр IpThreadld вы должны передать адрес переменной типа DWORD, в которую будет записан системный номер созданной задачи (thread identifier).
В случае успеха функция CreateThread возвращает идентификатор задачи (thread handle), пользуясь которым можно выполнять над задачей те или иные операции. Не путайте этот идентификатор с системным номером задачи. При ошибке функция CreateThread возвращает значение NULL.
Ниже мы привели пример использования функции CreateThread:
hThread = CreateThread ( |
|
|
NULL, |
|
0, |
|
(LPTHREAD_START_ROUTINE) ThreadRoutine, |
|
(LPVOID)hwndChild, |
|
0, |
|
(LPDWORD)SdwIDThread) ; |
Здесь мы не используем атрибуты защиты и делаем размер стека запускаемой задачи равным размеру стека главной задачи процесса.
В качестве функции задачи мы использовали функцию с именем ThreadRoutine, имеющую следующий вид:
DWORD ThreadRoutine (HWND hwnd) |
{ |
. . . |
// Оператор return завершает выполнение задачи |
return 0; |
} |
Эта функция имеет один параметр, который в нашем случае будет принимать значение hwndChild.
Наша функция задачи завершает свое выполнение оператором return. Для проверки значения, возвращенного функцией задачи, процесс может воспользоваться функцией GetExitCodeThread, которая будет описана позже.
Так как при запуске задачи мы указали значение параметра dwCreationFlags равное нулю, сразу после запуска задача начнет свою работу. Системный номер созданной задачи будет записан в переменную dwIDThread.