Скачать презентацию Лекция 4 Управление процессами в ОС Windows NT Скачать презентацию Лекция 4 Управление процессами в ОС Windows NT

Структура ОС.ppt

  • Количество слайдов: 38

Лекция 4. Управление процессами в ОС Windows NT • Структура ОС Windows • Подсистема Лекция 4. Управление процессами в ОС Windows NT • Структура ОС Windows • Подсистема Win 32 • Объекты ядра • Процессы и потоки в ОС Windows • Планирование потоков 1 2/6/2018 1: 32: 29 PM

Структура ОС Windows Объекты ядра 2 2/6/2018 1: 32: 30 PM Структура ОС Windows Объекты ядра 2 2/6/2018 1: 32: 30 PM

Структура ОС Windows 3 Первые версии системы имели микроядерный дизайн, основанный на микроядре Mach, Структура ОС Windows 3 Первые версии системы имели микроядерный дизайн, основанный на микроядре Mach, которое было разработано в университете Карнеги. Меллона. Архитектура более поздних версий системы микроядерной уже не является. Большой объем системного кода (управление системными вызовами и экранная графика) был перемещен из адресного пространства пользователя в пространство ядра и работает в привилегированном режиме. 2/6/2018 1: 32: 30 PM

Структура ОС Windows 4 В результате в ядре ОС Windows переплетены элементы микроядерной архитектуры Структура ОС Windows 4 В результате в ядре ОС Windows переплетены элементы микроядерной архитектуры и элементы монолитного ядра (комбинированная система). Основные компоненты ядра Windows NT располагаются в вытесняемой памяти и взаимодействуют друг с другом путем передачи сообщений (микроядерная архитектура) В тоже время все компоненты ядра работают в одном адресном пространстве и активно используют общие структуры данных, что свойственно 2/6/2018 1: 32: 30 PM операционным системам с монолитным ядром.

Подсистема Win 32 Приложение Text. Editor Монитор Основные компоненты Win 32: • ntoskrnl. exe Подсистема Win 32 Приложение Text. Editor Монитор Основные компоненты Win 32: • ntoskrnl. exe исполнительная система и ядро; • ntdll. dll - внутренние функции поддержки и интерфейсы диспетчера системных сервисов с функциями исполнительной системы; • hal. dll - уровень абстрагирования от оборудования; • win 32 k. sys - часть подсистемы Win 32, работающая в режиме ядра; • kernel 32. dll, advapi 32. dll, user 32. dll, gdi 32. dll - основные dll подсистемы Win 32 5 2/6/2018 1: 32: 30 PM

Системные вызовы в Win 32 При вызове приложением одной из Win 32 -функций может Системные вызовы в Win 32 При вызове приложением одной из Win 32 -функций может возникнуть одна из трех ситуаций: 1) Функция полностью выполняется внутри данной dll (шаг 1). 2) Для выполнения функции привлекается сервер csrss, для чего ему посылается сообщение (шаг 2 a, за которым обычно следуют шаги 2 b и 2 c). 3) Данный вызов транслируется в системный сервис (системный вызов), который обычно обрабатывается в модуле ntdll. dll (шаги 3 a и 3 b). Например, Win 32 -функция Read. File выполняется с помощью недокументированного сервиса Nt. Read. File 6 2/6/2018 1: 32: 31 PM

Объекты ядра Для работы с важными системными ресурсами ОС Windows создает объекты, управление которыми Объекты ядра Для работы с важными системными ресурсами ОС Windows создает объекты, управление которыми осуществляет менеджер объектов. • Ядро поддерживает базовые объекты двух видов: объекты диспетчера (события, мьютексы, семафоры, потоки ядра, таймеры и др. ) и управляющие (DPC, APC, прерывания, процессы, профили и др. ) • Над объектами ядра находятся объекты исполнительной системы, каждый из которых инкапсулирует один или более объектов ядра. Объекты исполнительной системы предназначены для управления памятью, процессами и межпроцессным обменом. К ним относятся такие объекты, как: процесс, поток, открытый файл, семафор, мьютекс, маркер доступа и ряд других (MSDN). Эти объекты и называются объектами ядра в руководствах по программированию. 7 2/6/2018 1: 32: 31 PM

