Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Выполнение потоковПоследовательность действий системы в момент создания и инициализации потока, предшествующий началу выполнения, можно пояснить следующей иллюстрацией:
В результате выполнения функции 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 () обращается к стартовой функции библиотеки системы программирования, которая выполняет необходимую инициализацию, а затем уже обращается к основной функции первичного потока.
Дата добавления: 2014-10-10; просмотров: 366; Нарушение авторских прав Мы поможем в написании ваших работ! |