Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Основные функции для работы с потоками



1) CreateThread(…). Создаёт новый поток в текущем процессе.

2) CreateRemoteThread(…). Создаёт новый поток в другом процессе.

3) ExitThread(…). Нормальное завершение потока.

4) TerminateThread(…). Аварийное завершение потока, завершение потока из другого потока.

5) GetExitCodeThread(…). Получение кода завершения любого потока.

6) GetThreadTimes(…). Возвращает временные характеристики другого потока, то есть время работы другого потока в пользовательском режиме и режиме ядра. В Windows 95 и Windows 98 не используются.

7) GetThreadContext(…). Возвращает регистры процессора для данного потока.

SetThreadContext(…). Изменяет регистры процессора для данного потока.

8) GetCurrentThread(…). Получить дескриптор текущего потока.

SetCurrentThreadId(…). Получить идентификатор текущего потока.

Структура ОЯ «поток».

1) TDB (ETHREAD). Начинается со стандартного заголовка, который содержит идентификатор объекта (от 0 до 27) и счётчик числа обращений к данному объекту. Далее следует указатель на структуру KTHREAD – блок потока ядра, указатель на PDB (EPROCESS), откуда поток может извлекать, структура CONTEXT – содержит описание регистров, время создания и завершения потока, стартовый адрес потока, и так далее.

2) KTHREAD. Содержит информацию необходимую ядру Windows для планирования и синхронизации одних потоков с другими.

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

· суммарное время работы в режиме ядра,

· базовый и текущий приоритеты потока,

· значение кванта (для Windows 2000),

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

· список объектов, ожидаемых данным потоком, например, поток ждёт завершения какого-либо другого потока.

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

3) TEB. В нём содержится информация о стеке потока, базовый адрес.

/////////////////////////    
заполненная часть стека

старший адрес

текущий адрес стека

базовый адрес стека младший адрес

В блоке TEB содержится локальная память потока TLS, значение кода последней ошибки, то есть LastError. Даные необходимые для работы модулей user32.dll и GDI32. В том случае, если поток работает в сети в TEB содержится указатель на данные WinSock.

4) W32THREAD. Дублирует данные, необходимые для работы user32 и gdi32.

Алгоритм работы функции CreateThread(…) (kernel32.dll).

1. Создаёт стек пользовательского режима в адресном пространстве процесса.

2. Инициализирует аппаратный процесс потока, то есть структуру CONTEXT.

3. Вызывает функцию ядра NtCreateThread(…), которая создаёт все упр. структуры, которые находятся в сист-ой части адр. пр-ва.

4. Создаёт блок TEB.

5. Уведомляется подсистема Win32, которая создаёт блок W32THREAD.

6. Возвращает дескриптор и идентификатор вызывающей программе вновь созданного потока.

7. Вновь созданный поток ставится в очередь на выполнение.

16. Распределение времени между потоками. Классы приоритета. Уровни приоритета. Относительный уровень приоритета потока. Функции для работы с приоритетами потоков.

1) Планирование потоков. 2)Синхронизация потоков.

В Windows реализована подсистема вытесняющего планирования на основе уровней приоритета. Всегда выполняется поток с наивысшим приоритетом к выполнению. Выбор потока для выполнения может быть ограничен набором процессоров. Это называется привязкой к процессору (processor affinity).

Выбранный для выполнения поток работает в течение некоторого периода называемого квантом. После того, как истёк квант времени ОС будет искать другой поток с таким же уровнем приоритета или выше. Если таких нет, то ищет с меньшим приоритетом. В Windows 2000 потокам могут выделяться разные кванты времени. Поток также может не полностью использовать свой квант.

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

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

Диспетчер ядра инициализируется следующими событиями.

1) Поток готов к выполнению, например, он только что создан или вышел из состояния ожидания.

2) Поток прекращает выполнение, когда его квант истёк или поток завершается, или поток переходит в состояние ожидания.

3) Приоритет потока изменяется, например, в результате вызова системного сервиса.

4) Изменяется привязка к процессорам выполняемого потока.

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

Выбрав новый поток Windows включает CONTEXT, текущее содержание регистров процессора переписывается в структуру CONTEXT, которая находится в TDB (ETHREAD).

Планирование в Windows осуществляется на уровне потоков, то есть не важно какому процессу принадлежит поток.

Пример. Если у процесса А – 12 потоков, а у В – 2 потока, и все 14 потоков имеют один и тот же приоритет, то каждый поток получит 1/14 времени процессора. Windows не будет делить поровну время процессора между двумя процессами.





Дата публикования: 2014-11-03; Прочитано: 455 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...