Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление процессами в операционной системе.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
166.91 Кб
Скачать

Некоторые функции Win32 api для управления процессами, потоками и волокнами

Функция Win32 API

Описание

CreateProcess

Создать новый процесс

CreateThread

Создать новый поток в существующем процессе

CreateFiber

Создать новое волокно

ExitProcess

Завершить текущий процесс и все его потоки

ExitThread

Завершить этот поток

ExitFiber

Завершить это волокно

SetPriorityClass

Задать класс приоритета для процесса

SetThreadPriority

Задать приоритет для потока

CreateSemaphore

Создать новый семафор

CreateMutex

Создать новый мьютекс

OpenSemaphore

Открыть существующий семафор

OpenMutex

Открыть существующий мьютекс

WaitForSingleObject

Блокироваться на одном семафоре, мьютексе и т. д.

WaitForMultipleObjects

Блокироваться на множестве объектов, чьи дескрипторы перечисляются

PulseEvent

Перевести событие в сигнализирующее состояние, а затем вернуть в несигнализирующее

ReleaseMutex

Освободить мьютекс, чтобы другой поток мог его захватить

ReleaseSemaphore

Увеличить на единицу счетчик семафора

EnterCriticalSection

Захватить блокировку для критической секции

LeaveCriticalSection

Освободить блокировку для критической секции

Реализация процессов и потоков

Процессы и потоки имеют большее значение и являются более сложными, чем задания и волокна. Процесс создается другим процессом при помощи вызова интерфейса Win32 CreateProcess. Этот вызов в режиме пользователя обращается к процедуре в динамической библиотеке kernel32.dll, которая создает процесс в несколько этапов, используя при этом множество системных вызовов и других действий.

  1. Указанный в качестве параметра исполняемый файл изучается и открывается. Если это корректный исполняемый файл формата POSIX, OS/2, 16-разрядной системы Windows или MS-DOS, то для него устанавливается специальное окружение. Если это корректный .ехе файл 32-разрядного интерфейса Win32, в реестре проверяется, не является ли этот файл особенным в каком-либо смысле (например, должен выполняться под контролем отладчика). Все эти действия выполняются в режиме пользователя внутри kernel32.dll.

  2. Выполняется обращение к системному вызову NtCreateProcess, чтобы создать пустой объект процесса и поместить его в пространство менеджера объектов. Создаются объект ядра и объект исполняющей системы. Менеджер процессов создает для объекта управляющий блок процесса и инициализирует его идентификатором процесса, квотами, маркером доступа и различными другими полями. Также создается объект секции, чтобы следить за адресным пространством процесса.

  3. Когда динамическая библиотека kernel32.dll снова получает управление, она обращается к системному вызову, NtCreateThread, чтобы создать начальный поток. Для потока создаются стек режима пользователя и стек режима ядра. Размер стека указан в заголовке исполняемого файла.

  1. Библиотека kernel32.dll посылает подсистеме окружения Win32 сообщение, в котором содержится информация о новом процессе, и передает ей дескрипторы процесса и потока. Данные о процессе и потоке помещаются в таблицы подсистемы, в результате чего у нее оказывается полный список всех процессов и потоков. Подсистема отображает курсор в виде стрелки с песочными часами, чтобы сообщить пользователю, что что-то происходит, но курсор может использоваться. Когда процесс обращается к своему первому вызову графического интерфейса пользователя, чтобы создать окно, курсор удаляется (если обращения к вызову не поступает, курсор удаляется через 2 с).

  2. В этот момент поток готов к работе. Он начинается с запуска процедуры системы поддержки исполнения программ для завершения инициализации.

  3. Процедура системы поддержки исполнения программ устанавливает приоритет потока, сообщает загруженным библиотекам DLL о появлении нового потока, а также выполняет другую рутинную работу. Наконец, она запускает код основной программы потока.

Создание потока также состоит из нескольких этапов. Сначала работающий процесс обращается к функции CreateThread, которая вызывает процедуру внутри kemel32.dll. Эта процедура выделяет в вызывающем процессе память для стека режима пользователя, а затем обращается к системному вызову NtCreateThread, чтобы создать объект потока для исполняющей системы, проинициализировать его, а также создать и проинициализировать блок управления потоком. В этом случае уведомляется подсистема Win32, а информация о потоке помещается в ее таблицы. Затем поток начинает работу с собственной инициализации.

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