русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Создание выполнение и завершение процессов


Дата добавления: 2013-12-23; просмотров: 1743; Нарушение авторских прав


Создание: Открывается исполняемый .exe-файл, соответствующий текущему приложению. Имя файла может указываться явно в cmd. После этого проверяется тип приложения. Если это командный файл(.bat, .com), то для них запускается программа cmd и имя файла является его первым параметром. Приложения Вин32 запускаются непосредственно :

1 - создается объект типа процесс;

2 - выделяется память в участке памяти ядра для блока Eпроцесс – EPROCESS. Инициализируется поля такой структуры. для процесса выделяется адресное пространство в соответствии со сведениями о размерах сегментов, которые выбираются из исполняемого файла. При выполнении любого приложения могут понадобится потоки ядра для выполнения запросов ввода-вывода, выделения памяти, синхронизации и др. Поэтому для всех процессов создается блок для определения списка потока ядра, необходимого для выполнения приложения. Адрес этой структуры добавляется в конец списка готовых процессов.

3 - создается начальный поток. До момента его создания процесс выполнятся не может (процессорное время выделяется только потокам). Для потоков нужно задать стек, который используется для хранения локальных переменных потока и параметры ф-ий потока. Так как Виндоус является вытесняющей ОС, то необходимо выделить память для хранения контекста (данных, необходимых для вытеснения). Размер стека определяется в .exe файле. Поток создается в приостановленном режиме и запускается не сразу.

4 - подсистема Вин32 оповещает об создании нового процесса и потока. Формируются сообщения, в которых передаются дескрипторы созданного объекта. Подсистема вин32 дублирует эти дескрипторы и увеличивает счетчик их использования на 1. При создании – 1,…2,…3...

5 - создается структура данных о процессе и потоке для подсистемы управления процессами. Количество процессов в данном сеансе увеличивается на 1. Если не использован спецрежим, связанный с задержкой, то выполнения потока начинается с заполнения состояния контекста. При этом выполняется инициализация адресного пространства и загружаются необходимые библиотеки. Определяется точка входа программы и с конкретной команды поток начинает свое выполнение. С любым процессом ОС связывает переменные окружения, память для которых выделяется в адресном пространстве процессов, переменные определяют доступные каталоги для приложений, файлов, библиотек.



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

Для чтения параметров могут быть использованы след. ф-ии:

DWORD GenEnviromentVariable(LPCSTR lpName, //имя переменной среды

LPCTSTR buffer,

TWORD wSize); //размер в симовлах

В Windows кванты времени выделяются потокам в соответствии с приоритетом. Используется 32-х разрядное слово. Приоритет определяет класс приоритета процесса и уровень приоритета потока в классе.

Эти 2 величины комбинируются для определения базисного приоритета потока. Существует несколько классов приоритетов:

IDLE_PRIORITY_CLASS, HIGH_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS.

По умолчанию NORMAL_PRIORITY_CLASS. Другой класс устанавливается ф-ией CreateProcess(); изменение – SetPriorityClass(); для определения – GetPriorityClass().

Класс IDLE_PRIORITY_CLASS позволяет задачам данного процесса , не имеющие высокого приоритета, конкурировать с высокоприоритетными задачами. Приоритеты из высшего класса приоритетов необходимо использовать с осторожностью.

Если какая-либо задача выполняется на наивысше ур-не приоритета длительное время, то другие в это время не будут получать время процесса.

Если несколько задач помечены как высокоприоритетные, снижается скорость их выполнения, поэтому класс с наивысшим приоритетом должен резервироваться для задач, которые должны быстро откликаться на критические во времени процессы.

REALTIME_PRIORITY_CLASS используется исключительно для прямого доступа к внешнему у-ву. Для работы с приоритетами процессу можно использовать только символы – константы вместо какого-либо числе – значения уровня приоритета.

Установка соответствия между символьной константой и численным значение выполняется ОС. Создание процесса необходимо выполнять, если необходимо в приложение создание процесса. Ф-я CreateProcess() имеет достаточно большое количество параметров, значение большинства параметров могут установлены по умолчанию

Завершая процесс, ОС выполняет такие действия:

1- завершение выполнения всех потоков процесса;

2- все объекты, созданные процессом, уничтожаются;

3- уничтожаются объекты ядра, если др. не используется другим процессом. Если используется, изменяется счетчик.

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

Есить возможность принудительно завершить процесс: CloseHanle() – из процесса, создавший данный процесс.

Три основных способа завершить процесс:

1) процесс завершается, когда одна из потоковых ф-й произведет вызов ф-ии ExitProcess() с параметром код возварщения.

2) BOOL TerminateProcess(HANDLE hProc, //дескриптор процесса

UINT uExitProcess); //код завершения процесса

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

3) Код завершения процесса совпадает с кодом завершения потока.

Для получения информации о выполняемом процессе используется база данных из реестра HKEY_PERFOMANCE_DATA.

PerfomanceDataHandler – из динамической библиотеки.

Для упрощения управления группой процесса используется объединения процессов по определенному признаку. Такой контейнер называется заданием, для которого можно установить ограничения:

- процессы не могут монопольно захватывать ресурсы (базовые ограничения)

- базовые ограничения по пользовательскому интерфейсу

- ограничения, связанные с защитой.

 

Объекты синхронизации

События

События используется когда нужно в ручную управлять состоянием(свободное или занятность )а также выполнять определены действия в зависимости от этих состоянии.

Функции для создание таких событий и управлении

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttribute \\ атрибуты безопасности

