Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Процессы в Win32Стр 1 из 2Следующая ⇒
Лабораторная работа №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, каждое окно работает по одной и той же программе, но управляется разными потоками.
|