Этап 1. Основная проблема – приложения, не являющиеся Win32 нельзя выполнять напрямую. Функция CreateProcess(…) на этапе 1 ищет “образ поддержки” с помощью которой будет выполняться не Win32 приложение, то есть CreateProcess(…) определяет тип процесса, ищет вспомогательную программу и проецирует её на адресное пространство нового процесса. Например, если процесс относится к POSIX, то используется posix.exe, OS/2 – os2.exe, MS-DOS (*.exe, *.com, .pif) – Ntvdm.exe, MS-DOS (.bat) – cmd.exe.
Этап 2. Создание объекта процесс. Создаётся
1) PDB или (EPROCESS).
2) Адресное пространство процесса.
3) Создаётся блок процесса ядро.
4) Инициализируется адресное пространство процесса.
5) Создаётся блок окружения процесса.
Блок PEB – в области пользовательских программ.
Этап 3. Создаётся объект поток, стек потока и его контекст.
Объект поток – это структура в системной области – TDB – содержит информацию.
Стек потока мы проходили. Выделяется регион памяти.
Контекст – это структура CONTEXT – зависит от аппаратуры, зависит от типа процессора. В этой структуре хранятся значения всех регистров процессора.
Этап 4. Уведомление подсистемы Win32. На этом этапе kernel32.dll посылает исполнительной системе Win32 сообщение для того, чтобы подсистема Win32 подготовилась к выполнению нового процесса. Это сообщение содержит идентификаторы процесса и потока и идентификаторы родительского процесса и флаг, является ли процесс Win32 приложением. Подсистема Win32 создаёт блок процесса.
Этапы 5 и 6 очевидны.
Потоки отвечают за исполнение программного кода. При создании процесса всегда создаётся первичный поток. По желанию программиста создаются дополнительные потоки.
CreateThread(…). Для чего создаются потоки?
Выделив различные задачи, выполняемые процессом в отдельном потоке позволяет избежать цикла опросов.
Поток может находится в одном из состояний.
1. Поток фактически работает, при этом в регистре процессора переписывается содержимое структуры CONTEXT. Все остальные потоки процесса приостанавливаются в случае одного процессора в системе.
2. Поток готов к выполнению. Отсутствуют все причины, препятствующие работе потока, за исключением того, что процессор занят выполнением другого потока.
3. Заблокированное состояние. Поток ожидает некоторого события, например, ожидание завершения работы другого потока или какого-либо процесса. До наступление этого события планировщик не позволит этому процессу выполнится.
Объектами синхронизации являются потоки процессы, критические секции, семафоры, события, мьютексы.
Потоки владеют набором регистров.
Все потоки процесса имеют общий доступ к тому, чем этот процесс владеет, поэтому имеет доступ к адресному пространству процесса (различным регионам адресного пространства). Все потоки процесса совместно используют одни и те же значения дескрипторов, следовательно они могут обращаться к файлам, событиям, файлам проецируемым в память и так далее, которые принадлежат процессу.
Каждый поток обладает собственным стеком, собственной очередью оконных сообщений, собственным набором значений локальной памяти потока и собственной цепочкой обработки структу-рированных исключений.
Поток может завладеть или освободить различные синхронизирующие объекты, принад-лежащие процессу. Дескриптор потока – это индекс в таблице дескрипторов процесса. Иденти-фикатор потока – это закодированный указатель на базу данных потока (PDB).