Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_OS_chast_2.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.55 Mб
Скачать

Выполнение потоков.

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

В результате выполнения функции CreateThread создается объект ядра «поток». Одновременно, инициализируются основные параметры этого объекта ядра, а именно – счетчику числа пользователей присваивается 2, счетчику числа простоев – 1, коду завершения – 0x103, а состояние объекта устанавливается в «занято». Стеку потока из ВАП процесса выделяется память, и в старшие адреса записываются значения параметров P3, P4 функции создания. У любого вновь создаваемого потока имеется собственный набор используемых регистров процессора, называемый контекстом потока. Контекст отражает состояние регистров процессора на момент последнего выполнения потока. Контекст сохраняется в системной структуре данных CONTEXT, которая содержится в объекте ядра «поток». В контекст входят значения регистров указателя команд EIP и состояние указателя стека ESP. В ходе выполнения команд программы потока, в них формируются адреса памяти из области ВАП всего процесса. В момент инициализации объекта ядра «поток» указателю стека ESP присваивается адрес, по которому в стек заносится значение параметра P3, а указателю команд EIP присваивается адрес системной функции BaseThreadStart ().

Состояния этих регистров заносится в CONTEXT. После инициализации потока, система проверяет значение флага создания потока из параметра P5. Если это значение равно нулю, выполнение потока может быть начато немедленно. В этом случае, счетчик числа простоев обнуляется, в регистры процессора загружаются значения, которые хранились в структуре CONTEXT потока. После этого, поток переходит в состояние готовности к выполнению, то есть ему может быть предоставлено процессорное время, а точнее – очередной квант процессорного времени. Когда это происходит, то начинается выполнение программы потока. Так как EIP указывает на BaseThreadStart (), то выполнение потока начинается не с первой команды его программы, а именно с этой функции. Эта функция получает доступ к двум параметрам P3, P4, записанным в стеке потока, и в ходе своего выполнения реализует следующие действия:

  1. Основная функция потока включается в область структурной обработки исключений, в результате чего любое исключение, если оно возникнет в ходе выполнения программы потока, будет обрабатываться системой по умолчанию;

  2. Вызывается прикладная функция потока, и ей, в качестве параметра, передается значение P4;

  3. Начинается выполнение программного кода основной функции потока.

По окончании выполнения этой функции, она снова возвращает управление в системную функцию BaseThreadStart (). Эта функция, в свою очередь, вызывает функцию завершения потока ExitThread(). В нее передается значение кода возврата, возвращаемое прикладной функцией потока. Одновременно, значение счетчика числа пользователей объекта ядра «поток» уменьшается на единицу, и выполнение потока прекращается.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]