Процессы в Windows

Содержание

Слайд 2

В Windows под процессом понимается объект ядра, которому принадлежат системные ресурсы,

В Windows под процессом понимается объект ядра, которому принадлежат системные ресурсы,

используемые исполняемым приложением. Поэтому можно сказать, что в Windows процессом является исполняемое приложение.
Слайд 3

Каждый процесс в операционной системе Windows владеет следующими ресурсами: виртуальным адресным

Каждый процесс в операционной системе Windows владеет следующими ресурсами:
виртуальным адресным пространством;
рабочим

множеством страниц в реальной памяти;
маркером доступа, содержащим информацию для системы безопасности;
таблицей для хранения дескрипторов объектов ядра.
Слайд 4

Новый процесс в Windows создается вызовом функции CreateProcess, которая имеет следующий

Новый процесс в Windows создается вызовом функции CreateProcess, которая имеет следующий

прототип:
BOOL CreateProcess(
LPCTSTR lpApplicationName, // имя исполняемого модуля
LPTSTR lpCommandLine, // командная строка
LPSECURITY_ATTRIBUTES lpProcessAttributes, // защита процесса LРSECURITY_ATTRIBUTES lpThreadAttributes, // защита потока
BOOL blnheritHandles, // признак наследования дескриптора
DWORD dwCreationFlags, // флаги создания процесса
LPVOID IpEnvironment, // блок новой среды окружения
LPCTSTR lpCurrentDirectory, // текущий каталог
LPSTARTUPINFO IpStartUpInfo, // вид главного окна
LPPROCESS_INFORMATION lpProcessInformation // информация о процессе
) ;
Слайд 5

Слайд 6

Слайд 7

Слайд 8

Слайд 9

Слайд 10

Слайд 11

Слайд 12

При использовании параметра lpCommandLine система для запуска нового процесса осуществляет поиск

При использовании параметра lpCommandLine система для запуска нового процесса осуществляет поиск

требуемого ехе-файла в следующей последовательности каталогов:
каталог, из которого запущено приложение;
текущий каталог родительского процесса;
системный каталог Windows;
каталог Windows;
каталоги, которые перечислены в переменной PATH среды окружения.
Слайд 13

#include #include int main() { STARTUPINFO si; PROCESS_INFORMATION pi; // заполняем

