Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка к лабораторным работам (рус).doc
Скачиваний:
3
Добавлен:
15.11.2018
Размер:
353.79 Кб
Скачать

1. Управление процессами и потоками

1.1. Цель работы

Ознакомление со структурой Windows - приложений, организацией взаимодействия программ с операционной системой, получение практических навыков по составлению, написанию и отладке программ, создающих объекты операционной системы такие как задания, процессы и потоки.

1.2. Указания по подготовке к выполнению лабораторной работы

Необходимо изучить принцип построения и логику работы Windows-приложения, обратив внимание на порядок создания потоков, процессов, приложений, заданий.

При подготовке к работе необходимо изучить конспект лекций по указанной теме, методические указания, а также разделы, указанные в [ ], [ ].

    1. . Обзор темы работы

1.3.1. Понятия процесса, потока, задания

Процесс обычно определяют как экземпляр выполняемой программы, и он состоит из двух компонентов:

  • объекта ядра, через который операционная система управляет процессом. Там же хранится статистическая информация о процессе.

  • адресного пространства, в котором содержится код и данные всех EXE- и DLL- модулей. Именно в нем находится область памяти, динамически распределяемой для стеков потоков и других нужд.

Процессы не исполняются - они статичны. Чтобы процесс выполнял что-нибудь, в нем нужно создать поток. Поток содержит код, который исполняется процессором. Процесс может содержать несколько потоков в своем адресном пространстве, тогда они выполняются "одновременно". В общем случае, операционная система равномерно распределяет процессорное время между потоками. Если процесс загружен на многопроцессорной машине существует возможность привязки потоков к отдельным процессорам.

В свою очередь поток также состоит из двух компонентов:

  • объекта ядра, через который операционная система управляет потоком. Там же хранится статистическая информация о потоке;

  • стека потока, который содержит параметры всех функций и локальные переменные, необходимые потоку для выполнения кода.

Поток располагает собственным набором регистров процессора и собственным стеком, что делает его "независимым" программным элементом. Как правило, в процессе выделяют первичный поток (для программистов на С++ - это функция WinMain), который создается системой автоматически, и дочерние потоки, порождаемые главным потоком.

Но разработчикам Windows и этого показалось мало и они придумали еще один объект операционной системы – задание. Он позволяет группировать процессы и помещать их в некий контейнер, который определенным образом ограничивает их действия (например, ограничивает адресное пространство или время выполнения процессов). Это полезно для многозадачных приложений, которые создают несколько процессов при работе над одной задачей.

1.3.2. Создание и завершение процесса

Три основные события, приводящие к созданию процессов:

  • Загрузка системы

  • Работающий процесс подает системный вызов на создание процесса

  • Запрос пользователя на создание процесса

Во всех случаях, активный текущий процесс посылает системный вызов на создание нового процесса. В UNIX каждому процессу присваивается идентификатор процесса ( PID - Process IDentifier). В Windows процесс создается при вызове функции :

BOOL CreateProcess(

LPCTSTR lpApplicationName, // строка с именем запускаемого файла

LPTSTR lpCommandLine, // командная строка

LPSECURITY_ATTRIBUTES lpProcessAttributes,// атрибуты защиты

LPSECURITY_ATTRIBUTES lpThreadAttributes,// атрибуты защиты

BOOL bInheritHandles, // флаг наследования

DWORD dwCreationFlags, // флаги создания

LPVOID lpEnvironment, // указатель на переменные окружения

LPCTSTR lpCurrentDirectory, // указатель на текущую директорию

LPSTARTUPINFO lpStartupInfo, // указатель на стартовую структуру

LPPROCESS_INFORMATIONlpProcessInformation

//информация о создаваемом процессе

);

Подробное объяснение параметров функции дано в [1, стр. 48-80].

Завершение процесса возможно одним из четырех способов:

      1. Входная функция первичного потока возвращает управление. (рекомендуемый способ).

      2. Один из потоков процесса вызывает функцию ExitProcess (нежелательный способ).

VOID ExitProcess( UINT uExitCode );

      1. Поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно).

BOOL TerminateProcess( HANDLE hProcess , DWORD uExitCode );

4. Все потоки процесса умирают по своей воле (большая редкость).