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




Планирование и диспетчеризация потоков.

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

Планирование – формирование очереди процессов, готовых к выполнению.

Диспетчеризация – выбор процессора и его времени для процесса, готового к выполнению.

Часто процедура обслуживания очереди процессов и выбора процессора выполняется 1 модулем – планировщик-диспетчер. Системы реального времени представляют особый случай.

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

Планирование организует работу каждого вида. Планирование определяет, какому процессу будет выделен квант времени и размер этого кванта.

Возможно использование очереди с приоритетами: к каждому процессу в очереди ставится в соответствие некоторый приоритет (целое число). Приоритет определяется статическими и динамическими характеристиками процесса. К статическим характеристикам относятся: необходимый размер памяти и ожидаемое процессом время, а также ожидаемый объем ввода-вывода. Приоритет, назначаемый пользователем, также определяется статическими характеристиками.

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

Изменение динамич. приоритета чаще всего происходит в сторону увеличения на несколько квантов времени.

Системные процессы имеют такой же приоритет, что и пользовательские, за исключением процессов внешних устройств.

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

В случае пустой очереди ОС имеет холостой процесс, запускаемый в данном случае.

В ОС Виндоус используется 32 уровня приоритета. Процессы могут выполняться параллельно. В некоторых ОС приоритет меняется в диапазона 0 – 255.

Диспетчеризация имеет несколько дисциплин:

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

1)заблокированный процесс ставится в конец очереди

2)перемещение перед теми задачами, которые не выполнялись.

 

Планирование

Циклическое планирование – после завершения кванта времени, если процесс не завершен, ставится в очередь. Для выполнения процесс выбирается из головы очереди. При циклическом планировании имеет размер значение размер кванта времени процессора. Если его величина велика, то последним в очереди процессам приходится слишком долго ожидать своего выполнения. Сокращение квантов времени улучшает обслуживание более коротких процессов. Выбор слишком малого значения кванта времени может привести к тому, что размер кванта станет соразмерным со временем, необходимым для переключения процесса. Такая ситуация увеличивает накладные расходы времени на переключение.

 

ПЛАНИРОВАНИЕ с использованием очереди с обратной связью.

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

 

ПРИОРИТЕТНОЕ ПЛАНИРОВАНИЕ

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

Если вытеснение разрешено, то управление будет передано более высокоприоритетному процессу до завершения кванта времени. При этом вытесненный процесс (прерванный) поступает в очередь на выполнение. Вытеснение требует определенных затрат. Если до завершения процесса осталось много времени, то вытеснении нецелесообразно. Особенно неблагоприятно для процессов, имеющих невысокий приоритет и выполняющихся в течение долгого времени.

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

Использование разных очередей для управления различными приоритетами упрощает управление процессами.

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

 

АДАПТИВНО-РЕФЛЕКТОРНОЕ ПЛАНИРОВАНИЕ

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

Алгоритм планирования должен разрешать несколько противоположный устремления, а иногда и ситуаций. Должен обеспечивать высокую скорость реакции, хороший отклик на фоновые задачи, не допускать «голодовки» процессов. Должен согласовывать потребности низко- и высокоприоритетных процессов.

Существует множество правил, которые определяют, когда и каким процессами выделить кванта времени процессора, называемый Политикой Планирования. Пол. планир. обязательно учитывает распределение времени между процессами. Базируется на ранжировании процессов по их приоритетам. В большинстве современных ОС приоритет изменяется с учетом того, что именно делит процесс (поток). За счет такого анализа и изменения уровня приоритета, процессам, которое долгое время отказывалось выделение кванта времени, будет выделен квант времени.

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

С точки зрения требования проц. время проц. делится на два класса:

1) процессы, которые требуют много времени для ввода-вывода

2) процессы, которые требуют много чисто процессорного времени

Обычно процессам из первого кл. присваивается более высокий приоритет.

С точки зрения планирования, процессы разделяют на 3 класса:

- интерактивные

- пакетные

- процессы реального времени.

Интерактивные процессы взаимодействуют с пользователем посредством клавиатуры или мыши. Когда новые данные введены, процесс должен быстро откликнуться. Ср. задержка – 50-150 мс. Для обеспечения быстрой реакции на ввод-вывод данных таким процессам присваивается высокий динамический приоритет.

Пакетные процессы не требуют взаимодействий с пользователем и часто вып. как фоновые. Не требуют высокой реактивности, и планировщик назначает им невысокий динамический приоритет (компиляторы, реализация задач научных вычислений).

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

Для управления приоритетами можно использовать системные вызовы – ф-ии API. У одной из основных подсистем ОС Windows является подсистема управления процессами – CSRTS.

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

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

Создание: Открывается исполняемый.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 – из динамической библиотеки.

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

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

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

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

 

В тех случаях когда одновременно выполняются 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);

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

3) определить начало критич участка потоковой функции с помощью функции 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- перешел в сост «свободен»

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

WORD WaitForMultipleObject(

DWORD nCount;

CONST HANDLE *lpHandles;

BOOL BWaitAll;

DWORD dWMilliseconds);

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

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

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

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

 

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

События

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

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

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// (!!!)

);

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

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: