Стандартный объект заголовка





 

Атрибуты потока

 

Идентификатор клиента

Контекст

Динамический приоритет

Базовый приоритет

Привязанность к архитектуре

процессора

Время выполнения

Статус оповещения

Счетчик прерываний

Маркер передачи прав доступа

Порт завершения

Код завершения


 

Методы потока

 

Создание потока

Открытие потока

Запрос информации о потоке

Установка информации о потоке

Текущий поток

Завершение потока

Получение контекста

Установление контекста

Прерывание

Возобновление

Предупреждение

Проверка поступления преду-

преждения

Регистрация порта завершения


 

Рис.2.5. Схема объекта потока.

 

Для большинства методов потока имеются соответствующие API - функции Win32.

Windows защищает свои внутренние структуры от прямого вмешательства пользова-

тельских программ. В отличии от более привилегированных программ, функционирую-

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

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

посредством функций Win32 API. Windows предоставляет дескриптор, идентифици-

рующий объект. При выполнении операций с объектом его дескриптор передается в ка-

честве аргумента одной из API-функций. Свои дескрипторы имеют потоки, процессы,

семафоры, файлы и др. объекты. Внутренняя структура объектов доступна только ме-

неджеру объектов. Функция, создающая поток, возвращает дескриптор нового объекта.

С помощью этого дескриптора можно выполнить следующие операции:

• повысить или понизить плановый приоритет потока;

• приостановить поток и возобновить его выполнение;

• прекратить выполнение потока;

• определить код завершения потока.

В ОС Windows потоки, процессы, семафоры и исключающие семафоры могут

иметь несколько разных дескрипторов. Завершив работу с объектом, необходимо вы-

звать функцию CloseHandle, которая закрыв последний дескриптор, сама уничтожит

объект. В целом в Windows каждый процесс не может одновременно поддерживать бо-

лее 65536 открытых дескрипторов.

Работа с потоками не сводится только к их запуску и остановке. Необходимо обес-

печить совместное функционирование потоков. Для организации эффективного взаимо-

действия между несколькими потоками необходимо производить контроль за их вре-

менными параметрами. Контроль осуществляется [12]:

 

 



 

• установлением приоритетов;

• синхронизацией.

Приоритет потока определяет, насколько часто данный поток получает доступ к

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

общим ресурсам. Когда системная программа-планировщик останавливает один поток и

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

токам, имеющим наиболее высокий приоритет. Обработчики системных прерываний

всегда имеют более высокий приоритет по сравнению с пользовательскими процессами.

Каждому процессу присущ собственный приоритет. Базовый плановый приоритет пото-

ка определяется на основе приоритета процесса, который является владельцем этого по-

тока. Всего различают 32 уровня приоритета от 0 до 31. При этом приоритеты уровня от

0 до 15 называются переменными приоритетами, а от 16 до 31 – фиксированными при-

оритетами. Схема наследования приоритетов потока показана на рис.2.6 [12].

 


 

 

Уровни

Приоритета


Класс реального

Времени

 

 

Наивысший

Класс

 

 

Класс переднего

плана

Фоновый класс

 

Класс простоя

 

Базовый

Приоритет

Процесса


 

 

Диапазон базового

Приоритета потока,

Владельцем которо-

Го является процесс

С приоритетом пе-

реднего плана


 

Диапазон дина-

Мического при-

Оритета для то-

Го же самого

Потока


 

Рис.2.6 Схема наследования приоритета потоков от исходного приоритета процесса

 

 


   
 
 
 
 
 


 

 


Среди атрибутов объекта потока различают базовый и динамический приоритеты.

При вызове команды для изменения приоритета потока меняется его базовый приоритет,

который не может быть выше или ниже приоритета процесса-владельца более чем на 2

уровня. Операционная система способствует «продвижению» потока для его выполне-

ния. Для этого система поддерживает динамический приоритет потоков, которые вы-

полняют важные задачи. Например, если процесс выводит информацию в окно, либо

считывает данные с диска временно повышается приоритет всех потоков такого процес-

са. Эти временные приращения в сумме с базовым приоритетом образуют динамический

приоритет процесса. Планировщик определяет очередность выполнения потоков на ос-

новании их динамического приоритета. Со следующим тактом процесса приращение

приоритета начинает уменьшаться на один уровень, постепенно достигая уровня базово-

го приоритета.

Выбирая поток, который будет выполняться следующим, программа-планировщик

начинает просмотр очереди заданий с потоков, имеющий наивысший приоритет, выпол-

няет их, а затем переходит к остальным потокам. Однако иногда в очереди заданий со-

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

приостановлены или заблокированы. В каждый момент времени поток может находить-

ся в одном из шести состояний.

Ready (готов) - поставлен в очередь и ожидает выполнения.

Standby (ближайший) - готов быть выполненным следующим.

Running (выполнение) - находится в режиме выполнения и взаимодействует с централь-

ным процессором.

Waiting (ожидание) не выполняется, ожидая сигнала выполнения.

Transition (промежуточное) будет выполняться после того, как система загрузит его

контекст.

Terminated (завершен) - выполнение завершено, однако объект не удален.

Когда программа-планировщик выбирает из очереди готовый к выполнению поток,

она загружает его контекст. В состав контекста входит набор значений регистров про-

цессора, стек ядра, блок параметров окружения потока и пользовательский стек в адрес-

ном пространстве процесса, который является владельцем данного потока. Если часть

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

пока система соберет все составные части контекста.

Чтобы потоки могли надежно работать, их необходимо синхронизировать. Пред-

ставьте себе, что один поток создает кисть, а затем создает несколько потоков, которые

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

должен уничтожать кисть до тех пор, пока другие потоки не завершат операции рисова-

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

и записывает их в файл, а другие потоки считывают данные из этого файла и образовы-

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

пись. В обоих случаях надо принять меры по координации последовательности опера-

ций в нескольких потоков.

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

Boolean, которую один из потоков будет использовать с целью информирования других

потоков о том, что объект занят. Например, поток, записывающий данные в файл, может

присвоить переменной bDone значение TRUE, а потоки, считывающие данные из файла,

будут циклически просматривать эту переменную до тех пор, пока ее значение не изме-

нится. Такая схема вполне работоспособна, однако циклический просмотр флага не-

сколькими потоками занимает много времени процессора. Вот почему в Win32 поддер-

живается набор синхронизирующих объектов [9, 12]. Перечислим их.

Объект типа исключающийсемафор функционирует подобно узкой двери, "про-

пуская" (т.е. давая допуск) одновременно по одному потоку.

 

 


 

Объект типа семафор функционирует подобно многостворчатой двери, ограничи-

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

Объект типа события передает глобальный сигнал, воспринимаемый любым пото-

ком, для которого он адресован.

Объект типа критическийраздел аналогичен исключающему семафору, но рабо-

тает только в пределах одного процесса.

Все указные объекты являются системными и создаются менеджером объектов.

Хотя каждый синхронизирующий объект координирует определенный вид взаимодейст-

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

ределенную синхронизируемую операцию, ожидает ответ от одного из этих объектов и

осуществляет свои функции только после получения на то разрешения. Программа-

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

нимали времени центрального процессора. После получения соответствующего сигнала

планировщик возобновляет работу потока. Место и способ получения сигнала зависит

от конкретного объекта.

Исключающие семафоры, обычные семафоры и события позволяют координиро-

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

разделы воспринимаются лишь потоками одного процесса. Если один процесс создает

другой процесс, дочерний процесс часто наследует дескрипторы имеющихся синхрони-

зирующих объектов. Объекты критических разделов не могу быть унаследованы.

С фундаментальной точке зрения, синхронизирующий объект, подобно другим

системным объектам, представляет собой структуру данных. Синхронизирующие объ-

екты могут находиться в двух состояниях: при наличии сигнала и при отсутствии тако-

вого. Потоки взаимодействуют с синхронизирующими объектами путем установки сиг-

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

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

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

включает сигнал и освобождает объект.

Потоки могут ожидать разрешения не только от исключающих и обычных семафо-

ров, событий и критических разделов, но и от других объектов. Иногда возникает ситуа-

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

файлового объекта. Все эти объекты имеют свое предназначение, но подобно синхрони-

зирующим объектом они способны давать сигналы разрешения. Процессы и потоки сиг-

нализируют о своем завершении, объекты-таймеры - об истечении определенного ин-

тервала времени, а файловые объекты - о завершении операций чтения или записей

файлов. Потоки могут ожидать появления любого из этих сигналов.

 

2.2.2. API-функции для реализации механизма многозадачности

 

В Win32 API определены следующие функции работы с процессами и потоками [4]

(таблица 2.1.)

Таблица 2.1


Название функции

AttachThreadInput

 

CommandLineToArgvW

CreateProcess

CreateRemoteThread

 

CreateThread


Выполняемое действие

Переключение механизмов ввода с одной нити на дру-

гую

Производит разбор командной строки в Unicode

Создает процесс

Создает поток в адресном пространстве другого про-

цесса

Создает поток

 

 



 

 


 


 

 

Продолжение табл. 2.1


ExitProcess

ExitThread

FreeEnvironmentStrings

GetCommandLine

GetCurrentProcess

GetCurrentProcessId

GetCurrentThread

GetCurrentThreadId

GetEnvironmentStrings

GetEnvironmentVariable

GetExitCodeProcess

GetExitCodeThread

GetPriorityClass

GetProcessAffinityMask

 

GetProcessShutdownParame-

ters

GetProcessTimes

GetCurrentProcess

 

GetProcessWorkingSetSize

 

GetStartupInfo

 

GetThreadPriority

GetThreadTimes

 

OpenProcess

ResumeThread

 

SetEnvironmentVariable

SetPriorityClass


