
- •Кафедра "Вычислительная техника" системное программное обеспечение
- •Монитор процессов и потоков
- •1.1 Получение списка процессов, выполняющихся в системе
- •1.1.1 Использование функций CreateToolHelp32Snapshot () и Process32xxxx() для получения списка имен процессов
- •Значения флагов функции CreateToolhelp32Snapshot
- •1.1.2 Использование функций CreateToolhelp32Snapshot () и Thread32xxxx() для получения сведений о приоритетах потоков процессов
- •1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx() для получения списка модулей
- •1.2. Завершение выбранного процесса
- •Некоторые значения первого параметра функции OpenProcess()
- •1.3. Получение дополнительной информации о процессах и потоках
- •1.3.4 Оценка загрузки процессора процессом с использованием счетчиков производительности
- •2. Методика выполнения
- •2.3. Выполнить индивидуальное задание 1 согласно таблице 3.
- •2.4. Выполнить индивидуальное задание 2 согласно таблице 4.
- •Варианты индивидуального задания 1 для бригад
- •Варианты индивидуального задания 2 для бригад
- •Контрольные вопросы
- •Лабораторная работа № 2
- •1. Краткие теоретические сведения
- •1.3 Методика исследования алгоритма диспетчеризации потоков
- •2. Методика выполнения
- •3. Отчет о работе
- •4. Контрольные вопросы
- •Лабораторная работа № 3
- •1. Краткие теоретические сведения
- •1.4 События
- •2. Методика выполнения
- •Индивидуальные задания для бригад
- •Отчет о работе
- •4. Контрольные вопросы
- •Лабораторная работа № 4
- •1 Краткие теоретические сведения
- •1.1 Механизмы управления виртуальной памятью
- •1.2 Функции и структуры данных, используемые для управления виртуальной памятью
- •Назначение полей этой структуры memorystatus
- •VirtualAlloc (null, 100*1024, mem_reserve | mem_commit, page_readwrite);
- •1.3 Кучи
- •1. Краткие теоретические сведения
- •2. Выполнение работы
- •3. Отчет о работе
- •2. Методика выполнения
- •3. Отчет о работе
- •4. Контрольные вопросы
- •Динамически загружаемые библиотеки (dll)
- •1. Краткие теоретические сведения dll и их роль в Win32
- •Создание проекта dll
- •Пример написания dll файла
- •Вызов функций из dll
- •Подключение dll файла в Visual Studio
- •Экспортирование
- •Загрузка dll
- •2. Методика выполнения
- •3. Отчет о работе
- •Контрольные вопросы
- •1. Краткие теоретические сведения
- •2. Методика выполнения
- •Контрольные вопросы:
- •Драйверы режима ядра
- •1. Краткие теоретические сведения
- •1.1 Структура драйвера
- •1.2 Инсталляция драйвера
- •1.3 Тестирование драйвера
- •2. Методика выполнения
- •3. Отчет о работе
- •4. Контрольные вопросы
- •443100, Г. Самара, ул. Молодогвардейская, 244. Главный корпус
1. Краткие теоретические сведения
Как и виртуальная память, проецируемые файлы позволяют резервировать регион адресного пространства и передавать ему физическую память. При использовании проецируемых файлов физическая память не выделяется из системного страничного файла, а берется из файла, уже находящегося на диске. Как только файл спроецирован в память, к нему можно обращаться так, будто он целиком в нее загружен. Описанный механизм управления памятью применяется для:
загрузки и исполнения EXE- и DLL-файлов. Это позволяет существенно экономить как на размере страничного файла, так и на времени, необходимом системе для подготовки приложения к исполнению;
доступа к файлу данных, размещенному на диске. Это позволяет обойтись без операций файлового ввода/вывода и буферизации содержимого файла - не нужно выделять память под буфер, загружать данные из файла в память;
обеспечения совместного доступа разных процессов к общим данным.
Подготовка к использованию файлов, проецируемых в память.
Для этого нужно выполнить три операции:
Создать или открыть объект ядра "файл".
Создать объект ядра "проецируемый файл", чтобы сообщить системе размер файла и способ доступа к нему.
Указать системе, как спроецировать в адресное пространство процесса созданный в п.2 объект - целиком или только его часть.
Для завершения работы с файлом, проецируемым в память, следует выполнить три операции:
Сообщить системе об отмене проецирования на адресное пространство процесса объекта ядра "проецируемый файл".
Закрыть этот объект.
Закрыть объект ядра "файл".
Пример 1. Чтение содержимого текстового файла
1 этап – создание или открытие файла
var Hfile : Thandle;
hMapping : Thandle;
HighSize : Dword;
Data : Pointer;
Hfile := CreateFile ( Pchar (FileName),
Generic_Read, // способ доступа
File_Share_Read,
nil, // атрибут защиты
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN, // способ чтения
0 );
if ( Hfile =0 ) then exit; // делать больше нечего
2 этап – создание объекта проецируемый файл
hMapping := CreateFileMapping (hFile,
nil,
PAGE_READONLY,
0,0, // старшие и младшие разряды максимального размера
// файла - для существующего файла размер известен и не указывается
nil );
CloseHandle (Hfile);
if hMapping=0 then exit;
этап – проецирование данных на адресное пространство процесса
Data := MapViewOfFile (hMapping,
FILE_MAP_READ, // доступ WRITE, ALL_ACCESS
0, // смещение
0, // от начала файла оконного представления
0 ); // размер окна 0 – весь файл
// Переслать данные в компонент Memo1
memo1.SetTextBuf(data);
ДАННЫЕ ФАЙЛА ПОЯВИЛИСЬ НА ЭКРАНЕ, хотя считывания файла в явном виде не было !
Завершение работы с файлом
1 этап - отсоединение данных от адресного пространства процесса
Выполняется функцией UnmapViewOfFile (Data)
Для записи изменений, выполненных в памяти, в дисковое представление файла используется функция FlushViewOfFile (data, количество_байтов)
2 и 3 этапы. Выполняется закрытие объектов "проецируемый файл" и "файл" с помощью функции CloseHandle().
Пример 2. Проецирование непосредственно на физическую память из страничного файла для создания приложения, допускающего запуск единственной копии.
Для передачи данных между процессами можно использовать проецирование непосредственно на физическую память из системного страничного файла (соответствующий пример приведен в работе " Средства обмена данными между приложениями "). Этап 1 (создание файла) не выполняется, в параметре Hfile функции CreateFileMapping передается $FFFFFFFF. Создаваемый этой функцией именованный объект должен быть уникальным в системе. Это обстоятельство дает возможность создавать приложения с возможностью запуска единственной копии.
program Project1;
uses
Forms, windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
var un:Thandle;
begin
un:=CreateFileMapping($FFFFFFFF,nil,Page_ReadOnly,0,32,'Myapp');
if GetLasterror = ERROR_Already_Exists
then
begin
// ShowMessage('2');
halt;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
В приведенном примере блок совместно используемой памяти выделяется в системном страничном файле (на это указывает первый параметр функции CreateFileMapping). Если при создании блока будет получен код ошибки ERROR_Already_Exists, это свидетельствует о наличии работающей копии приложения. В этом случае приложение завершается, в противном случае процесс инициализации продолжается.