#include
#include
int main() {
STARTUPINFO si;
PROCESS_INFORMATION pi;
// заполняем значения

структуры STARTUPINFO по умолчанию
ZeroMemory (&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
Слайд 14

// запускаем процесс Notepad if (!CreateProcess( NULL, // имя не задаем

// запускаем процесс Notepad
if (!CreateProcess(
NULL, // имя не задаем
"Notepad.exe",

// имя программы
NULL, // атрибуты защиты процесса устанавливаем по умолчанию
NULL, // атрибуты защиты первичного потока по умолчанию
FALSE, // дескрипторы текущего процесса не наследуются
О, //по умолчанию NORMAL_PRIORIТY_CLASS
NULL, // используем среду окружения вызывающего процесса
NULL, // текущий диск и каталог, как и в вызывающем процессе
&si, // вид главного окна - по умолчанию
&pi // информация о новом процессе
)
)
Слайд 15

{ cout « "The new process is not created." « endl

{
cout « "The new process is not created." « endl
« "Check

a name of the process." « endl;
return 0;
}
Sleep(1000); // немного подождем и закончим свою работу
// закроем дескрипторы запущенного процесса в текущем процессе
CloseHandie(pi.hThread);
CloseHandie(pi.hProcess);
return 0;
}
Слайд 16

Процесс может завершить свою работу вызовом функции ExitProcess, которая имеет следующий

Процесс может завершить свою работу вызовом функции ExitProcess, которая имеет следующий

прототип:
VOID ExitProcess(
UINT uExitCode // код возврата из процесса
) ;
Один процесс может быть завершен другим при помощи вызова функции TerminateProcess, которая имеет следующий прототип:
BOOL TerminateProcess(
HANDLE hProcess, // дескриптор процесса
UINT uExitCode // код возврата
) ;
Слайд 17

Наследование дескрипторов Свойство наследования объекта означает, что если насле­дуемый объект создан

Наследование дескрипторов
Свойство наследования объекта означает, что если насле­дуемый объект создан или

открыт в некотором процессе, то к этому объ­екту будут также иметь доступ все процессы, которые создаются этим процессом, т.е. являются его потомками. Свойство наследования объекта определяется его дескриптором, который также может быть наследуемым или ненаследуемым. Для того чтобы объект стал наследуемым, необходимо сделать наследуемым его дескриптор и наоборот.
Слайд 18

Не могут наследоваться следующие дескрипторы: дескриптор виртуальной памяти, который возвращает любая

Не могут наследоваться следующие дескрипторы:
дескриптор виртуальной памяти, который возвращает любая из

функций LocalAlloc, GlobalAlloc, HeapCreate или HeapAlloc;
дескриптор динамической библиотеки, который возвращает функция LoadLibrary.
Слайд 19

#include #include int main(int argc, char *argv[]) { HANDLE hThread; char

#include
#include
int main(int argc, char *argv[])
{
HANDLE hThread;
char

с;
// преобразуем символьное представление дескриптора в число
hThread = (HANDLE)atoi(argv[1]) ;
// ждем команды о завершении потока
while (true)
{
_cputs("Input 't' to terminate the thread: ");
с = _getch();
Слайд 20

if (c == ‘t’) { _cputs("t\n") ; break; } // завершаем

if (c == ‘t’)
{
_cputs("t\n") ;
break;
}
// завершаем поток
TerminateThread(hThread, 0);
//

закрываем дескриптор потока
CloseHandle(hThread);
_cputs("Press any key to exit.\n");
_getch();
return 0;
}
Слайд 21

#include #include volatile int count; void thread() { for (;;) {

#include
#include
volatile int count;
void thread()
{
for (;;)
{
count++;
Sleep(500);
_cprintf("count

= %d\n"/ count);
}
}
int main()
{
char IpszComLine[80]; // для командной строки
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE hThread;
DWORD IDThread;
Слайд 22

_cputs("Press any key to start the count-thread.\n"); _getch(); // устанавливаем атрибуты

_cputs("Press any key to start the count-thread.\n");
_getch();
// устанавливаем атрибуты защиты

потока
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.IpSecurityDescriptor = NULL; // защита по умолчанию
sa.blnheritHandle = TRUE;// дескриптор потока наследуемый
// запускаем поток-счетчик
hThread = CreateThread(&sa, 0, thread, NULL, 0, &IDThread);
if (hThread == NULL)
return GetLastError();
// устанавливаем атрибуты нового процесса
ZeroMemory (&si, sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
Слайд 23

// формируем командную строку wsprintf(IpszComLine, "С:\\ConsoleProcess.exe %d", (int)hThread); // запускаем новый

// формируем командную строку
wsprintf(IpszComLine, "С:\\ConsoleProcess.exe %d", (int)hThread);
// запускаем новый консольный

процесс
if (!CreateProcess(
NULL, // имя процесса
IpszComLine, // адрес командной строки
NULL, // атрибуты защиты процесса по умолчанию
NULL, // атрибуты защиты первичного потока по умолчанию
TRUE, // наследуемые дескрипторы текущего процесса наследуются новым процессом CREATE_NEW_CONSOLE, // новая консоль
NULL, // используем среду окружения процесса предка
NULL, // текущий диск и каталог, как и в процессе-предке
&si,// вид главного окна - по умолчанию
&pi// здесь будут дескрипторы и идентификаторы нового процесса и его первичного потока
)
)
Слайд 24

{ _cputs("The new process is not created.\n"); _cputs("Press any key to

{
_cputs("The new process is not created.\n");
_cputs("Press any key to finish.\n");


_getch();
return GetLastError();
}
// закрываем дескрипторы нового процесса
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// ждем закрытия потока-счетчика
WaitForSingleObject(hThread, INFINITE);
_cputs("Press any key to exit.\n");
_getch();
// закрьгоаем дескриптор потока
CloseHandle(hThread);
return 0;
}
Слайд 25

Функция для изменения свойств дескрипторов имеет прототип BOOL SetHandlelnformation( HANDLE hObject,

Функция для изменения свойств дескрипторов имеет прототип
BOOL SetHandlelnformation(
HANDLE hObject, // дескриптор объекта
DWORD

dwMask, // флаги, которые изменяем
DWORD dwFlags // новые значения флагов
) ;
В случае успешного завершения эта функция возвращает ненулевое значение, в противном случае — false.
Слайд 26

Псевдодескрипторы процессов Псевдодескриптор текущего процесса отличается от настоящего дескриптора процесса тем,

Псевдодескрипторы процессов
Псевдодескриптор текущего процесса отличается от настоящего дескриптора процесса тем, что

он может использоваться только текущим процессом и не может наследоваться другими процессами. Псевдодескриптор процесса не нужно закрывать после его использования. Из псевдодескриптора процесса можно получить настоящий дескриптор процесса: для этого псевдодексриптор нужно продублировать, вызвав функцию DuplicateHandle.
Слайд 27

Обслуживание потоков Приоритеты потоков в Windows определяются относительно приоритета процесса, в

Обслуживание потоков
Приоритеты потоков в Windows определяются относительно приоритета процесса, в контексте

которого они исполняются, и изменяются от 0 (низ­ший приоритет) до 31 (высший приоритет). Приоритет процессов устанав­ливается при их создании функцией CreateProcess, используя параметр dwCreationFiags.
Слайд 28

Idle_prioriтy_class — класс фоновых процессов; below_normal_prioriтy_class — класс процессов ниже нормальных;

Idle_prioriтy_class — класс фоновых процессов;
below_normal_prioriтy_class — класс процессов ниже нормальных;
normal_prioriтy_class —

класс нормальных процессов;
above_normal_priority_class — класс процессов выше нормальных;
нigh_prioriтy_class — класс высокоприоритетных процессов;
real_time_prioriтy_class — класс процессов реального времени
Слайд 29

Фоновые процессы выполняют свою работу, когда нет активных пользовательских процессов. Обычно

Фоновые процессы выполняют свою работу, когда нет активных пользовательских процессов. Обычно

эти процессы следят за состоянием системы.
Процессы с нормальным приоритетом — это обычные пользовательские процессы. Этот приоритет также назначается пользовательским процессам по умолчанию.
Процессы с высоким приоритетом это такие пользовательские процессы, от которых требуется более быстрая реакция на некоторые события, чем от обычных пользовательских процессов. Эти процессы должны содержать небольшой программный код и выполняться очень быстро, чтобы не замедлять работу системы. Обычно такие приоритеты имеют другие системы, работающие на платформе операционных систем Windows.
К последнему типу процессов относятся процессы реального времени. Работа таких процессов обычно происходит в масштабе реального времени и связана с реакцией на внешние события. Эти процессы должны работать непосредственно с аппаратурой компьютера.
Слайд 30

Приоритет процесса можно изменить при помощи функции setPriorityClass, которая имеет следующий

Приоритет процесса можно изменить при помощи функции setPriorityClass, которая имеет следующий

прототип:
BOOL SetPriorityClass(
HANDLE hProcess, // дескриптор процесса
DWORD dwPriorityClass // приоритет
) ;
При успешном завершении функция SetPriorityClass возвращает ненулевое значение, в противном случае значение — false. Параметр dwPriorityClass этой функции должен быть равен одному из флагов, которые приведены выше.