ВУЗ:
Составители:
вительно параллельную обработку. В однопроцессорной конфигурации процессор должен выделять кванты времени каждо-
му исполняемому в данный момент потоку.
Дескрипторы и идентификаторы процессов
Разницу между дескрипторами и идентификаторами процессов можно установить, анализируя API-функцию Create-
Process:
BOOL CreateProcess
LPCTSTR lpApplicationName
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation;
Рассмотрим параметры API функцию CreateProcess:
• lpApplicationName, lpCommandLine – определяют имя исполняемого файла, которым будет пользоваться новый про-
цесс, и командную строку, передаваемую этому процессу;
• lpProcessAttributes, lpThreadAttributes – эти параметры позволяют определить нужные атрибуты защиты для объектов
"процесс" и "поток" соответственно. В эти параметры можно занести NULL, и система закрепит за данными объектами деск-
рипторы защиты по умолчанию. В качестве альтернативы можно объявить и инициализировать две структуры SECURITY_
ATTRIBUTES; тем самым создать и присвоить объектам "процесс" и "поток" свои атрибуты защиты. Вид структуры SECU-
RITY ATTRIBUTES:
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES;
• bInheritHandles – указывает, наследовал ли новый процесс дескрипторы от процесса запроса. Если ИСТИНА, каж-
дый наследственный открытый дескриптор в процессе запроса унаследован новым процессом;
• dwCreationFlags – определяет флаги, влияющие на то, как именно создается новый процесс. Имеется десять флагов,
которые могут комбинироваться булевым оператором ОR; среди них:
– lpEnvironment – указывает на блок памяти, хранящий строки переменных окружения, которыми будет пользо-
ваться новый процесс. Обычно вместо этого параметра передается NULL, в результате чего дочерний процесс наследует
строки переменных окружения от родительского процесса;
– lpCurrentDirectory – позволяет установить текущие диски каталог. Если его значение – NULL, рабочий каталог
нового процесса будет тем же, что и у приложения, его породившего;
– lpStartupInfo – этот параметр указывает на структуру STARTUPINFO.
Элементы структуры STARTUPINFO используются Windows-функциями при создании процесса. При этом большинст-
во приложений порождает процессы с атрибутами по умолчанию. Но в этом случае необходимо инициализировать все эле-
менты структуры STARTUPINFO, хотя бы нулевыми значениями, а в элемент cb – заносить размер этой структуры.
• lpProcessInformation – указывает на структуру PROCESS_INFORMATION.
Таким образом, между дескриптором и идентификатором процесса (или потока) существуют следующие основные раз-
личия:
1. Дескриптор действует в пределах своего процесса, в то время как идентификатор работает на системном уровне, и
действует только в пределах того процесса, в котором он был создан.
2. У каждого процесса только один идентификатор, но может быть несколько дескрипторов.
3. Некоторым API-функциям требуется идентификатор, в то время как другим – дескриптор процесса.
Следует подчеркнуть, что, хотя дескриптор является зависимым от процесса, один процесс может иметь дескриптор
другого процесса. Иными словами, если процесс А имеет дескриптор процесса В, то этот дескриптор идентифицирует про-
цесс В, но действует только в процессе А. Он может использоваться в процессе А для вызова некоторых API-функций, кото-
рые имеют отношение к процессу В. (Однако память процесса В остается недоступной для процесса А).
Дескрипторы модулей. Каждый модуль (DLL, OCX, DRV и т.д.), загруженный в пространство процесса, имеет свой
дескриптор (module handle), называемый также логическим номером экземпляра (instance handle). В 16-разрядной Windows
данными терминами обозначались разные объекты, в 32-разрядной системе это один и тот же объект.
Дескриптором исполняемого модуля является начальный или базовый адрес данного исполняемого модуля в адресном
пространстве процесса. Это объясняет, почему такой дескриптор имеет смысл только в рамках процесса, включающего дан-
ный модуль.
Дескрипторы модулей часто используются для вызова API-функций, которые выделяют ресурсы данному процессу.
Например, функция LoadBitmap загружает ресурс растровой картинки из загрузочного файла данного процесса. Ее деклара-
ция записывается так:
HBITMAP LoadBitmap(
Страницы
- « первая
- ‹ предыдущая
- …
- 19
- 20
- 21
- 22
- 23
- …
- следующая ›
- последняя »