Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО.docx
Скачиваний:
5
Добавлен:
03.08.2019
Размер:
1.14 Mб
Скачать
  1. Процесс. Ресурсы процесса.

С точки зрения программиста каждому процессу принадлежат ресурсы, представленные следующими компонентами:

• Один или несколько потоков.

• Виртуальное адресное пространство, отличное от адресных пространств других процессов, если не считать областей памяти, распределенных явным образом для совместного использования (разделения) несколькими процессами. Заметьте, что разделяемые отображенные файлы совместно используют физическую память, тогда как разделяющие их процессы используют различные виртуальные адресные пространства.

• Один или несколько сегментов кода, включая код DLL.

• Один или несколько сегментов данных, содержащих глобальные переменные.

• Строки, содержащие информацию об окружении, например, информацию о текущем пути доступа к файлам.

• Куча процесса.

• Различного рода ресурсы, например, дескрипторы открытых файлов и другие кучи.

  1. Процесс. Класс приоритета процесса

В Windows существует 32 уровня приоритета, от 0 до 31. Они группируются так: 31 - 16 уровни реального времени; 15 - 1 динамические уровни; 0 - системный уровень, зарезервированный для потока обнуления страниц (zero-page thread).

При создании процесса, ему назначается один из шести классов приоритетов:

  • Real time class (значение 24),

  • High class (значение 13),

  • Above normal class (значение 10),

  • Normal class (значение 8),

  • Below normal class (значение 6),

  • и Idle class (значение 4).

  1. Создание объекта ядра ос – процесс.

Процесс создается с помощью функции CreateProcess(), которая возвращает TRUE в случае удачного создания процесса:

CreateProcess

(NULL, // имя исполняемого файла

cmdLine,// командная строка, передаваемая процессу

// определяет нужные атрибуты защиты для объектов "процесс" и "поток" //соответственно, если NULL, то система закрепит за данными объектами //дескрипторы защиты по умолчанию

NULL,

NULL,

TRUE, // система передаст процессу все наследуемые описатели

0, // флаги, влияющие на то, как именно создается новый процесс

NULL, // дочерний процесс наследует строки переменных окружения от родительского процесса

NULL, // рабочий каталог нового процесса будет тем же, что и у приложения, его породившего

&st1, // указатель на структуру STARTUPINFO

&pi1, // указатель на структуру PROCESS_INFO

);

  1. Управление процессом.

Для управления процессами существуют ряд API-функций:

CreateProcess(NULL, str, NULL, NULL, true, NULL, NULL ,NULL, &si, &pi); – функция создает новый процесс;.

WaitForSingleObject(pi.hProcess, INFINITE); – функция приостанавливает выполнение потока родительского процесса, пока не завершится дочерний процесс pi.hProcess;

CloseHandle(hFileText); – уменьшает значения счетчиков объектов на единицу. Когда счетчик уменьшится до нуля, освобождается память, занимаемая этим объектом;

PTSTR GetCommandLine(); – получает указатель на полную командную строку;

DWORD GetEnvironmentVariable( PCTSTR pszName, PTSTR pszValue, DWORD cchValue); – позволяет выявлять присутствие той или иной переменной окружения и определять ее значение.

DWORD GetCurrentDirectory( DWORD cchCurDir, PTSTR pszCurDir); – получает текущий каталог и диск для процесса;

BOOL SetCurrentDirectory(PCTSTR pszCurDir); – устанавливает текущий каталог и диск для процесса;

HANDLE OpenProcess(DWORD fdwAccess, BOOL fInherit, DWORD, IDProcess) – возвращает дескриптор существующего в системе процесса.

  1. Окончание процесса.

Процесс можно завершить четырьмя способами:

  • входная функция первичного потока возвращает управление (рекомендуемый способ);

  • один из потоков процесса вызывает функцию ExitProcess (нежелательный способ);

  • поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно);

  • все потоки процесса умирают по своей воле (большая редкость).

  1. Среда процесса.

С любым процессам связан блок переменных окружения (среда) – область памяти, выделенная в адресном пространстве процесса, которые обычно применяются для «тонкой» настройки приложения. Получить переменные среды, связанные с приложением, можно следующим образом:

LPSTR lpszVariable;

LPVOID lpvEnv;

lpvEnv = GetEnvironmentStrings();

lpszVariable = (LPSTR)lpvEnv;

while (lpszVariable[0] != '\0')