Объекты ядра • Внешнее отличие объектов ядра (объектов исполнительной системы) от объектов User и Объекты ядра • Внешнее отличие объектов ядра (объектов исполнительной системы) от объектов User и GDI состоит в наличии у первых атрибутов защиты, Далее эти объекты ядра (объекты исполнительной системы) будут называться просто объектами. • Объект представляет собой блок памяти в виртуальном адресном пространстве ядра. Этот блок содержит информацию об объекте в виде структуры данных. Структура содержит как общие, так и специфичные для каждого объекта элементы. Объекты создаются в процессе загрузки и функционирования ОС и теряются при перезагрузке и выключении питания. • Содержимое объектов доступно только ядру, приложение не может модифицировать его непосредственно. Доступ к объектам можно осуществить только через его функцииметоды (инкапсуляция данных), которые инициируются вызовами некоторых библиотечных Win 32 -функций. 8 2/6/2018 1: 32: 31 PM

Создание и мониторинг объектов ядра void __fastcall TForm 1: : Sm. Create. Click(TObject *Sender) Создание и мониторинг объектов ядра void __fastcall TForm 1: : Sm. Create. Click(TObject *Sender) { try { HANDLE r=Create. Semaphore(NULL, 1, 5, "My. Sem"); if (r) {Ansi. String msg="Semaphore was created"; LBConsole->Items->Add(msg); } else LBConsole->Items->Add("Error"); } catch (. . . ) { } } void __fastcall TForm 1: : Sm. Open. Click(TObject *Sender) { try {HANDLE r=Open. Semaphore(SEMAPHORE_ALL_ACCESS, false, "My. Sem"); if (r) { Ansi. String msg="Semaphore was opened. "; LBConsole->Items->Add(msg); } else LBConsole->Items->Add("Error opended"); } catch (. . . ) {} } Приложение Sem. Example 9 Приложение Winobj 2/6/2018 1: 32: 31 PM

Структура объекта. Методы объекта • Каждый объект имеет заголовок с информацией, общей для всех Структура объекта. Методы объекта • Каждый объект имеет заголовок с информацией, общей для всех объектов, а также данные, специфичные для объекта. Например, в поле заголовка имеется список процессов, открывших данный объект, и информация о защите, определяющая, кто и как может использовать объект. • Счетчик ссылок на объект увеличивается на 1 при открытии объекта и уменьшается на 1 при его закрытии. 10 2/6/2018 1: 32 PM

Структура объекта. Методы объекта Квота устанавливает ограничения на объемы ресурсов. Например, по умолчанию лимит Структура объекта. Методы объекта Квота устанавливает ограничения на объемы ресурсов. Например, по умолчанию лимит на открытые объекты для процесса - 230. Множество объектов делится на типы, а у каждого из объектов есть атрибуты, неизменные для объектов данного типа. Ссылка на тип объекта также входит в состав заголовка. В состав компонентов объекта типа входит атрибут методы указатели на внутренние процедуры для выполнения стандартных операций. Методы вызываются диспетчером объектов при создании и уничтожении объекта, открытии и закрытии описателя объекта, изменении параметров защиты. Система позволяет динамически создавать новые типы объектов. В этом случае предполагается регистрация его методов у диспетчера объектов. Например, метод open вызывается всякий раз, когда создается или открывается объект и создается его новый описатель. 11 2/6/2018 1: 32 PM

Описатели объектов Sem. Example Win. Obj Proc. Exp • Создание новых объектов, или открытие Описатели объектов Sem. Example Win. Obj Proc. Exp • Создание новых объектов, или открытие по имени уже существующих, приложение может осуществить при помощи Win 32 -функций, таких, как Create. File, Create. Semaphore, Open. Semaphore и т. д. • Это библиотечные процедуры, за которыми стоят сервисы Windows и методы объектов. В случае успешного выполнения создается 64 -битный описатель в таблице описателей процесса в памяти ядра. На эту таблицу есть ссылка из блока управления процессом EPROCESS 12 2/6/2018 1: 32 PM

Описатели объектов Из 64 -х разрядов описателя 29 разрядов используются для ссылки на блок Описатели объектов Из 64 -х разрядов описателя 29 разрядов используются для ссылки на блок памяти объекта ядра, 3 - для флагов, а оставшиеся 32 - в качестве маски прав доступа. Маска прав доступа формируется на этапе создания или открытия объекта, когда выполняется проверка разрешений. Таким образом, описатель объекта - принадлежность процесса, создавшего этот объект. По умолчанию он не может быть передан другому процессу. Тем не менее, система предоставляет возможность дублирования описателя и передачи его другому процессу специальным образом. Win 32 -функции, создающие объект, возвращают приложению не сам описатель, а индекс в таблице описателей, то есть малое число: типа 1, 2 а не 64 разрядное. Впоследствии это значение передается одной из функций, которая принимает описатель объекта в качестве аргумента. Одной из таких функций является функция Close. Handle, задача которой - закрыть объект. 13 2/6/2018 1: 32 PM

