Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Как получить карту памяти любого процесса
Для получения карты памяти любого процесса можно использовать следующий алгоритм: 1. С помощью функций Process32First и Process32Next получить список всех процессов в системе, запоминая их идентификаторы; 2. Выбрать из списка интересующий вас процесс; 3. Зная идентификатор процесса получить дескриптор процесса с помощью функции Open Process; 4. Зная дескриптор процесса можно получить карту памяти, используя функцию VirtualQueryEx, которая описана в лабораторной работе № 2.
Функция Open Process имеет следующий вид: function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD):THANDLE; где dwDesiredAccess – определяет вид доступа к данному объекту. Возможные значения параметра dwDesiredAccess приведены в таблице 6.7; bInheritHandle – флаг определяет, может ли полученный дескриптор использоваться дочерними процессами. Если bInheritHandle установить в TRUE, то дескриптор является наследуемым; dwProcessId – идентификатор процесса. При успешном выполнении функция OpenProcess возвращает дескриптор процесса.
Таблица 6.7 Возможные значения параметра dwDesiredAccess
Продолжение таблицы 6.7
Пример использования функций ToolHelp
Пример приложения, использующего функции ToolHelp приведен на рисунке 6.1. Данное приложение выводит на экран список всех процессов и список всех модулей в системе. Для создания данного приложения выполните следующие действия: 1. Перенесите на форму компоненты, перечисленные в таблице 6.8.
Таблица 6.8 Компоненты создаваемого приложения
2. В блок Uses включите файл tlhelp32: uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Buttons,tlhelp32;
3. В блок var добавьте список глобальных переменных: var Form1: TForm1; pe32:tProcessEntry32; me32:tModuleEntry32; hProcess:THandle;
4. Для события формы OnCreate запишите следующий программный код: procedure TForm1.FormCreate(Sender: TObject); VAR x,code:Integer; s:String; begin StringGrid1.Cells[0,0]:='№'; StringGrid1.Cells[1,0]:='Имя файла'; StringGrid1.Cells[2,0]:='Идентификатор процесса'; StringGrid1.Cells[3,0]:='Количество потоков'; StringGrid1.Cells[4,0]:='Базовый приоритет'; pe32.dwSize:=SizeOf(tProcessEntry32); x:=1; hProcess:=CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS,0); Process32First(hProcess,pe32); { str(pe32.th32ProcessID,StringGrid1.Cells[2,x]); val(StringGrid1.Cells[2,x],pe32.th32ProcessID,code);} str(pe32.th32ProcessID,s); val(s,pe32.th32ProcessID,code); Repeat StringGrid1.Cells[0,x]:=IntToStr(x); StringGrid1.Cells[1,x]:=pe32.szExeFile; StringGrid1.Cells[2,x]:=IntToStr(pe32.th32ProcessID); StringGrid1.Cells[3,x]:=IntToStr(pe32.cntThreads); StringGrid1.Cells[4,x]:=IntToStr(pe32.pcpriClassBase); x:=x+1; StringGrid1.RowCount:=x; until Process32Next(hProcess,pe32)=False; end; Данный программный код выводит на экран при запуске приложения список процессов в системе. 5. Для события OnClick кнопки Button1 запишите следующий программный код: procedure TForm1.Button1Click(Sender: TObject); begin Form1.Close; end; Данный программный код выполняет закрытие формы.
6. Для события OnClick кнопки Button2 запишите следующий программный код: procedure TForm1.Button2Click(Sender: TObject);
begin Form1.OnCreate(Sender); end; Данный программный код выводит на экран список процессов в системе. Для события OnClick кнопки Button33 запишите следующий программный код: procedure TForm1.Button3Click(Sender: TObject); VAR x:Integer; begin If Button3.Caption='Модули' then begin Button3.Caption:='Процессы'; Closehandle(hProcess); x:=1; StringGrid1.Cells[0,0]:='№'; StringGrid1.Cells[1,0]:='Модули'; StringGrid1.Cells[2,0]:=''; StringGrid1.Cells[3,0]:=''; StringGrid1.Cells[4,0]:=''; StringGrid1.Cells[5,0]:=''; StringGrid1.ColCount:=2; me32.dwSize:=SizeOf(tModuleEntry32); hProcess:=CreateToolhelp32SnapShot(TH32CS_SNAPMODULE,0); Module32First(hProcess,me32); Repeat StringGrid1.Cells[1,x]:=me32.szModule; x:=x+1; StringGrid1.RowCount:=x; until Module32Next(hProcess,me32)=False; end else begin StringGrid1.ColCount:=6; StringGrid1.ColWidths[1]:=250; Button3.Caption:='Модули'; Form1.OnCreate(Sender); end; end; 7. Откомпилируйте разработанное приложение.
6.4. Задания для самостоятельной работы 1. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать список модулей, используемых данным процессом. 2. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать список потоков данного процесса. 3. Программа, формирующая список всех потоков, выполняющихся на данном компьютере и позволяющая определить имя процесса, которому принадлежит данный поток. 4. Программа, формирующая список всех загруженных модулей и позволяющая определить для каждого модуля процессы, использующие данный модуль. 5. Программа, позволяющая получить информацию о кучах выбранного процесса: сколько куч, их размеры, процент заполнения и т.д. 6. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать содержимое любого блока памяти выбранного процесса (данные выводятся в символьной форме). 7. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать адресное пространство выбранного процесса. 8. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и подсчитывающая информацию о количестве зарезервированных страниц каждого процесса. 9. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и подсчитывающая информацию о количестве выделенных страниц каждого процесса. 10. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и подсчитывающая информацию о количестве регионов в адресном пространстве каждого процесса. 11. Программа, которая выводит на экран список всех процессов и наименования родительских процессов для каждого процесса. 12. Программа, которая выводит на экран список всех процессов и наименования дочерних процессов для каждого процесса. 13. Программа, формирующая список всех модулей системы, размер каждого модуля в байтах и суммарный размер всех модулей. 14. Программа, формирующая список всех процессов, выполняющихся на данном компьютере, которые имеют один поток, и позволяющая просматривать список модулей, используемых данным процессом. 15. Программа, формирующая список трех процессов, выполняющихся на данном компьютере и имеющих самое большое количество потоков (в порядке убывания количества потоков) и идентификаторы всех потоков для каждого процесса. 16. Программа, определяющая, какой модуль используется наиболее часто (наибольшим числом процессов).
17. Программа, формирующая список всех процессов в системе, в порядке убывания приоритета. 18. Программа, выполняющая вывод всех модулей в системе и осуществляющая контекстный поиск модуля по имени. 19. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать содержимое любого блока памяти выбранного процесса (данные выводятся в шестнадцатеричном формате). 20. Программа, формирующая список всех процессов, выполняющихся на данном компьютере и позволяющая просматривать содержимое любого блока памяти выбранного процесса (на экран выводятся коды символов).
КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Как получить информацию о всех загруженных процессах? 2. Как получить карту памяти любого процесса? 3. Как получить список потоков выбранного процесса? 4. Как получить список всех блоков выбранной кучи? 5. Как получить список модулей, принадлежащих конкретному процессу? 6. Как получить список всех модулей системы?
ЛАБОРАТОРНАЯ РАБОТА № 7 ОБЪЕКТЫ СИНХРОНИЗАЦИИ Цель работы Целью данной работы является исследование объектов синхронизации, с помощью которых в многозадачной среде обеспечивается последовательный доступ к совместно используемым ресурсам. В данной работе рассматриваются следующие вопросы: · Синхронизация потоков с помощью объектов пользовательского режима (критические секции); · Синхронизация потоков с помощью объектов ядра (объекты Mutex, события, семафоры, процессы и потоки); · Работа Wait- функций в различных режимах. Теоретическое введение Критические секции Критическая секция — это небольшой участок кода, требующий монопольного доступа к каким-то общим данным. Она позволяет сделать так, чтобы единовременно только один поток получал доступ к определенному ресурсу. Ни один из потоков, которым нужен занятый ресурс, не получит процессорное время до тех пор, пока поток, захвативший критическую секцию, не выйдет за ее границы. При работе с критическими секциями выполняются следующие действия: 1. Создается экземпляр структуры CRITICAL_SECTION. Например: VAR cs:TRTLCriticalSection; 2. Инициализируется критическая секция. Сделать это надо до обращения какого-либо потока к защищенному ресурсу. Критическая секция инициализируется вызовом процедуры InitializeCriticalSection: procedure InitializeCriticalSection(var lpCriticalSection: TRTLCriticalSection); где lpCriticalSection - адрес структуры CRITICAL_SECTION.
3. При обращении к разделяемому ресурсу, вызывается процедура EnterCriticaSecton: procedure EnterCriticalSection(var lpCriticalSection: TRTLCriticalSection); где lpCriticalSection – адрес структуры CRITICAL_SECTION. Процедура EnterCriticalSection допустит выполнение вызвавшего ее потока, если определит, что критическая секция свободна. В ином случае EnterCriticalSection заставит поток ждать, пока критическая секция не освободится. Процедура EnterCriticalSection занимает критическую секцию. 4. Поток, покидая участок кода, где он работал с защищенным ресурсом, должен вызвать процедуру LeaveCriticalSection. Тем самым поток уведомляет систему о том, что разделяемый ресурс освободился. Прцедура LeaveCriticalSection имеет вид: procedure LeaveCriticalSection(var lpCriticalSection: TRTLCriticalSection); где lpCriticalSection – адрес структуры CRITICAL_SECTION. 5. Если структура CRITICAL_SECTION больше не понадобится ни одному потоку, ее следует удалить, вызвав процедуру DeleteCriticalSection: procedure DeleteCriticalSection(var lpCriticalSection: TRTLCriticalSection); где lpCriticalSection – адрес структуры CRITICAL_SECTION.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-06; просмотров: 480; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.222.12 (0.038 с.) |