
- •Основные понятия, используемые для управления центральным процессором и ресурсами
- •Межпроцессное взаимодействие
- •Некоторые функции Win32 api для управления процессами, потоками и волокнами
- •Реализация процессов и потоков
- •Планирование
- •Преобразование приоритетов Win32 в приоритеты Windows 2000
- •Задание:
Некоторые функции 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, которая создает процесс в несколько этапов, используя при этом множество системных вызовов и других действий.
Указанный в качестве параметра исполняемый файл изучается и открывается. Если это корректный исполняемый файл формата POSIX, OS/2, 16-разрядной системы Windows или MS-DOS, то для него устанавливается специальное окружение. Если это корректный .ехе файл 32-разрядного интерфейса Win32, в реестре проверяется, не является ли этот файл особенным в каком-либо смысле (например, должен выполняться под контролем отладчика). Все эти действия выполняются в режиме пользователя внутри kernel32.dll.
Выполняется обращение к системному вызову NtCreateProcess, чтобы создать пустой объект процесса и поместить его в пространство менеджера объектов. Создаются объект ядра и объект исполняющей системы. Менеджер процессов создает для объекта управляющий блок процесса и инициализирует его идентификатором процесса, квотами, маркером доступа и различными другими полями. Также создается объект секции, чтобы следить за адресным пространством процесса.
Когда динамическая библиотека kernel32.dll снова получает управление, она обращается к системному вызову, NtCreateThread, чтобы создать начальный поток. Для потока создаются стек режима пользователя и стек режима ядра. Размер стека указан в заголовке исполняемого файла.
Библиотека kernel32.dll посылает подсистеме окружения Win32 сообщение, в котором содержится информация о новом процессе, и передает ей дескрипторы процесса и потока. Данные о процессе и потоке помещаются в таблицы подсистемы, в результате чего у нее оказывается полный список всех процессов и потоков. Подсистема отображает курсор в виде стрелки с песочными часами, чтобы сообщить пользователю, что что-то происходит, но курсор может использоваться. Когда процесс обращается к своему первому вызову графического интерфейса пользователя, чтобы создать окно, курсор удаляется (если обращения к вызову не поступает, курсор удаляется через 2 с).
В этот момент поток готов к работе. Он начинается с запуска процедуры системы поддержки исполнения программ для завершения инициализации.
Процедура системы поддержки исполнения программ устанавливает приоритет потока, сообщает загруженным библиотекам DLL о появлении нового потока, а также выполняет другую рутинную работу. Наконец, она запускает код основной программы потока.
Создание потока также состоит из нескольких этапов. Сначала работающий процесс обращается к функции CreateThread, которая вызывает процедуру внутри kemel32.dll. Эта процедура выделяет в вызывающем процессе память для стека режима пользователя, а затем обращается к системному вызову NtCreateThread, чтобы создать объект потока для исполняющей системы, проинициализировать его, а также создать и проинициализировать блок управления потоком. В этом случае уведомляется подсистема Win32, а информация о потоке помещается в ее таблицы. Затем поток начинает работу с собственной инициализации.
Когда создается процесс или поток, исходному процессу возвращается дескриптор, который можно использовать для запуска, остановки, уничтожения и проверки созданного процесса или потока. Владелец дескриптора может передать его другому процессу защищенным способом. Эта техника применяется, чтобы отладчики могли иметь полный контроль над управляемыми ими процессами.