Создание объектов ядра Когда процесс инициализируется в первый paз, таблица описателей еще пуста. Но Создание объектов ядра Когда процесс инициализируется в первый paз, таблица описателей еще пуста. Но стоит одному из его потоков вызвать функцию, создающую объект ядра (например, Create. Ftle. Mapping), как ядро выделяет для этого объекта блок памяти и инициализирует его, далее ядро просматривает таблицу описателей, принадлежащую данному процессу, и отыскивает свободную запись. Вот некоторые функции, создающие объекты ядра: HANDLE Create. Thread(…), HANDEE Create. File(…), HANDLE Create. File. Mapping(…), HANDLE Create. Semaphore(…)… Все функции, создающие объекты ядра, возвращают описатели, которые привязаны к конкретному процессу и могут быть использованы в любом потоке данного процесса Значение описателя представляет собой индекс в таблице описателей, принадлежащей процессу, и таким образом идентифицирует место, где хранится информация, связанная с объектом ядра. Вот поэтому при отладке своего приложения и просмотре фактического значения описателя объекта ядра Вы и видите такие малые величины: 1, 2 и т. д. Но помните, что физическое содержимое описателей не задокументировано и может быть изменено. 14 2/6/2018 1: 32 PM

Защита объектов Объекты ядра можно защитить дескриптором защиты (security descriptor), который описывает, кто создал Защита объектов Объекты ядра можно защитить дескриптором защиты (security descriptor), который описывает, кто создал объект и кто имеет права на доступ к нему. Дескрипторы защиты обычно используют при написании серверных приложений; создавая клиентское приложение, Вы можете игнорировать это свойство объектов ядра. Почти все функции, создающие объекты ядра, принимают указатель на структуру SECURITY_ATTRIBUTES как аргумент, например: HANDLE Create. File. Mapping( HANDLE h. File. PSECURITY_ATTRIBUTES psa, DWORD fl. Protect, DWORD dw. Maximum. Size. High, DWORD dw. Maximuni. Size. Low, PCTSTR psz. Narne); Большинство приложений вместо этого аргумента передает NULL и создает объект с защитой по умолчанию. Такая защита подразумевает, что создатель объекта и любой член группы администраторов получают к нему полный доступ, а все прочие к объекту не допускаются 15 2/6/2018 1: 32 PM

Защита объектов Вы можете создать и инициализировать структуру SECURITY_ATTRIBUTES, а затем передать ее адрес. Защита объектов Вы можете создать и инициализировать структуру SECURITY_ATTRIBUTES, а затем передать ее адрес. Она выглядит так: typedef struct _SECURITY_ATTRIBUTES { DWORD n. Length, LPVOID lp. Security. Descriptor; BOOL b. Inhertt. Handle; } SECURITY_ATTRIBUTES; Хотя структура называется SECURITY__ATTRIBUTES, лишь один ее элемент имеет отношение к защите — lp. Secunty. Descriptor. Если надо ограничить доступ к созданному Вами объекту ядра, создайте дескриптор защиты и инициализируйте структуру SECURITY_ATTRIBUTES следующим образом: SECURITY_ATTRIBUTES sa; sa. n. Length = sizeof(sa); // используется для выяснения версий sa. lp. Secunty. Descriptor = p. SD, // адрес инициализированной SD sa. b. Inherit. Handle = FALSE; // наследование объекта HANDLE h. File. Mapping = Create. File. Mapping(INVALID_HANDLE_VALUE, &sa, PAGE_REAOWRITE, 0, 1024, "My. File. Mapping"); 16 2/6/2018 1: 32 PM

Закрытие объекта ядра Независимо от того, как именно Вы создали объект ядра, по окончании Закрытие объекта ядра Независимо от того, как именно Вы создали объект ядра, по окончании работы с ним его нужно закрьпь вызовом Close. Handle: BOOL Close. Handle(HANDLE hobj); Эта функция сначала проверяет таблицу описателей, принадлежащую вызывающему процессу, чтобы убедиться, идентифицирует ли переданный ей индекс (описатель) объект, к которому этот процесс действительно имеет доступ. Если переданный индекс правилен, система получает адрес структуры данных объекта и уменьшает в этой структуре счетчик числа пользователей; как только счетчик обнулится, ядро удалит объект из памяти. Если же описатель невереи, происходит одно из двух. В нормальном режиме выполнения процесса Close. Handle возвращает FALSE, a Get. Last. Error — код ERROR_INVALID_HANDLE. Но при выполнении процесса в режиме отладки система просто уведомляет отладчик об ошибке. 17 2/6/2018 1: 32 PM