{

SendMessage(hTextEnvaroment, LB_ADDSTRING, 0, (LPARAM)lpszVariable);

lpszVariable = lpszVariable + strlen(lpszVariable) + 1;

}

FreeEnvironmentStrings((LPTSTR)lpvEnv);

  1. Командная строка процесса.

Командная строка процесса

При создании новому процессу передается командная строка, которая почти никогда не бывает пустой — как минимум, она содержит имя исполняемого файла, использованного при создании этого процесса. Однако, как Вы увидите ниже (при обсуждении функции CreateProcess), возможны случаи, когда процесс получает командную строку, состоящую из единственного символа — нуля, завершающего строку. В момент запуска приложения стартовый код из библиотеки С/С++ считывает командную строку процесса, пропускает имя исполняемого файла и заносит в параметр pszCmdLine функции (w)WinMain указатель на оставшуюся часть командной строки.

Параметр pszCmdLine всегда указывает на ANSI-строку. Но, заменив WinMain на wWinMain, Вы получите доступ к Unicode-версии командной строки для своего процесса

Программа может анализировать и интерпретировать командную строку как угод но. Поскольку pszCrndLine относится к типу PSTR, а не PCSTR, не стесняйтесь и записывайте строку прямо в буфер, на который указывает этот параметр, но ни при каких условиях не переступайте границу буфера. Лично я всегда рассматриваю этот буфер как "только для чтений". Если в командную строку нужно внести изменения, я сначала копирую буфер, содержащий командную строку, в локальный буфер (в своей про грамме), который затем и модифицирую.

Указатель на полную командную строку процесса можно получить и вызовом функции GetCommandLine.

PTSTR GetCommandLine();

Она возвращает указатель на буфер, содержащий полную командную строку, включая полное имя (вместе с путем) исполняемого файла.

Во многих приложениях безусловно удобнее использовать командную строку, предварительно разбитую на отдельные компоненты, доступ к которым приложение может получить через глобальные переменные _argc и _argv (или _wargu). Функция CommandLineToArgvW расщепляет Unicode-строку на отдельные компоненты:

PWSTR CommandLineToArgvW( PWSTR pszCmdLine, int pNumArgs);

Буква W в конце имени этой функции намекает на "широкие" (wide) символы и подсказывает, что функция существует только в Unicode-версии. Параметр pszCmdLine указывает на командную строку Его обычно получают предварительным вызовом GetCommandLineW Параметр pNumArgs — это адрес целочисленной переменной, в которой задается количество аргументов в командной строке. Функция Command LineToArgvW возвращает адрес массива указателей на Unicode-строки

CommandLineToArgvW выделает нужную память автоматически. Большинство приложений не освобождает эту память, полагаясь на операционную систему, которая проводит очистку ресурсов по завершении процесса И такой подход вполне приемлем. Нo если Вы хотите сами освободить эту память, сделайте так:

int pNumArgs;

PWSTR *ppArgv = CommandLineToArgvW(GetCommandLineW(), &pNumArgs);

// используйте эти аргументы if (*ppArgv[1] == L x ) {

// освободите блок памяти HeapFree(GetProcessHeap() 0 ppArgv);

  1. Наследование дочерними процессами ресурсов родительского процесса.

По умолчанию система наследует всем создаваемым процессам среду его родителя, но при его создании имеется возможность задать собственную среду для процесса, используя седьмой параметр в функции CreateProcess(…), или указать NULL для наследования по умолчанию:

// Run process

BOOL Res = CreateProcess(NULL,szRunAppl,NULL,NULL,TRUE,0,

pEnvaroment,NULL,&stInfo,&prTInfo);

  1. Время выполнения процесса.

На использование процессом ресурсов ОС затрачивается некоторое время, система же предоставляет некоторые функции для отображения этой информации (время создания, время ядра, время пользователя и др.)

FILETIME timeCreation, FILETIME timeExit;

FILETIME timeKernel, FILETIME timeUsed;

SYSTEMTIME timeSys;

GetProcessTimes(GetCurrentProcess(), &timeCreation, &timeExit,&timeKernel, &timeUsed);

FileTimeToLocalFileTime(&timeCreation, &timeCreation);

FileTimeToSystemTime(&timeCreation, &timeSys);

SetWindowText(hProcTime, szTime);

FileTimeToSystemTime(&timeUsed, &timeSys); // Used Process

SetWindowText(hProcTimeUs, szTime);

FileTimeToSystemTime(&timeKernel, &timeSys); // Kernel used Process

SetWindowText(hProcTimeKrn, szTime);