Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS_l.docx
Скачиваний:
5
Добавлен:
01.12.2018
Размер:
69.76 Кб
Скачать

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

Создание: Открывается исполняемый .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); //код завершения процесса

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

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

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

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

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

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

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

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

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

Проблемы для выполнения 2 и более потоков: 1. взаимное исключение 2.необходимость синхронизации 3. взаимоблокировка 4.коммуникации между потоками

2 потока могут так взаимодействовать между собой:

1. первый поток вып до конца, потом выполняется 2 – последовательное вып

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

3. 2ой поток нач вып после начала 1ого но до его завершения – параллельное вып потоков

Если 2 или более потоков исп общий ресурс то такой ресурс наз Критическим ресурсом

Процессы (потоки) кот необходим один и тот же ресурс находятся в сост взаимоисключения и доступ к нему может получить только один ресурс

Олним из методов решения этой проблемы явл использование виртуальных ресурсов. Каждому критическому ресурсу ставится в соотв виртуальный ресурс, их кол-во совпадает с количеством потоков кот одновременно претендуют на этот ресурс.

Все 3 схемы становятся эквивалентными, но вирт ресурсы дают возможность оценить, то что какой-то из этих ресурсов выполнится ранне остальных

Логическое время – время выполнения потока, если у него нет конкурентов

Участок проги или поток кот исп крит ресурс наз критической секцией проги

Одновременно несколько потоков не могут вып критическую секцию для вып одного итого же крит ресурса

В винде объект синхронизации должен хранить инфу доступную для потоков кот выполняются (работа кот синхронизируется)

Потоки и процессы имеют независимые адресные пространства кот. Никогда не пересек. Для вып общих обьектов исп память ядра. Для этого необходимо постоянно переходить из режима пользователя в реж ядра и наоборот. Операция синхрониз вып только в случае её необходимости и их кол-во необходимо уменьшать. Потоки процесса исп одно и тоже адресное пространство поэтому обьекты синхронизации для потов обычно хранятся в адресном пространстве потоков. Но для блокирования потока все равно необх переходить в режим ядра. Потери времени будут, чем больше чем чаще потоку прийдется ждать освобождения ресурса.

Атомарный доступ- монопольный захват ресурсов потоков кот к нему обращаются. Самый простой способ синхрониз потоков обеспечивают Interloсked функции. Эти функции гарантируют монопольный доступ к перем типа long независимо от того какой именно код генерируется компилятором и сколько процессоров имеет компьютер Этот способ самый быстрый

Вызов одной из Interloсked функций требует не менее 50 тактов процессора в то время как переход в режим ядра требует не менее 1000 тактов

Эти ф-ции позволяют: - изменить значение переменной указанной своим адресом на заданную величину – проверить значение переменной и изменить его наперед в зад случае

Адреса всех перем кот. задаются в функ этого класса должны быть выровнены на границу 32 битного слова(кратны 4)

Для указателей функций данного класса задается слово volatile. Кот значит что значение этой переменной нельзя брать из кэша, оно должно каждый раз обновляться. Это делается для того что бы в многопроцессорных системах раб с актуальным значением переменной

Примеры Interloсked функции

1.Для присвоения зад. Значение переменной в режиме эксклюзивного доступа исп, функция Interloсked Exchange

Interloсked Exchange

LONG Volatile *Target,

LONG Value

2 параметра Target – результат выполнения этой функции Value – присваиваемое значение

2. для изменения значения переменной на постоянную величину исп ф-ция Interloсked Exchange Add

Interloсked Exchange Add (

LONG Volatile*Addend;

LONG Value

Addend – увеличивает значение переменной на величину 2 переменной

3. для присвоения переменной значения другой переменной исп ф-ция Interloсked Exchange Point(

LONG Volatile*Target

LONG Value

Оба параметра – адреса переем исходные, Value - результат Target

4. Функция Exchange Pointer может работать и в 32 и 64 разрядными величинами. Все функции возвращ исходные значения.

Interloсked позволяет вып только элементарные операции. Если нужно вып группу операций то они объединяются в критическую секцию.

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

Для исп крит секции необходимо:

  1. выделить память под нее так что бы она была доступна всем потоковым функциям ее использующим CRITICAL_SECTION

  2. до создания потоков исп. Критическую секцию инициализировать её

void initialize Critical Section( LPCRITICAL_SECTION lp Critical Section);

адрес структуры о кот мы говорим. ОС формирует поля структуры так что бы показать что при инициализации критическая секция свободна

  1. определить начало критич участка потоковой функции с помощью функции void EnterCriticalSection(то что было написано в предыдущем примере)

В этом случае проверяется поле занятости критич секции. Если своб то значение флага занятости меняется и продолжается выполнение проги. Если необходимо проверить можно ли войти в критическую секцию исп ф-ция try EnterCriticalSection если вход возможен то функция вернет true и данная функция выполнится как EnterCriticalSection

4) опред конец крит секции с помощью ф-ции void LeaveCriticalSection(-“-) у этой функции флаг занятости установлен в «свободен» и потом ожидавшие его освобождения потоки разблокируются

5) в основном потоке (где вып инициализация критической секции) если инициализация больше не нужна, то ее нужно удалить. Функция DeleteCriticalSection(-“-) при завершении крит секция удаляется автоматически. Если для нее выполнено удаление то далее исп. функцию EnterCriticalSection нельзя

Для синхронизации процессов исп. специальные объекты. Виды таких объектов:

  1. события Event – самый простой объект в управлении исп для организации крит секций и в качестве двоичных семафоров, и для асинхронного ввода-вывода

  2. Мьютексы Mutex – исп для организации критических секций в процессах

  3. Семафоры – Semaphore применяются для синхронизации в случае заданного количества однородных процессов

  4. Ожидающие таймеры Waitable Timer – исп для синхронизации с учетом временных интервалов временных интервалов или абсолютного времени\

Виды функций ожидания (wait-функций):

  1. ожидание единичного объекта

WaitForSingleObject(

HANDLE hHandle;

DWORD dwMilliseconds);

2 параметра: 1) дескриптор обьекта ядра (занят/свободен) 2) интервал времени для ожидания данного обьекта

Возвращает Wait object=0- перешел в сост «свободен»

  1. ожидание множественного объекта

WORD WaitForMultipleObject(

DWORD nCount;

CONST HANDLE *lpHandles;

BOOL BWaitAll;

DWORD dWMilliseconds);

    1. Count – количество дескрипторов сост.кот. мы проверяем

    2. Массив дескрипторов сост кот мы проверяем

    3. флаг ожидания true – ждет освобождения всех объектов false – ожидание освобождения хотя бы одного объекта

интервал ожидания если не определен то ждет столько сколько потребуется 2 возвращ знач

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]