Именование объектов. Разделяемые ресурсы Многие объекты в системе имеют имена. Именование объектов удобно для Именование объектов. Разделяемые ресурсы Многие объекты в системе имеют имена. Именование объектов удобно для учета объектов и поиска нужного объекта. Кроме того, знание имени объекта может быть использовано процессом для получения к нему доступа (совместное использование ресурсов). Пространство имен объектов организовано в виде древовидной иерархической системы. В качестве нетерминальной вершины дерева используется объект "каталог объектов". Каталог включает информацию, необходимую для трансляции имен объектов в указатели на сами объекты. Именование допускают многие (но не все) объекты ядра. Например, следующие функции создают именованные объекты ядра HANDLE Create. Mutex(… PCTSTR psz. Name); HANDLE Create. Event(… PCTSTR psz. Name); HANDLE Create. Semaphore(… PCTSTR psz. Name); HANDLE Create. Job. Object(…PCTSTR psz. Name); Последний параметр, psz. Name, у всех этих функций одинаков. Передавая в нем NULL, Вы создаете безымянный (анонимный) объект ядра. В этом случае Вы можете разделять объект между процессами либо через наследование, либо с помощью Duplicate. Handle. А чтобы разделять объект по имени, Вы должны присвоить ему какое-нибудь имя. Тогда вместо NULL в параметре psz. Name нужно передать адрес строки с именем, завершаемой нулевым символом. 18 2/6/2018 1: 32 PM

Совместное использование объектов Иногда у приложений возникает необходимость в разделении ресурсов. В ОС Windows Совместное использование объектов Иногда у приложений возникает необходимость в разделении ресурсов. В ОС Windows обычно это имеет следствием совместное использование объектов, стоящих за этими ресурсами. Наиболее распространенный вариант - когда двум или более процессам известно имя разделяемого объекта. В этом случае один из процессов создает объект (например, с помощью функции Create. Semaphore), а остальные открывают его для себя (например, с помощью функции Open. Semaphore). 19 2/6/2018 1: 32 PM

Процессы и потоки в ОС Windows 20 2/6/2018 1: 32: 33 PM Процессы и потоки в ОС Windows 20 2/6/2018 1: 32: 33 PM

Процессы и потоки в ОС Windows Процесс является динамическим объектом, описывающим выполнение программы. В Процессы и потоки в ОС Windows Процесс является динамическим объектом, описывающим выполнение программы. В Windows NT процесс – это объект, создаваемый и уничтожаемый менеджером объектов. Процесс содержит потоки, учетную информацию и ссылки на системные ресурсы: закрытое адресное пространство, семафоры, коммуникационные порты, файлы и т. д. Процесс характеризуется текущим состоянием (выполнение, ожидание, готовность и т. д. ) , которые обобществляются всеми потоками процесса. Задача ОС состоит в том, чтобы организовать их поддержку, которая подразумевает, что каждый процесс получит все необходимые ему ресурсы; Независимые процессы не должны влиять друг на друга, а процессы, которым необходимо обмениваться информацией, должны иметь возможность сделать это путем межпроцессного взаимодействия. 21 2/6/2018 1: 32: 33 PM

Процессы и потоки в ОС Windows Для описания процесса ОС поддерживает набор структур, главную Процессы и потоки в ОС Windows Для описания процесса ОС поддерживает набор структур, главную из которых принято называть блоком управления процессом (PCB, Process control block). Состав PCB: • идентификатор процесса; • токен доступа - исполняемый объект, содержащий информацию о безопасности; • базовый приоритет - основа для исполнительного приоритета нитей процесса; • процессорная совместимость - набор процессоров, на которых могут выполняться нити процесса; • предельные значения квот - максимальное количество страничной и нестраничной системной памяти, дискового пространства, предназначенного для выгрузки страниц, процессорного времени - которые могут быть использованы процессами пользователя; • время исполнения - общее количество времени, в течение которого выполняются все нити процесса. 22 2/6/2018 1: 32: 33 PM

Внутреннее устройство процессов в ОС Windows Proc. Exp Блок управления процессом (PCB) реализован в Внутреннее устройство процессов в ОС Windows Proc. Exp Блок управления процессом (PCB) реализован в виде набора связанных структур, главная из которых называется блоком процесса EPROCESS. 23 2/6/2018 1: 32: 33 PM

