
- •Глава 3
- •Раздел 3 Управление процессами и потоками
- •3.1. Базовые понятия процессов и потоков
- •3.1.2. Модели процессов и потоков
- •3.1.3. Составные элементы процессов и потоков
- •3.2. Многопотоковость и ее реализация
- •3.2.1. Понятие параллелизма
- •3.2.2. Виды параллелизма
- •3.2.3. Преимущества и недостатки многопотоковости
- •3.2.4. Способы реализации модели потоков
- •3.2.5 Состояния процессов и потоков
- •3.3 Описание процессов и потоков
- •3.3.1. Управляющие блоки процессов и потоков
- •3.3.2. Образы процесса и потока
- •3.4. Переключение контекста и обработка прерываний
- •3.4.1. Организация переключения контекста
- •3.4.2. Обработка прерываний
- •3.5 Создание и завершение процессов и потоков
- •3.5.1 Создание процессов
- •3.5.2. Иерархия процессов
- •3.5.3. Управление адресным пространством во время создания процессов
- •3.5.4. Особенности завершения процессов
- •3.5.5. Синхронное и асинхронное выполнение процессов
- •3.5.6. Создание и завершение потоков
- •3.6 Управление потоками в Linux
- •3.6.1. Базовая поддержка многотопотоковости
- •3.6.2. Особенности новой реализации много поточности в ядре Linux
- •3.6.3. Потоки ядра Linux
- •3.7 Управление процессами в Windows хр
- •3.7.1. Составные элементы процесса
- •3.7.2. Структуры данных процесса
- •3.7.3. Создание процессов
- •3.7.4. Завершение процессов
- •3.7.5. Процессы и ресурсы. Таблица объектов процесса
- •3.8 Управление потоками в Windows хр
- •3.8.1. Составные элементы потока
- •3.8.2. Структуры данных потока
- •3.8.3. Создание потоков
3.7.2. Структуры данных процесса
Рассмотрим структуры данных, связанные с процессом в Windows ХР. Укажем, что в работе с этими структурами система использует объектную модель. Для исполнительной системы Windows ХР каждый процесс изображает объектом-процессом исполнительной системы (executive process object); его также называют управляющим блоком процеса (ехесutive process block, EPROCESS). Для ядра системы процесс изображают объектом-процессом ядра (kernel process object), который называют блоком процеса ядра (process kernel block, KPROCESS).
В режиме пользователя доступным является блок окружения процеса (process environment block, PEB), который находится в адресном пространстве этого процесса.
Рассмотрим структуры данных процесса подробнее. Укажем, что EPROCESS и KPROCESS, в отличие от РЕВ, доступные только из привилегированного режима.
Управляющий блок процесса содержит такие основные элементы:
-
блок процесса ядра (КРROCESS);
-
идентификационную информацию;
-
информацию об адресном пространстве процесса;
-
информацию о ресурсах, доступных процессу, и ограничение на использование этих ресурсов;
-
блок окружения процесса (РЕВ);
-
информацию для подсистемы безопасности.
К идентификационной информации принадлежат:
-
идентификатор процесса (ріd);
-
идентификатор процесса, который создал этот процесс (несмотря на то, что Windows ХР не поддерживает отношения «предок-потомок» автоматически, они могут быть заданы программным путем, т.е. потомок может сам назначить себе предка, задав этот идентификатор);
-
имя загруженного программного файла.
Блок процесса ядра содержит всю информацию, которая принадлежит к потокам этого процесса:
-
указатель на цепочку блоков потоков ядра, где каждый блок отвечает потоку;
♦ базовую информацию, необходимую ядру системы для планирования потоков.
Блок окружение процесса содержит информацию о процессе, которая предназначена для доступа из режима пользователя:
-
начальный адрес участка памяти, куда загрузился программный файл;
-
указатель на динамический участок памяти, доступный процессу.
Эту информацию может использовать загрузчик программ или процесс подсистемы Win32.
3.7.3. Создание процессов
В Win32 АРI принята модель запуска приложения с помощью одного вызова, который создает адресное пространство процесса и загружает у него выполняемый файл.
Отдельно функциональность exec() и fork() в этом АРI не реализована.
Такой вызов реализует функция CreateProcess(). Она не является системным вызовом ОС - это библиотечная функция Win32 АРI, реализованная во всех Win32-совместных системах.
Укажем, что системные вызовы UNIX/POSIX нуждаются в меньшем количестве параметров (как уже отмечалось, folk() не использует ни одного параметра, а exec() - использует три параметра).
Приведем основные шаги создания нового процесса с использованием функции CreateProcess().
1. Открывают выполняемый файл, где его имя задано как параметр. При этом ОС определяет, к какой подсистеме среды он принадлежит. Если это выполняемый файл Win32, то его используют прямо , для других подсистем отыскивают необходимый файл поддержки (например, процесс подсистемы POSIX для POSIX-систем).
2. Создают объект-процесс в исполнительной системе Windows ХР. При этом выполняют такие действия:
а) создают и инициализируют структуры данных процесса (блоки EPROCESS, KPROCESS, РЕВ);
б) создают начальное адресное пространство процесса;
в) блок процесса помещают в конец списка активных процессов, которые поддерживает система.
-
Создают начальный поток процесса.
-
После создания начального потока подсистеме Win32 сообщают о новом процессе и его начальном потоке. Это сообщение содержит их дескрипторы (handles) - уникальные числовые значения, которые идентифицируют процесс и поток для средств режима пользователя. Подсистема Win32 выполняет ряд действий после получения этого сообщения (например, задает приоритет по умолчанию) и помещает дескрипторы в свои собственные таблицы процессов и потоков.
-
После посылки сообщения начинают выполнение начального потока (если он не был задан с флажком отложенного выполнения).
-
Завершают инициализацию адресного пространства процесса (например, загружают необходимые динамические библиотеки), после чего начинают выполнения загруженного программного кода.