Управление потоками в Windows ХР 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Управление потоками в Windows ХР



Для того чтобы выполнять код, в рамках процесса обязательно необходимо создать поток. В системе Windows ХР реализованна модель потоков «в чистом виде». Процессы и потоки являются разными сущностями в системе, которые находятся в четко определенной взаимосвязи один из одним; для работы с ними используют разные системные вызовы. В Windows ХР никогда не использовали модель процессов, подобный традиционной модели UNIX.

Многопотоковость Windows ХР базируется на схеме 1:1. Каждому потока пользователя отвечает сущность в ядре, при этом ядро отвечает за планирование потоков. Процессы не планируются.

Составные элементы потока

Поток в Windows ХР состоит из таких элементов:

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

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

локальной памяти потока (TLS);

уникального идентификатора потока (thread id, tid), который выбирают из того самого пространства имен, что и идентификаторы процессов.

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

Различают два вида потоков: потоки пользователя и потоки ядра, которые в Windows ХР называют системными рабочими потоками – system worker threads. Первые из них создают в режиме пользователя и только за необходимости перемикають в режим ядра. Другие создают в ядре во время его инициализации и выполняют в режиме ядра на протяжении всего времени их существования.

Структуры данных потока

Отображение потоков в системе, как и отображение процессов, основанное на объектной модели Windows ХР.

Для исполнительной системы Windows ХР каждый поток отображается объектом-потоком исполнительной системы, который также называют управляющим блоком потока (executive thread block, ETHREAD).

Для ядра системы поток отображается объектом-потоком ядра, который также называют блоком потока ядра (thread kernel block, KTHREAD).

В режиме пользователя доступным есть блок окружения потока (thread environment block, ТЕВ), который находится в адресном пространстве процесса, который создал поток.

Нетрудно заметить, что каждой структуре данных потока отвечает структура данных процесса (блоки EPROCESS, KPROCESS и РЕВ).

Управляющий блок потока содержит базовую информацию о потоке, в частности:

♦ блок потока ядра;

♦ идентификатор процесса, к которому принадлежит поток, и указатель на управляющий блок этого процесса (EPROCESS);

♦ стартовый адрес потока, из которой начнется выполнение его кода;

♦ информацию для подсистемы безопасности.

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

♦ указатель на стек ядра;

♦ информацию для планировщика;

♦ информацию, необходимую для синхронизации этого потока;
♦ указатель на блок окружения потока.

Блок окружение потока содержит информацию о потоке, доступной для применений режима пользователя. К ней принадлежат:

♦ идентификатор потока;

♦ указатель на стек режима пользователя;

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

♦ указатель на локальную память потока.

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

Основным средством создания потоков в Windows ХР есть функция CreateThread() Win32 АРI. Назовем этапы выполнения этой функции.

1. В адресном пространстве процесса создают стек режима пользователя для потока.

2. Инициализируется аппаратный контекст потока (в процессор загружают данные, которые определяют его состояние). Этот шаг зависит от архитектуры процессора.

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

а) создают и инициализируют структуры данных потока (блоки ETHREAD, KTHREAD, ТЕВ);

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

в) задают информацию для подсистемы безопасности и идентификатор потока;

г) выделяют место под стек потока ядра.

4. Подсистеме Win32 сообщают о создании нового потока.

5. Дескриптор и идентификатор потока возвращают в процесс, который инициировал создание потока (вызвал CreateThread().

6. Начинают выполнения потока (выполняют переход по стартовому адресу).

Выводы

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

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

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

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

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

Современные ОС поддерживают концепцию многопотоковости.

♦ Использование потоков в применении означает внесение у него параллелизма - возможности одновременного выполнения действий разными фрагментами кода. Параллелизм в программах отображает асинхронный характер окружающего мира, его источниками являются выполнения кода на нескольких процессорах, операции ввода-вывода, взаимодействие с пользователем, запросы приложений-клиентов. Много-поточность в приложениях дает возможность естественно реализовать этот параллелизм и добиться высокой эффективности. С другой стороны, использование многопотоковости довольно сложное и требует высокой квалификации разработчика.

♦ Различают потоки пользователя, которые выполняются в режиме пользователя в адресном пространстве процесса, и потоки ядра, с которыми работает ядро ОС. Взаимоотношения между ними определяют схему реализации модели потоков. На практике чаще всего используют схему 1:1, когда каждому потока пользователя отвечает один поток ядра, и самое ядро отвечает за управление потоками пользователя.

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

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

Контрольные вопросы и задачи

Все практические задачи требуют разработки консольных применений, которые получают исходные даны со стандартного устройства ввода и подают результат на стандартное устройство вывода с использованием средств библиотеки соответствующего языка программирования. Для языка С такие средства описанные в заглавном файле stdio.h, для языка С++ - в файле iostream.

1.В чем основное преимущество схемы поддержки потоков 1:1 сравнительно с другими схемами? Почему разработчики ОС не сразу смогли ее оценить?

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

3.Для трех состояний потоков - выполнение, готовности и ожидание - пересчитайте все возможные переходы из состояния в состояние и назовите причины таких переходов. Скажите также, какие переходы невозможные, и объясните почему. В котором состоянии потоки находятся наидольше?

4.В чем заключается главный недостаток реализации таблицы процессов в виде массива? Какие альтернативные варианты ее реализации можно предложить?

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

а) в чем причина появления такого процесса и насколько серьезная эта проблема с точки зрения затрат памяти?

б) как выправить код сервера. чтобы процессы-зомби не возникали?

6. Напишите функцию, вызов которой приведет к уничтожению всех процесс-зомби, созданных текущим процессом.

7. Разработайте простой командный интерпретатор для Linux и Windows ХР. Он должен выдавать подсказку (например, «>»), обрабатывать введенный пользователем командную строку (что содержит имя выполняемого файла программы и ее аргументы) и запускать заданную программу. Асинхронный запуск осуществляют введением «&» как последнего символа командной строки. В случае завершения командной строки любым другим символом программа запускается синхронно. Интерпретатор завершает работу после введения строки «ехії». Выполнение программ, запущенных интерпретатором, может быть прерванное нажатиям клавиш СtгІ+С, однако оно не должно перерывать выполнение интерпретатора. Для запуска программного кода в Linux рекомендовано использовать функцию execvp(), что принимает два параметра prog и args, аналогичные к первый двух параметров функции execvp(), и использует сменну окружениz РАТН для поиска пути к выполняемым файлам.

8. Разработайте применение для Linux и Windows ХР, что реализует параллельное выполнение кода двумя потоками. Основной поток применения Т создает поток t. Дальше каждый из потоков выполняет цикл (например, до 30). На каждой итерации цикла он увеличивает значение локального счетчика на единицу, отображает это значение с красной строки и приостанавливается на некоторое время (поток Т- на время wт, поток t – wt. После завершения цикла поток Т присоединяет t. Как зависят результаты выполнения этого применения от значений wт и wt? Как изменятся эти результаты, если поток t не будет присоединен?

 

 



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 379; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.108.236 (0.01 с.)