Создание процесса Обычно процесс создается другим процессом вызовом Win 32 -функции Create. Process. Создание Создание процесса Обычно процесс создается другим процессом вызовом Win 32 -функции Create. Process. Создание процесса осуществляется в несколько этапов: 1) на диске отыскивается нужный файл-образ, после чего создается объект "раздел" памяти для проецирования на адресное пространство нового процесса (kernel 32. dll); 2) выполняется обращение к системному сервису Nt. Create. Process для создания объекта "процесс". Формируются блоки EPROCESS, KPROCESS и блок переменных окружения PEB. Менеджер процессов инициализирует в блоке процесса маркер доступа (копируя аналогичный маркер родительского процесса), идентификатор и другие поля; 3) создание первичного потока (сервис Nt. Create. Thread, библиотека kernel 32. dll); 4) kernel 32. dll посылает подсистеме Win 32 сообщение, которое содержит информацию, необходимую для выполнения нового процесса. Данные о процессе и потоке помещаются, в список процессов и список потоков данного процесса, затем устанавливается приоритет процесса, создается структура, используемая частью Win 32, которая работает в режиме ядра, и т. д. ; 5) запускается первичный поток, для чего формируются его начальный контекст и стек, и выполняется запуск стартовой процедуры потока режима ядра Ki. Thread. Startup. После этого стартовый код из библиотеки C/C++ передает управление функции main() запускаемой программы. 24 2/6/2018 1: 32: 34 PM

