Лабораторная работа №3
Понятие процесса и работа с Win32 API
Задание
1. Используя представленные ниже материалы, разработать на Visual C++ консольное приложение, выполняющее следующие команды:
run word – запускает приложение Microsoft Word (использовать WinExec)
run excel – запускает приложение Microsoft Excel (использовать CreateProcess)
open имя_документа – открывает документ с именем имя_документа (в формате Microsoft Word или Microsoft Excel)
exit – завершение работы приложения
Путь к программам Word и Excel задается в программе в виде константы. Приложение должно контролировать корректность ввода команд, при неверном задании пути выдавать или команды соответствующие сообщение.
2. Найдите в документации MSDN три любые функции управления процессом или получения информации о его состоянии. Включите вызов этих функций в программу.
Процессы в Win32
Процесс (process) - это объект операционной системы, представляющий контейнер для набора ресурсов, используемых при выполнении экземпляра программы. В Windows процесс включает следующее:
|
|
- закрытое виртуальное адресное пространство – диапазон адресов виртуальной памяти, которым может пользоваться процесс;
- исполняемую программу – начальный код и данные, проецируемые на виртуальное адресное пространство процесса;
- список открытых описателей различных системных ресурсов – семафоров, коммуникационных портов, файлов и других объектов, доступных всем потокам в данном процессе;
- контекст защиты (security context), (иногда называемый маркером доступа (accesstoken)) идентифицирующий пользователя, группы безопасности и привилегии, сопоставленные с процессом;
- уникальный идентификатор процесса;
- куча процесса;
- переменные окружения;
- минимум один поток (см. далее).
На первый взгляд понятия программа и процесс практически одинаковые, однако, их следует отличать друг от друга. Программа представляет собой статический набор команд, а процесс можно представить как программу во время исполнения.
Поток (thread) - объект внутри процесса, получающий процессорное время для выполнения. Без потока программа процесса не может выполняться, таким образом, процесс в Windows сам по себе инертен. Один процесс может владеть несколькими потоками, эти потоки могут «одновременно» исполняют код в адресном пространстве процесса.
Поток включает следующие наиболее важные элементы:
- содержимое набора регистров процессора, отражающих состояние процессора;
- два стека, один из которых используется потоком при выполнении в режиме ядра, а другой - в пользовательском режиме;
- закрытую область памяти, называемую локальной памятью потока (thread-local storage, TLS) и используемую подсистемами, библиотеками исполняющих систем (run-time libraries) и DLL;
|
|
- уникальный идентификатор потока;
- иногда потоки обладают своим контекстом защиты, который используется многопоточными серверными приложениями.
Регистры, стеки и локальные области памяти называются контекстом потока. Очевидно, что контекст потока различен для каждой аппаратной платформе, на которой может работать Windows.
Потоки подобны легковесным процессам. Они в меньшей степени, чем процессы, защищены друг от друга, но позволяют совместить выполнение операций и выиграть в общей производительности процесса, требуя меньших затрат при своем создании и поддержке. Наиболее типичными случаями, когда следует применять многопоточность, являются:
- управление вводом в различные документы MDI-интерфейса, каждый документ приложения представлен отдельным потоком;
- управление вводом данных из нескольких устройств коммуникации;
- разграничение приоритетов выполнения задач: потокам, требующим высокой скорости реакции, присваивается высокий приоритет, а другим потокам более низкий;
- снижение времени реакции на действия пользователя по вводу данных при одновременном выполнении фоновых вычислений;
- разработка клиент-серверных приложений: каждый клиент обслуживается отдельным потоком одного серверного процесса.
Таким образом, программист может выбрать каким способом реализовать мультизадачность в своем приложении: за счет использования нескольких процессов (например, в Visual Studio компилятор запускается как отдельный процесс) или нескольких потоков в рамках одного процесса. Обычно более эффективной является реализация многозадачности в виде одного процесса с несколькими потоками, чем в виде многих процессов с одним потоком, так как:
- контексты потоков занимают меньший объем, чем контексты процессов и система переключает их быстрее;
- взаимодействие потоков проще, так как они могут пользоваться глобальными переменными в общем для них адресном пространстве процесса;
- потоки одного процесса легче синхронизировать, так как им доступны описатели объектов ядра из общего контекста процесса.
Однако в случае ошибочного проектирования потоки могут и ухудшить общий показатель эффективности процесса. Например, время выполнения процесса с двумя потоками будет ниже, чем эффективность двух последовательных однопотоковых процессов, если оба потока выполняются в памяти и не требуют интерфейса с пользователем. Система вынуждена постоянно прерывать эффективно работающие потоки и переключаться между ними. Эти переключения ведут к ненужным потерям или лишним операциям по загрузке в память и последующей выгрузке структур данных, необходимых для обслуживания потоков.
Создание многопоточных процессов требует тщательного предварительного анализа с тем, чтобы должным образом синхронизировать работу потоков. Отслеживание состояний многочисленных потоков требует значительных временных и ресурсных затрат, поэтому следует учитывать, что Windows предоставляет и другие средства реализации асинхронности выполнения операций. Это такие механизмы как:
- асинхронный ввод-вывод (I/O);
- специальные порты I/O (completion ports);
- асинхронные вызовы удаленных процедур (asynchronous procedure calls — АРС);
- функции ожидания системных событий (wait functions).
Прежде чем реализовывать многопоточное приложение необходимо внимательно ознакомиться с перечисленными выше технологиями, возможно, необходимая задача уже решена.
Совместный доступ потоков к разделяемым ресурсам: описателям файлов, портов, глобальным переменным, может создать конфликты. Например, один поток читает данные, а другой пытается одновременно их изменить или один поток ждет завершения определенной операции другим потоком, а тот, в свою очередь, ждет завершения первого потока. Такое «зацикливание» называется тупиковой ситуацией (deadlock). Для предупреждения конфликтов такого рода существуют специальные синхронизирующие объекты ядра системы: семафоры, мьютексы, события и т.д. Вопросы синхронизации будут подробно рассмотрены в следующих разделах пособия.
|
|
Исполняемый код | ||||||||||
Глобальные переменные | ||||||||||
Куча процесса | ||||||||||
Ресурсы процесса | ||||||||||
Список открытых описателей | ||||||||||
Блок переменных окружения | ||||||||||
|
|
В зависимости от характера решаемых задач, различают два вида потоков: асимметричные потоки и симметричные потоки.
Асимметричные потоки (asymmetric threads) - это потоки, решающие различные задачи и, как правило, не разделяющие совместные ресурсы. Необходимость в асимметричных потоках возникает:
- при длительных вычислениях в программе и сохранении при этом нормальной реакции на действия пользователя;
- при реализации асинхронного ввод/вывод с использованием различных устройств (СОМ-порта, звуковой карты, принтера и т. п.);
- при параллельной обработке одних и тех же данных (например, в текстовом редакторе одновременно должны выполняться ввод текса, его автоматическое форматирование и проверка орфографии).
Симметричные потоки (symmetric threads) имеют одинаковое предназначение, исполняют один и тот же код и могут разделять одни и те же ресурсы. Примером симметричных потоков могут служит окна браузера Internet Explorer, каждое окно работает по одной и той же программе, но управляется разными потоками.