Завершает процесс и все его потоки

Завершает поток

Освобождает память области переменных среды

Возвращает указатель на командную строку

Возвращает описатель (handle) текущего процесса

Возвращает идентификатор текущего процесса

Возвращает описатель (handle) текущего потока

Возвращает идентификатор текущего потока

Возвращает строку переменных среды

Возвращает значение указанной переменной среды

Возвращает код завершения процесса

Возвращает код завершения потока

Возвращает класс приоритета процесса

Сообщает, на каких процессорах разрешено исполне-

ние процесса

Сообщает параметры поведения процесса при завер-

шении работы системы

Возвращает временные характеристики процесса

Сообщает версию Windows, для которой предназна-

чен процесс

Возвращает характеристики доступного процессу ад-

ресного пространства

Возвращает параметры процесса, полученные им при

создании

Сообщает приоритет указанного потока

Возвращает временные характеристики указанного

потока

Возвращает описатель (handle) указанного процесса

Уменьшает счетчик задержаний потока (или запуска-

ет его)

Устанавливает значение указанной переменной среды

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


SetProcessShutdownParameters Устанавливает параметры поведения процесса при

завершении работы системы


SetThreadAffinityMask

 

SetThreadPriority

Sleep

 

SleepEx

 

SetProcessWorkingSetSize

 

SuspendThread

TerminateProcess

TerminateThread

TlsAlloc


Устанавливает, на каких процессорах разрешено ис-

полнение потока

Устанавливает приоритет указанного потока

Задерживает исполнение потока на указанное коли-

чество миллисекунд

Задерживает исполнение до наступления события

ввода/вывода или на время

Устанавливает характеристики доступного процессу

адресного пространства

Приостанавливает исполнение указанного потока

Завершает указанный процесс

Завершает указанный поток

Распределяет индекс локальной памяти потока

(thread local storage TLS)

 

 



 

TlsFree


 


 

 

Освобождает индекс TLS


 


 

 

Окончание табл. 2.1


TlsGetValue

TlsSetValue


Возвращает данные, размещенные в TLS с указанным индексом

Помещает данные в TLS с указанным индексом


WaitForInputIdle Ждет, пока не начнется ввод для указанного процесса


WinExec


Выполняет указанное приложение


Подробное описание функций приведено в Win32 Programmer’s Reference. Далее

рассмотрим только некоторые основные функции [4].

Функция CreateProcess() - создает новый процесс и его первичный поток. Новый

процесс исполняет указанный исполняемый файл. Формат функции:

 

BOOL CreateProcess(LPCTSTR lpApplicationName, // имя исполняемого файла

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

LPSECURITY_ATTRIBUTES lpProcessAttributes, // атрибуты защиты процесса

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

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

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

LPVOID lpEnvironment, // указатель блока переменных среды

LPCTSTR lpCurrentDirectory, // текущий каталог

LPSTARTUPINFO lpStartupInfo, // блок начальных параметров

LPPROCESS_INFORMATION lpProcessInformation // указатель

// структуры, описывающей порожденный процесс

);

 

Функция возвращает TRUE в случае успеха и FALSE - в случае неудачи.

Параметры:

lpApplicationName - указатель на строку, содержащую имя исполняемой программы.

Имя может быть полное. Если оно не полное, то поиск файла производится в теку-

щем каталоге. Параметру может быть присвоено значение NULL. В этом случае в

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

lpCommandLine;

lpCommandLine - указатель командной строки. Если параметр lpApplicationName имеет

значение NULL, то имя исполняемого файла выделяется из lpCommandLine, а по-

иск исполняемого файла производится в соответствии с правилами, действующими

в системе;

lpProcessAttributes - указатель на структуру, описывающую параметры защиты процесса.

Если параметру присвоено значение NULL, то устанавливаются атрибуты “по

умолчанию”;

lpThreadAttributes- указатель на структуру, описывающую параметры защиты первично-

го потока. Если параметру присвоено значение NULL, то устанавливаются атрибу-

ты “по умолчанию”;

bInheritHandles - определяет, будет ли порожденный процесс наследовать описатели

(handles) объектов родительского процесса. Например, если родительский процесс

AB, то он получил описатель процесса B и может им манипулировать. Если теперь

он порождает процесс C с параметром bInheritHandles равным TRUE, то и процесс

C сможет работать с описателем процесса B;

dwCreationFlags - определяет некоторые дополнительные условия создания процесса и

его класс приоритета;

lpEnvironment- указатель на блок переменных среды порожденного процесса. Если этот

параметр равен NULL, то порожденный процесс наследует среду родителя. Иначе

 



 

 

он должен указывать на завершающийся нулем блок строк, каждая из которых за-

вершается нулем (аналогично DOS);

lpCurrentDirectory - указатель на строку, содержащую полное имя текущего каталога по-

рожденного процесса. Если этот параметр равен NULL, то порожденный процесс

наследует каталог родителя;<



Поделиться:




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

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


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