Создание процесса. Функция Create. Process BOOL Create. Process( PCTSTR psz. Application. Name, //имя программы; Создание процесса. Функция Create. Process BOOL Create. Process( PCTSTR psz. Application. Name, //имя программы; PTSTR psz. Command. Line, //параметры командной строки; SECURITY_ATTRIBUTES psa. Process, //атрибуты безопасности процесса; PSECURITY_ATTRIBUTES psa. Thread, //атрибуты безопасности главного потока; BOOL b. Inherit. Handles, //- если b. Inherit. Handles == TRUE, то созданный процесс (запущенная программа), наследует дескрипторы (handles) запускающей программы; DWORD fdw. Creation. Flags, //- параметры создания. Здесь можно указать класс приоритета создаваемого процесса и некоторые дополнительные параметры; PVOID pv. Environment, // - указатель на блок окружения или NULL, тогда используется блок окружения родителя; PCTSTR psz. Cur. Dir, // текущая директория или NULL, тогда используется текущая директория родителя; PSTARTUPINFO psi. Start. Info, //- указатель на структуру STARTUPINFO, которая определяет положение главного окна; PPROCESS_INFORMATION ppi. Proc. Info //информация о созданном процессе. ); 25 2/6/2018 1: 32: 34 PM

Создание процесса (пример) #include <windows. h> #include <stdio. h> void main( VOID ) { Создание процесса (пример) #include #include void main( VOID ) { STARTUPINFO Startup. Info; PROCESS_INFORMATION Proc. Info; TCHAR Command. Line[] = TEXT(“format c: "); Zero. Memory( &Startup. Info, sizeof(Startup. Info) ); Startup. Info. cb = sizeof(Startup. Info); Zero. Memory( &Proc. Info, sizeof(Proc. Info) ); if( !Create. Process( NULL, // Не используется имя модуля Command. Line, // Командная строка NULL, // Дескриптор процесса не наследуется. NULL, // Дескриптор потока не наследуется. FALSE, // Установка описателей наследования 0, // Нет флагов создания процесса NULL, // Блок переменных окружения родит. процесса NULL, // Использовать текущий каталог родит. процесса &Startup. Info, // Указатель на структуру STARTUPINFO. &Proc. Info ) // Указатель на структуру информации о процессе. ) } 26 printf( "Create. Process failed. " ); // Ждать окончания дочернего процесса Wait. For. Single. Object( Proc. Info. h. Process, INFINITE ); // Закрыть описатели процесса и потока Close. Handle( Proc. Info. h. Process ); Close. Handle( Proc. Info. h. Thread ); Приложение createprocess 2/6/2018 1: 32: 34 PM

Завершение процесса Процесс завершается если: Входная функция первичного потока возвратила управление. Один из потоков Завершение процесса Процесс завершается если: Входная функция первичного потока возвратила управление. Один из потоков процесса вызвал функцию Exit. Process. Поток другого процесса вызвал функцию Terminate. Process. Когда процесс завершается, все User- и GDI-объекты, созданные процессом, уничтожаются, объекты ядра закрываются (если их не использует другой процесс), адресное пространство процесса уничтожается. Рассмотрим, как это реализуется на практике. 27 2/6/2018 1: 32: 34 PM

Получение идентификатора процесса Для получения идентификатора процесса (pid) рассмотрим функцию, которая будет определять PID Получение идентификатора процесса Для получения идентификатора процесса (pid) рассмотрим функцию, которая будет определять PID по имени файла. Для этого необходимо получить snapshot (снимок) системных процессов с помощью функции Create. Toolhelp 32 Snapshot(), а затем функциями Process 32 First() и Process 32 Next() перебираются все процессы для поиска нужного. Здесь существенную роль играет структура PROCESSENTRY 32, которая как раз содержит информацию как об имени файла (элемент sz. Exe. File), так и об идентификаторе процесса (элемент th 32 Process. ID). typedef struct tag. PROCESSENTRY 32 { DWORD dw. Size; //Рамер структуры DWORD cnt. Usage; //Число ссылк на процесс. Процесс уничтожается, //когда число ссылок становится 0 DWORD th 32 Process. ID; //Идентификатор процесса DWORD th 32 Default. Heap. ID; //Идентификатор основной кучи DWORD th 32 Module. ID; //идентификатор модуля DWORD cnt. Threads; //Число потоков DWORD th 32 Parent. Process. ID; //Идентификатор родителя LONG pc. Pri. Class. Base; //приоритет по умолчанию DWORD dw. Flags; //Зарезервировано CHAR sz. Exe. File[MAX_PATH]; //Собственно имя процесса } PROCESSENTRY 32, *PPROCESSENTRY 32, *LPPROCESSENTRY 32; 28 2/6/2018 1: 32: 34 PM

Получение идентификатора процесса procedure TForm 1. Button 1 Click(Sender: TObject); var han : THandle; Получение идентификатора процесса procedure TForm 1. Button 1 Click(Sender: TObject); var han : THandle; pi : TProc. Info; // from "tlhelp 32" in uses clause s. ID : string; begin LB. Items. Clear; // Get a snapshot of the system han : = Create. Toolhelp 32 Snapshot( TH 32 CS_SNAPALL, 0 ); if han = 0 then exit; pi: =TProc. Info. Create; pi. Proc. Struct. dw. Size : = sizeof( PROCESSENTRY 32 ); if Process 32 First( han, pi. Proc. Struct ) then repeat s. ID : = Extract. File. Name( pi. Proc. Struct. sz. Exe. File ); while length(s. ID)<50 do s. ID: =s. Id+' ‘; s. ID: =s. ID+'|'; s. ID: =s. ID+' '+Int. To. Str(pi. Proc. Struct. th 32 Process. ID); LB. Items. Add. Object(s. Id, pi); pi: =TProc. Info. Create; pi. Proc. Struct. dw. Size : = sizeof( PROCESSENTRY 32 ); until not Process 32 Next( han, pi. Proc. Struct); end; Приложение Win. Proc. List 29 2/6/2018 1: 32: 34 PM

Получение списка окон и классов procedure TForm 1. Button 2 Click(Sender: TObject); var Wnd: Получение списка окон и классов procedure TForm 1. Button 2 Click(Sender: TObject); var Wnd: h. Wnd; buff: array[0. . 127] of Char; classname : array[0. . 1023] of Char; s : string; pc : PAnsi. Char; nc : integer; begin LB. Clear; pc: =@classname[0]; Wnd : = Get. Window(Handle, gw_HWnd. First); while Wnd <> 0 do begin {Не показываем: } if (Wnd <> Application. Handle) and {-Собственное окно} Is. Window. Visible(Wnd) and {-Невидимые окна} (Get. Window(Wnd, gw_Owner) = 0) and {-Дочерние окна} (Get. Window. Text(Wnd, buff, sizeof(buff)) <> 0) {Окна без заголовков} then begin Get. Window. Text(Wnd, buff, sizeof(buff)); nc: =Get. Class. Name(Wnd, pc, 1023); s: =Str. Pas(buff); while length(s)<40 do s: =s+' '; s: =s+' | '+Str. Pas(classname); LB. Items. Add(s); end; Wnd : = Get. Window(Wnd, gw_h. Wnd. Next); end; 30 2/6/2018 1: 32: 35 PM

Жизненный цикл потока 31 Каждый новый процесс содержит, по крайней мере, один поток Потоки Жизненный цикл потока 31 Каждый новый процесс содержит, по крайней мере, один поток Потоки составляют основу планирования • Готовность. У нити есть все для выполнения, но не хватает только процессора. • Первоочередная готовность (standby). Для каждого процессора системы выбирается одна нить, которая будет выполняться следующей. • Выполнение. Как только происходит переключение контекстов, нить переходит в состояние выполнения и находится в нем до тех пор, пока либо ядро не вытеснит ее. 2/6/2018 1: 32: 35 PM

Жизненный цикл потока Ожидание. Нить по своей инициативе ожидает некоторый объект для того, 32 Жизненный цикл потока Ожидание. Нить по своей инициативе ожидает некоторый объект для того, 32 чтобы синхронизировать свое выполнение; операционная система (например, подсистема ввода-вывода) может ожидать в интересах нити; подсистема окружения может непосредственно заставить нить приостановить себя. Переходное состояние. Нить готова к выполнению, но ресурсы, которые ей нужны, заняты. Завершение. Когда выполнение нити закончилось, она входит в состояние завершения. Находясь в этом состоянии, нить может быть либо удалена, либо не удалена. Код ядра выполняется в контексте текущего потока. Это означает, что при прерывании, системном вызове и т д. , то есть когда процессор переходит в режим ядра и управление передается ОС, переключения на другой поток (например, системный) не происходит. Контекст потока при этом сохраняется, поскольку операционная система все же может принять решение о смене характера деятельности и переключении на другой поток. Вследствие этого состояние "Выполнение" разделяют на "Выполнение в режиме пользователя" и "Выполнение в режиме ядра. Поэтому у каждого потока два стека, один работает в режиме ядра, другой - в режиме пользователя. Один и тот же стек не может использоваться и в режиме пользователя, и в режиме ядра. Любой поток может делать все что угодно со своим собственным стеком (стеком режима пользователя), в том числе организовывать несколько стеков и переключаться между ними. Поток сам может определять размер своего стека. 2/6/2018 1: 32: 35 PM

Внутреннее устройство потоков Объект-нить имеет следующие атрибуты : Идентификатор клиента - уникальное значение, которое Внутреннее устройство потоков Объект-нить имеет следующие атрибуты : Идентификатор клиента - уникальное значение, которое идентифицирует нить при ее обращении к серверу. Контекст нити - содержит текущее состояние регистров, стеков и индивидуальной области памяти, которая используется подсистемами и библиотеками. Динамический приоритет - значение приоритета нити в данный момент. Базовый приоритет - нижний предел динамического приоритета нити. Процессорная совместимость нитей - перечень типов процессоров, на которых может выполняться нить. Время выполнения нити - суммарное время выполнения нити в пользовательском режиме и в режиме ядра, накопленное за период существования нити. Состояние предупреждения - флаг, который показывает, что нить должна выполнять вызов асинхронной процедуры. Счетчик приостановок - текущее количество приостановок выполнения нити. 33 2/6/2018 1: 32: 35 PM

Планирование потоков Выбор текущего потока из нескольких активных потоков, пытающихся получить доступ к процессору Планирование потоков Выбор текущего потока из нескольких активных потоков, пытающихся получить доступ к процессору называется планированием. Выбранный для выполнения поток работает в течение некоего периода, называемого квантом, по истечении которого поток вытесняется. Предполагается, что поток не знает, в какой момент он будет вытеснен. Поток также может быть вытеснен даже, если его квант еще не истек. Процедура планирования обычно связана с весьма затратной процедурой диспетчеризации - переключением процессора на новый поток, поэтому планировщик должен заботиться об эффективном использовании процессора. Принадлежность потоков к процессу при планировании не учитывается, то есть единицей планирования в ОС Windows является именно поток. В ОС Windows запуск процедуры планирования вызывается одним из следующих событий. События, связанные с освобождением процессора: (1) Завершение потока (2) Переход потока в состояние готовности в связи с тем, что его квант времени истек (3) Переход потока в состояние ожидания События, в результате которых пополняется или может пополниться очередь потоков в состоянии готовности. (4) Поток вышел из состояния ожидания (5) Поток только что создан (6) Деятельность текущего потока может иметь следствием вывод другого потока из состояния ожидания. 34 2/6/2018 1: 32: 35 PM

Алгоритмы планирования потоков В ОС Windows реализовано вытесняющее приоритетное планирование, когда каждому потоку присваивается Алгоритмы планирования потоков В ОС Windows реализовано вытесняющее приоритетное планирование, когда каждому потоку присваивается определенное числовое значение - приоритет, в соответствии с которым ему выделяется процессор. Потоки с одинаковыми приоритетами планируются согласно алгоритму Round Robin (карусель). В системе предусмотрено 32 уровня приоритетов. Шестнадцать значений приоритетов (16 -31) соответствуют группе приоритетов реального времени, пятнадцать значений (1 -15) предназначены для обычных потоков, и значение 0 зарезервировано для системного потока обнуления страниц. 35 Класс приоритета для всех потоков конкретного процесса можно задать с помощью набора констант-параметров функции Set. Priority. Class, которые могут иметь следующие значения: • реального времени (REALTIME_PRIORITY_CLASS), • высокий (HIGH_PRIORITY_CLASS), • выше нормы (ABOVE_NORMAL_PRIORITY_CLASS), • нормальный (NORMAL_PRIORITY_CLASS), • ниже нормы (BELOW_NORMAL_PRIORITY_CLASS) 2/6/2018 1: 32: 35 PM • неработающий (IDLE_PRIORITY_CLASS).

Приоритеты потоков Пользовательские потоки работают с приоритетами от 1 до 15. Устанавливая 1) 2) Приоритеты потоков Пользовательские потоки работают с приоритетами от 1 до 15. Устанавливая 1) 2) 36 приоритеты процесса и потока, пользователь может отдавать преимущество тому или иному потоку. Нулевой поток работает в фоновом режиме и съедает все процессорное время, на которое больше никто не претендует. Его работа заключается в обнулении страниц для менеджера памяти. Если и у этого потока нет работы, работает пустой поток. Однако он не является полноценным потоком. Со временем для улучшения производительности системы в базовом алгоритме планирования было сделано несколько усовершенствований. При определенных условиях текущий приоритет пользовательского потока может быть поднят операционной системой выше базового приоритета, но никогда не может быть установлен выше приоритета 15. Для потоков с приоритетами 15 и выше никогда не делается никаких изменений приоритета. Приоритет потока увеличивается: Когда завершается операция ввода-вывода и освобождает ожидающий ее поток, приоритет потока увеличивается, чтобы дать шанс этому потоку быстрее запуститься и снова запустить операцию ввода-вывода. Суть в том, чтобы поддерживать занятость устройств ввода-вывода. Величина, на которую увеличивается приоритет, зависит от устройства ввода-вывода. Как правило, это 1 для диска, 2 для последовательной линии, 6 для клавиатуры и 8 для звуковой карты. Если поток ждал семафора, мьютекса или другого события, то когда он отпускается, к его приоритету прибавляется две единицы, если это поток переднего плана (то есть процесс, управляющий окном, которому в данный момент направляется ввод с клавиатуры), и одна единица в противном случае. 2/6/2018 1: 32: 36 PM

