Создание выполнение и завершение процессов
Планирование и диспетчеризация потоков.
Наиболее критическим ресурсом любой системы – время процессора. В многопроцессорных системах задача управления ими усложнена. Для управления временем процессора используется два модуля ОС – Планирование и Диспетчеризация.
Планирование – формирование очереди процессов, готовых к выполнению.
Диспетчеризация – выбор процессора и его времени для процесса, готового к выполнению.
Часто процедура обслуживания очереди процессов и выбора процессора выполняется 1 модулем – планировщик-диспетчер. Системы реального времени представляют особый случай.
В очереди, готовых к выполнению процессов могут находится новые процессы, которые только что запущены и не получали ни разу кванта времени процессора.
Планирование организует работу каждого вида. Планирование определяет, какому процессу будет выделен квант времени и размер этого кванта.
Возможно использование очереди с приоритетами: к каждому процессу в очереди ставится в соответствие некоторый приоритет (целое число). Приоритет определяется статическими и динамическими характеристиками процесса. К статическим хар. относятся: необходимый размер памяти и ожидаемое процессом время, а также ожидаемый объем ввода-вывода. Приоритет, назначаемый пользователем также определяется статическими характеристиками.
Динамические характеристики – изменения при выполнении программы. На них влияет поведение процесса при предыдущем выделении кванта времени процессора. Приоритет может быть временно увеличен, если приложение выполнило запрос ввода-вывода либо приложение стало приложением переднего плана.
Изменение динамич. приоритета чаще всего происходит в сторону увеличения на несколько квантов времени.
Системные процессы имеют такой же приоритет, что и пользовательские, за исключением процессов внешних устройств.
Необходимо учитывать показатели производительности, малое время простоя, обоснованное время ожидание заданий пользователя.
В случае пустой очереди ОС имеет холостой процесс, запускаемый в данном случае.
В ОС Виндоус используется 32 уровня приоритета. Процессы могут выполнятся параллельно. В некоторых ОС приоритет меняется в диапазона 0 – 255.
Диспетчеризация имеет несколько дисциплин:
1) Бесприоритетные - линейные (в порядке очереди, случайный выбор процесса), циклические (циклический алгоритм, многоприоритетный циклический алгоритм)
2) Приоритетные – с динамическим приоритетом (приоритеты, зависящие от времени ожидания, зависящие от времени обслуживания), с фиксированным приоритетом (абсолютный, относительный приоритеты, адаптивное обслуживание, многоприоритетный циклический алгоритм).
Самой простой в реализации дисциплиной является дисциплина FIFO. Если процессы при выполнении были заблокированы, то после перехода в состояние готовности ставятся в эту очередь. Возможны 2 вар:
1)заблокированный процесс ставится в конец очереди
2)перемещение перед теми задачами, которые не выполнялись.
лекция 7
Планирование
Циклическое планирование – после завершения кванта времени, если процесс не завершен, ставится в очередь. Для выполнения процесс выбирается из головы очереди. При циклическом планировании имеет размер значение размер кванта времени процессора. Если его величина велика, то последним в очереди поцессам приходится слишком долго ожидать своего выполнения. Сокращение квантова времени улучшает обслуживание более коротких процессов. Выбор слишком малого значения кванта времени может привести к тому, что размер кванта станет соразмерным со временем, необходимым для переключения процесса. Такая ситуация увеличивает накладные расходы времени на переключенне.
ПЛАНИРОВАНИЕ с использование очереди с обратной связью.
В очередь помещается процесс №1. Такой процесс становится в очередь №2. Если при выдачи канта времени он не завершится, то перейдет в очередь №3. Планировщик выделяет процессорное время процессам, находящимся в очереди с наименьшим номером. В таком случае, наивысший приоритет имеют процессы в очереди №1(новые процессы).Если очередь новых процессов иссякает, то тогда квант времени выделяется процессам из 2-ой очереди. Для организации и работы нескольких очередей необходимы дополнительные затраты ресурсов. Обычно для сокращения потерь следующая очередь может выбираться не тогда, когда предыдущая очередь опустеет, а по истечению фиксированного кол-ва квантов времени.
ПРИОРИТЕТНОЕ ПЛАНИРОВАНИЕ
Время выделяется наиболее приоритетнму процессу, который выполняется до тех пор, пока не будет полностью выполнен или заблокирован в связи с нобходимостью операции ввода-вывода. Если в системе не разрешено вытеснение, то выполнение процесса продолжается до завершения кванта времени, даже если в это время в очереди появляется процесс с более высоким приоритетом.
Если вытеснение резрешено, то управление будет передано более высокоприоритетному процессу до завершения кванта времени. При этом вытесниный процесс (прерванный) поступает в очередь на выполнение. Вытеснение требует определенных затрат. Если до завершения процесса осталось много времени, то вытеснении нецелесообразно. Особенно неблагоприятно для процессов, имеющих невысокий приоритет и выполняющихся в течении долгого времени.
Если используется общая очередь для всех приоритетов, они должны быть упорядочены по уменьшения приоритетов. В таком случае из очереди выбирается первай процесс. Запись какого-либо процесса в очередь с использованием приоритета требует просмотра в среднем, половины очереди.
Использование разных очередей для управления различными приоритетами упрощает управление процессами.
Существуют системы, где учитывается зависимость размера кванта времени процессора от приоритета процесса. Это обеспечит выполнение высокоприоритетных процессов. В современных процессорах используется и динамический приоритет.
АДАПТИВНО-РЕФЛЕКТОРНОЕ ПЛАНИРОВАНИЕ
Выполняется с учетом потребности процесса в памяти. Оценка необходимого объема памяти проводится по затратам памяти при предудущем выделении кванта времени. При очередном выполнении понадобится столько же. При наличии в конкретный момент времени в системе необходимого объема памяти, процессу может быть выделен квант времени процессора, при этом размер выделяемого кванта будет обратно пропорционален необходимому объему памяти. Такое планирование вынуждает оптимизировать программы по объему потреб. памяти.
Алгоритм планирования должен разрешать несколько противоположный устремления, а иногда и ситуаций. Должен обеспечивать высокую скорость реакции, хороший отклик на фоновые задачи, не допускать «голодовки» процессов. Должен согласовывать потребности низко- и высокоприоритетных процессов.
Существует множество правил, которые определяют, когда и каким процессами выделить кванта времени процессора, называемыйПолитикой Планирования. Пол. планир. обязательно учитывает распределение времени между процессами. Базируется на ранжировании процессов по их приоритетам. В большинстве современных ОС приоритет изменяется с учетом того, что именно делит процесс (поток). За счет такого анализа и изменения уровня приоритета, процессам, которое долгое время отказывалось выделение кванта времени, будет выделении квант времени.
Процессы, которые выполняются длительное время, штрафуются путем снижения их приоритета. (но не ниже базового).
С точки зрения требования проц. время проц. делится на два класса:
1) процессы, которые требцют много времени для ввода-вывода
2) процессы, которые требуют много чисто процессорного времени
Обычно процессам из первого кл. присваивается более высокий приоритет.
С точки зрения планирования, процессы разделяют на 3 класса:
- интерактивные
- пакетные
- процессы реального времени.
Интерактивные процессы взаимодействуют с пользователем посредством клавиатуры или мыши. Когда новые данные введены, процесс должен быстро откликнуться. Ср. задержка – 50-150 мс. Для обеспечения быстрой реакции на ввод-вывод данных таким процессам присваивается высокий динамический приоритет.
Пакетные процессы не требуют взаимодействий с пользователем и часто вып. как фоновые. Не требуют высокой реактивности и планировщик назначает им невысокий динамический приоритет (компиляторы, реализация задач научных вычислений).
Процессы реального времени выдвигают наиболее строгие треб. к планированию. Они никогда не должны блокироваться низкоприоритетными процессами и должны обладать мин. реактивностью на ввод-вывод. Им присваивается наивысший динамич. приоритет (драйвера, роботы прогр.)
Для управления приоритетами можно использовать системные вызовы – ф-ии API. У одной из основных подсистем ОС Windows является подсистема управления процессами – CSRTS.
основная задача – управление окнами, создание и уничтожение процессов и потоков, поддержка создания многоязыковых приложений и др.
лекция 8
Механизм сообщений Windows
В основ Работы ОС Windows и работающи в нем лежит обработка сообщений. Система и приложения выработают такие сообщения на в качестве ответа на каждое события. В wndows каждый поток имеет собственную очередь сообщений, что позволяет потокам работать не зависимо . сообщения имеют структуру данных
typedef struct tagMSG {
HWND hwnd;// дескриптор окна
UNIT message; /// индитфиикатор сообщений
WPARAM wParam; // в каждой сообщений свое значения
LPARAM lParam;//
GWORD time;//количетсво м.сек с момента запуска окна
POINT pt; // положения курсор мыши в экранных координатах
}
MSG;
Основой механизмом сообщения является поток сообщений. Сообщения предназначенные конкретному потоку ставиться в очередь конкретному потоку. Отдельные сообщения могут назначаться несколькими потокам или относиться системе. Для вывода сообщений используется функция MessageBox выводить на эран окно с сообщением и кнопко лии кнопаками выхода
Int MessageBox (
HWND hwnd;//дескриптор окна
LPCTSTR lpText,//сообствено текс содержания сообщений
LPCTSTR lpCaption;// заголовок окна
UNIT uType//тип окна(можно указать использований кнопок)
)
Типы параметром: первый-32 битовой целый, второй 32 битный указатель на строку, 4-ый 32-битное целое. Для работы с окнами в программе выделяют 4 секции : регистрация класса окон, создания главного окна, цикл обработки очереди сообщений, процедура главного окна.
Регистрация классов окон выполняется выполняеться с помощью функции RegisterClassA(WNDCLASS) который содержит один параметр, указатель на структуру в ней содержиться информация о окне. На основе зарегистрированного класса с помощью CreateWindows можно создать экземпляр окна и все его особенность его описать
Цикл обработки очереди сообщений
while(GetMessage(&msg,NULL,0,0))
{
//разрешить использования клавиатуры путем трансляции сообщений о виртуальный клавиш сообщения о цифровых клавиш
TranslateMessage(&msg) ;
//вернуть управления windows и передать сообщения далее процедуре окна
DispatchMessage(&msg) ;
}
GetMessage – выбирает очередное сообщения из цепочек сообщений и помещает в структуру msg.
TranslateMessage –действия касается сообщений WM_KEYDOWN, WM_KEYUP, которые транслируются в WC_CHAR WM_DEADCHAR, WM_SYSKEYDOWN и WM_SYSKEYUP –которые преобразуются в WM_SYSCHAR, WM_SYSDEADCHAR. Смысл преобразования заключаеться в посылке дополнительной сообщений. Выход из цикла ожидания имеет место только в том случае если GetMessage возвращает ноль.
Процедура выполниться необходимые функции для вывода информации в окно , восприятия указаний проявляющий в окне, в том числе в виде выбора пункта меню или указания на очередным шаге диалога и анализ вводим указанных ус клавиатуры , выполнения необходимы действий и вида состояния … Для реализации таких действи надо знать такие функции : прототип функции окна
LRESULT CALLBACK WindowsFunc(
HWND hwnd,//идификатор окна
UINT message,//идификарот сообщений
// уточнают смыл сообщения
WPARAM wParam,
LPARAM lParam,
)
Планирование и диспетчеризация потоков.
Наиболее критическим ресурсом любой системы – время процессора. В многопроцессорных системах задача управления ими усложнена. Для управления временем процессора используется два модуля ОС – Планирование и Диспетчеризация.
Планирование – формирование очереди процессов, готовых к выполнению.
Диспетчеризация – выбор процессора и его времени для процесса, готового к выполнению.
Часто процедура обслуживания очереди процессов и выбора процессора выполняется 1 модулем – планировщик-диспетчер. Системы реального времени представляют особый случай.
В очереди, готовых к выполнению процессов могут находится новые процессы, которые только что запущены и не получали ни разу кванта времени процессора.
Планирование организует работу каждого вида. Планирование определяет, какому процессу будет выделен квант времени и размер этого кванта.
Возможно использование очереди с приоритетами: к каждому процессу в очереди ставится в соответствие некоторый приоритет (целое число). Приоритет определяется статическими и динамическими характеристиками процесса. К статическим хар. относятся: необходимый размер памяти и ожидаемое процессом время, а также ожидаемый объем ввода-вывода. Приоритет, назначаемый пользователем также определяется статическими характеристиками.
Динамические характеристики – изменения при выполнении программы. На них влияет поведение процесса при предыдущем выделении кванта времени процессора. Приоритет может быть временно увеличен, если приложение выполнило запрос ввода-вывода либо приложение стало приложением переднего плана.
Изменение динамич. приоритета чаще всего происходит в сторону увеличения на несколько квантов времени.
Системные процессы имеют такой же приоритет, что и пользовательские, за исключением процессов внешних устройств.
Необходимо учитывать показатели производительности, малое время простоя, обоснованное время ожидание заданий пользователя.
В случае пустой очереди ОС имеет холостой процесс, запускаемый в данном случае.
В ОС Виндоус используется 32 уровня приоритета. Процессы могут выполнятся параллельно. В некоторых ОС приоритет меняется в диапазона 0 – 255.
Диспетчеризация имеет несколько дисциплин:
1) Бесприоритетные - линейные (в порядке очереди, случайный выбор процесса), циклические (циклический алгоритм, многоприоритетный циклический алгоритм)
2) Приоритетные – с динамическим приоритетом (приоритеты, зависящие от времени ожидания, зависящие от времени обслуживания), с фиксированным приоритетом (абсолютный, относительный приоритеты, адаптивное обслуживание, многоприоритетный циклический алгоритм).
Самой простой в реализации дисциплиной является дисциплина FIFO. Если процессы при выполнении были заблокированы, то после перехода в состояние готовности ставятся в эту очередь. Возможны 2 вар:
1)заблокированный процесс ставится в конец очереди
2)перемещение перед теми задачами, которые не выполнялись.
лекция 7
Планирование
Циклическое планирование – после завершения кванта времени, если процесс не завершен, ставится в очередь. Для выполнения процесс выбирается из головы очереди. При циклическом планировании имеет размер значение размер кванта времени процессора. Если его величина велика, то последним в очереди поцессам приходится слишком долго ожидать своего выполнения. Сокращение квантова времени улучшает обслуживание более коротких процессов. Выбор слишком малого значения кванта времени может привести к тому, что размер кванта станет соразмерным со временем, необходимым для переключения процесса. Такая ситуация увеличивает накладные расходы времени на переключенне.
ПЛАНИРОВАНИЕ с использование очереди с обратной связью.
В очередь помещается процесс №1. Такой процесс становится в очередь №2. Если при выдачи канта времени он не завершится, то перейдет в очередь №3. Планировщик выделяет процессорное время процессам, находящимся в очереди с наименьшим номером. В таком случае, наивысший приоритет имеют процессы в очереди №1(новые процессы).Если очередь новых процессов иссякает, то тогда квант времени выделяется процессам из 2-ой очереди. Для организации и работы нескольких очередей необходимы дополнительные затраты ресурсов. Обычно для сокращения потерь следующая очередь может выбираться не тогда, когда предыдущая очередь опустеет, а по истечению фиксированного кол-ва квантов времени.
ПРИОРИТЕТНОЕ ПЛАНИРОВАНИЕ
Время выделяется наиболее приоритетнму процессу, который выполняется до тех пор, пока не будет полностью выполнен или заблокирован в связи с нобходимостью операции ввода-вывода. Если в системе не разрешено вытеснение, то выполнение процесса продолжается до завершения кванта времени, даже если в это время в очереди появляется процесс с более высоким приоритетом.
Если вытеснение резрешено, то управление будет передано более высокоприоритетному процессу до завершения кванта времени. При этом вытесниный процесс (прерванный) поступает в очередь на выполнение. Вытеснение требует определенных затрат. Если до завершения процесса осталось много времени, то вытеснении нецелесообразно. Особенно неблагоприятно для процессов, имеющих невысокий приоритет и выполняющихся в течении долгого времени.
Если используется общая очередь для всех приоритетов, они должны быть упорядочены по уменьшения приоритетов. В таком случае из очереди выбирается первай процесс. Запись какого-либо процесса в очередь с использованием приоритета требует просмотра в среднем, половины очереди.
Использование разных очередей для управления различными приоритетами упрощает управление процессами.
Существуют системы, где учитывается зависимость размера кванта времени процессора от приоритета процесса. Это обеспечит выполнение высокоприоритетных процессов. В современных процессорах используется и динамический приоритет.
АДАПТИВНО-РЕФЛЕКТОРНОЕ ПЛАНИРОВАНИЕ
Выполняется с учетом потребности процесса в памяти. Оценка необходимого объема памяти проводится по затратам памяти при предудущем выделении кванта времени. При очередном выполнении понадобится столько же. При наличии в конкретный момент времени в системе необходимого объема памяти, процессу может быть выделен квант времени процессора, при этом размер выделяемого кванта будет обратно пропорционален необходимому объему памяти. Такое планирование вынуждает оптимизировать программы по объему потреб. памяти.
Алгоритм планирования должен разрешать несколько противоположный устремления, а иногда и ситуаций. Должен обеспечивать высокую скорость реакции, хороший отклик на фоновые задачи, не допускать «голодовки» процессов. Должен согласовывать потребности низко- и высокоприоритетных процессов.
Существует множество правил, которые определяют, когда и каким процессами выделить кванта времени процессора, называемыйПолитикой Планирования. Пол. планир. обязательно учитывает распределение времени между процессами. Базируется на ранжировании процессов по их приоритетам. В большинстве современных ОС приоритет изменяется с учетом того, что именно делит процесс (поток). За счет такого анализа и изменения уровня приоритета, процессам, которое долгое время отказывалось выделение кванта времени, будет выделении квант времени.
Процессы, которые выполняются длительное время, штрафуются путем снижения их приоритета. (но не ниже базового).
С точки зрения требования проц. время проц. делится на два класса:
1) процессы, которые требцют много времени для ввода-вывода
2) процессы, которые требуют много чисто процессорного времени
Обычно процессам из первого кл. присваивается более высокий приоритет.
С точки зрения планирования, процессы разделяют на 3 класса:
- интерактивные
- пакетные
- процессы реального времени.
Интерактивные процессы взаимодействуют с пользователем посредством клавиатуры или мыши. Когда новые данные введены, процесс должен быстро откликнуться. Ср. задержка – 50-150 мс. Для обеспечения быстрой реакции на ввод-вывод данных таким процессам присваивается высокий динамический приоритет.
Пакетные процессы не требуют взаимодействий с пользователем и часто вып. как фоновые. Не требуют высокой реактивности и планировщик назначает им невысокий динамический приоритет (компиляторы, реализация задач научных вычислений).
Процессы реального времени выдвигают наиболее строгие треб. к планированию. Они никогда не должны блокироваться низкоприоритетными процессами и должны обладать мин. реактивностью на ввод-вывод. Им присваивается наивысший динамич. приоритет (драйвера, роботы прогр.)
Для управления приоритетами можно использовать системные вызовы – ф-ии API. У одной из основных подсистем ОС Windows является подсистема управления процессами – CSRTS.
основная задача – управление окнами, создание и уничтожение процессов и потоков, поддержка создания многоязыковых приложений и др.
лекция 8
Создание выполнение и завершение процессов
Создание: Открывается исполняемый .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// (!!!)
);
Данная функции не только настраивает, а также являться функции ожидание, ожилает срабатывает таймера, после этот функции нет смысла ставить «вейтобжект». Внутреннюю функцию вызывает ОС, а не приложение, по этому ее называют функцией обратного вызова, функци ставиться в очередь потока при срабатывание таймера, ее время выполнение должно быть меньше интервала срабатывания таймера. Такая функция ставиться в очередь потока взывающей функции «сетветейбел таймер», но лишь в том случае если этот поток находиться в состоянии ожидания, если поток не в состоянии ожидания, функция не ставиться внутри этого потока и очередь не переполняется. Функция ожидание завершает работу после все обработки элементов очереди.
Рассмотренные объекты синхронизации устанавливают и используют свободное состояние которое учитуються функции ожидания .