BOOL bManualReset \\ признак управлении вручную

BOOL bInitialState\\ начальное состояние события

LPCTSTR lpName \\ имя события

);

В успешном возвращает дескриптор события , в другом ноль .

Установка свободного текущего состоянии

BOOL SetEvent(HANDLE hEvent\\ дескриптор события);

BOOL ResetEvent(-//-);

Освобождение яда события объекта ядра CloseHADLE.

Алгоритм события ОС например:

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

Допустим другой поток установил заданное события в заданное состояние, ядро приступает к анализу потоков ожидающие данное событие, если в очереди есть, ядро изменяет его состояние из состояние ожидание, в состояние готов, если этот поток имеет динамический приоритет, то значение приоритета может измениться.

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

Mutex - это глобальные объекты с помощью которых можно организовать последовательный доступ к ресурсам . В начале Mutex устанавливается, затем выполняется некоторые действие, после его завершении Mutex завершается, если Mutex уже установлен, то любой другой поток, который попытается установить этот Mutex будет остановлен, до момента освобождения Mutex предыдущим потоком, одновременно может использоваться различными приложениями. Mutex применяться для синхронизации доступа у ресурсам несколькими потоками разными процессами, при этом можно задавать максимальное время ожидание доступа к ресурсам. Для проверки повторного запуска процесса, для организации критической секции для процесса (можно и для потоков но эти менее эффективное)

Функция которая открывает Mutex

HANDLE CreateMutex

(

LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибут безопастности

BOOL bInitialOwner, // флаг начального владельца

LPCTSTR lpName // имя объекта

);

Режимы Mutex: если истина то Mutex сразу присвататься состояние занятости, при чем считается занятым потоком который его создал , это имеет смысл когда поток который его создал должен выполняться первым. Что бы Mutex стал занятым используется одна из функций ожидания., которая проверяет его состояние и в определенных случаях устанавливает состояние занятости . значение параметра ложь, если все потоки используется Mutex равноправные, освобождение Mutex выполняет BOOL ReleaseMutex(HANDLE hMutex).

Семафоры – в некотором смысле они аналогичные Mutex но при их работе посчитается количество обращений. Семафор это объект синхронизации который содержит счетчик пользователей(потоки которые использует). Счетчик текущего количества ресурсов и максимальное количество ресурсов которое контролирует ресурсов. Обычно они использует для д управлении множествами ресурсов и также для организации критических секций. Функция создание семафонов

CreateSemaphore(

LPSFCURTTY_ATTRIBUTES lpSemaphoreAttributes, // атрибут доступа

LONG InitialCount* начальное содержание счетчик*

LONG lMaximumCount *максимальное содержание счетчика *

LPCTSTR lpName*имя объекта семафора*);

Если счетчик= отсутствует доступный ресурс, все потоки ожидание какого-то ресурса будут заблокированные, если текущее значения счетчика умещает количество доступных ресурсов на 1 и разрешает доступ к этому ресурсу. Для изменение количества ресурсов

BOOL ReleaseSemaphore

(

HANDLE hSemaphore, // хенд семафора

LONG lReleaseCount, // на сколько изменять счетчик

LPLONG lpPreviousCount // предыдущее значение

);

Даная функция изменяет количество свободных ресурсов равно второму параметру, предыдущее значение зарисуется в 3 параметр, если в будущем 3 параметр не используется можно задать 0. Ожидаемые таймеры используются в том случае если нужно использовать фактор времени.

Создание ожидающего таймера

HANDLE CreateWaitableTimer(

LPSECURITY_ATTRIBUTE lpTimerAttribute,\\атрибуты безопасности

BOOL bManualReset,\\ задает ручного или автоматического сброса

LPCTSTR lpTimerName\\ имя таймера

);

Если используется ручной сброс таймера после освобождение раз блокируется все потоки которые его ожидают, если автоматический то расблокируеться один процесс, который выбирает ОС, при создание таймера его сотояние устанавливается занятости. Для настройки такого таймера

BOOL SetWaitableTimer(

HANDLE hTimer,

const LARGE_INTEGER* pDueTime,//определает начальное время, когда таймер станет свободным, если <0 то модулю задает количество интервалов до срабатывание таймера, при чем эта величина задаеться 100 нмс

LONG lPeriod // период, указывает интервал времин в м сек таймер становиться свободный, если 0 то таймер сработает только один раз

PTIMERAPCROUTIME pfnComletionRoutine,// функция которая вызывается срабатывание таймера

LPVOID lpArgToCompletionRunTime, // адрес функции

BOOL fResume// (!!!)

);

Данная функции не только настраивает, а также являться функции ожидание, ожилает срабатывает таймера, после этот функции нет смысла ставить «вейтобжект». Внутреннюю функцию вызывает ОС, а не приложение, по этому ее называют функцией обратного вызова, функци ставиться в очередь потока при срабатывание таймера, ее время выполнение должно быть меньше интервала срабатывания таймера. Такая функция ставиться в очередь потока взывающей функции «сетветейбел таймер», но лишь в том случае если этот поток находиться в состоянии ожидания, если поток не в состоянии ожидания, функция не ставиться внутри этого потока и очередь не переполняется. Функция ожидание завершает работу после все обработки элементов очереди.

Рассмотренные объекты синхронизации устанавливают и используют свободное состояние которое учитуються функции ожидания .

 



<== предыдущая лекция | следующая лекция ==>
АДАПТИВНО-РЕФЛЕКТОРНОЕ ПЛАНИРОВАНИЕ | Механизм сообщений Windows


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.