Приоритеты потоков Есть еще один случай, при котором система изменяет приоритеты потоков. Представьте, что Приоритеты потоков Есть еще один случай, при котором система изменяет приоритеты потоков. Представьте, что два потока работают вместе в задаче типа "производитель -потребитель". Работа производителя труднее, поэтому он получает более высокий приоритет, например 12, а потребитель получает приоритет 4. В определенный момент производитель заполняет до отказа общий буфер и блокируется на семафоре Прежде чем потребитель снова получит шанс поработать, посторонний процесс с приоритетом 8 приходит в состояние готовности и получает управление. Этот поток сможет работать столько, сколько захочет, так как его приоритет выше приоритета потребителя, а производитель, хоть и с большим приоритетом, заблокирован. При таких условиях производитель никогда снова не получит управления, пока поток с приоритетом 8 не остановится. 37 2/6/2018 1: 32: 36 PM

Приоритеты потоков В операционной системе Windows 2000 эта проблема решается при помощи большой кувалды. Приоритеты потоков В операционной системе Windows 2000 эта проблема решается при помощи большой кувалды. Система следит, сколько времени прошло с тех пор, когда готовый к работе поток запускался в последний раз. Если какой-либо поток превысит определенный интервал времени, он получает на два кванта времени приоритет 15. Это может помочь разблокировать производителя. После двух квантов прибавка приоритета резко убирается. Вероятно, лучшим решением было бы наказывать потоки, которые полностью используют свои кванты снова и снова. В конце концов, проблему создает не поток, умирающий от голода, а жадный поток. Эта проблема хорошо известна под названием инверсии приоритетов. Классы приоритетов процессов Критичный Самый Нормаль Выше нормы Ниже нормы ко времени высокий ный Самый низкий Неработающий 15 6 5 4 3 2 1 Ниже нормы 15 8 7 6 5 4 1 Нормальный 15 10 9 8 7 6 1 Выше нормы 15 12 11 10 9 8 1 Высокий 15 15 14 13 12 11 1 Реального времени 31 26 25 24 23 22 16 38 2/6/2018 1: 32: 36 PM