- •Процессы и задачи в Microsoft Windows
- •Запуск задач
- •Управление запущенными задачами
- •Изменение приоритета задачи
- •Определение приоритета задачи
- •Приостановка и возобновление выполнения задачи
- •Временная приостановка работы задачи
- •Завершение задачи
- •Освобождение идентификатора задачи
- •Критические секции
- •Инициализация критической секции
- •Удаление критической секции
- •Вход в критическую секцию и выход из нее
- •4. Контрольные вопросы
- •5. Содержание работы
- •Создание объекта - событие
- •Открытие объекта - событие
- •Управление состоянием объекта - событие
- •Объекты – событие с автосбросом
- •Создание объекта Mutex
- •Освобождение идентификатора объекта Mutex
- •Открытие объекта Mutex
- •Как завладеть объектом Mutex
- •Освобождение объекта Mutex
- •Как работает семафор
- •Функции для работы с семафорами
- •Создание семафора
- •Уничтожение семафора •
- •Увеличение значения счетчика семафора
- •Уменьшение значения счетчика семафора
- •Определение текущего значения счетчика семафора
- •Создание и открытие ожидаемого таймера
- •Функции для работы с ожидаемым таймером
- •Контрольные вопросы
- •Содержание работы
- •Содержание отчета
- •Теоретический материал
- •7.1. Универсальные функции для работы с файлами в операционных системах Microsoft Windows
- •Функция CreateFile
- •Функция CloseHandle
- •Функции ReadFile и WriteFile
- •Механизм отображения файлов на память
- •Создание отображения файла
- •Выполнение отображения файла в память
- •Открытие отображения
- •Отмена отображения файла
- •Принудительная запись измененных данных
- •Обмен через файлы, отображаемые на память
- •Пример приложения, использующего файлы, отображаемые на память
- •Именованные и анонимные каналы
- •Имена каналов
- •Реализации каналов
- •Создание канала
- •Установка соединения с каналом со стороны сервера
- •Пример приложения, использующего каналы передачи данных Pipes
- •Создание канала Mailslot
- •Открытие канала Mailslot
- •Запись сообщений в канал Mailslot
- •Чтение сообщений из канала Mailslot
- •Определение состояния канала Mailslot
- •Изменение состояния канала Mailslot
- •Пример приложения, использующего каналы передачи данных MailSlot
- •Пример приложения, использующего передачу сообщений между процессами
Выполнение отображения файла в память
Итак, мы выполнили первые два шага, необходимые для работы с файлом, отображаемым на память, - открывание файла функцией CreateFile и создание отображения функцией CreateFileMapping. Теперь, получив от функции CreateFileMapping идентификатор объекта-отображения, мы должны выполнить само отображение, вызвав для этого функцию MapViewOfFile или MapViewOfFileEx. В результате заданный фрагмент отображенного файла будет доступен в адресном пространстве процесса.
Прототип функции MapViewOfFile приведен ниже:
LPVOID MapViewOfFile ( |
|
|
|
HANDLE hFileMappingObject, |
// идентификатор отображения |
|
DWORD dwDesiredAccess, |
// режим доступа |
|
DWORD dwFileOffsetHigh, |
// смещение в файле (старшее слово) |
|
DWORD dwFileOffsetLow, |
// смещение в файле (младшее слово) |
|
DWORD dwNumberOfBytesToMap); |
// количество отображаемых байт |
Функция MapViewOfFile создает окно размером dwNumberOfBytesToMap байт, которое смещено относительно начала файла на количество байт, заданное параметрами dwFileOffsetHigh и dwFileOffsetLow. Если задать значение параметра dwNumberOfBytesToMap равное нулю, будет выполнено отображение всего файла.
Смещение нужно задавать таким образом, чтобы оно попадало на границу минимального пространства памяти, которое можно зарезервировать. Значение 64 Кбайта подходит в большинстве случаев.
Более точно гранулярность памяти можно определить при помощи функции GetSystemInfo. Этой функции в качестве единственного параметра необходимо передать указатель на структуру типа SYSTEM_INFO, определенную следующим образом:
typedef struct _SYSTEM_INFO
{
union {
DWORD dwOemId; // зарезервировано
struct
{
WORD wProcessorArchitecture; // архитектура системы
WORD wReserved; // зарезервировано
};
};
DWORD dwPageSize; // размер страниц
LPVOID lpMinimumApplicationAddress; // минимальный адрес,
// доступный приложениям и библиотекам DLL
LPVOID lpMaximumApplicationAddress; // максимальный адрес,
// доступный приложениям и библиотекам DLL
DWORD dwActiveProcessorMask; // маски процессоров
DWORD dwNumberOfProcessors; // количество процессоров
DWORD dwProcessorType; // тип процессора
DWORD dwAllocationGranularity; // гранулярность памяти
WORD wProcessorLevel; // уровень процессора
WORD wProcessorRevision; // модификация процессора
} SYSTEM_INFO;
Функция заполнит поля этой структуры различной информацией о системе. В частности, в поле dwAllocationGranularity будет записан минимальный размер резервируемой области памяти.
Вернемся к описанию функции MapViewOfFile.
Параметр dwDesiredAccess определяет требуемый режим доступа к отображению, то есть режимы доступа для страниц виртуальной памяти, используемых для отображения. Для этого параметра вы можете указать одно из следующих значений:
Значение |
Описание |
FILE_MAP_WRITE |
Доступ на запись и чтение. При создании отображения функции CreateFileMapping необходимо указать тип защиты PAGE_READWRITE |
FILE_MAP_READ |
Доступ только на чтение. При создании отображения необходимо указать тип защиты PAGE_READWRITE или PAGE_READ |
FILE_MAP_ALL_ACCESS |
Аналогично FILE_MAP_WRITE |
FILE_MAP_COPY |
Доступ для копирования при записи. При создании отображения необходимо указать атрибут PAGE_WRITECOPY |
В случае успешного выполнения отображения функция MapViewOfFile возвращает адрес отображенной области памяти. При ошибке возвращается значение NULL.
При необходимости приложение может запросить отображение в заранее выделенную область адресного пространства. Для этого следует воспользоваться функцией MapViewOfFileEx:
LPVOID MapViewOfFileEx ( |
|
|
|
HANDLE hFileMappingObject, |
// идентификатор отображения |
|
DWORD dwDesiredAccess, |
// режим доступа |
|
DWORD dwFileOffsetHigh, |
// смещение в файле (старшее слово) |
|
DWORD dwFileOffsetLow, |
// смещение в файле (младшее слово) |
|
DWORD dwNumberOfBytesToMap |
// количество отображаемых байт |
|
LPVOID lpBaseAddress); |
// предполагаемый адрес для отображения // файла |
Эта функция аналогична только что рассмотренной функции MapViewOfFile за исключением того, что она имеет еще один параметр lpBaseAddress - предполагаемый адрес для выполнения отображения.
Выполнение отображения с использованием функции MapViewOfFileEx используется в тех случаях, когда с помощью файла, отображаемого на память, организуется общая область памяти, доступная нескольким работающим параллельно процессам. При этом вы можете сделать так, что начальный адрес этой области будет одним и тем же для любого процесса, работающего с данным отображением.
Заметим, что функция MapViewOfFileEx сама выполняет резервирование адресов, поэтому вы не должны передавать ей адрес области памяти, полученный от функции VirtualAlloc. Еще одно ограничение заключается в том, что адрес, указанный через параметр lpBaseAddress, должен находиться на границе гранулярности памяти.
Приложение может создавать несколько отображений для разных или одинаковых фрагментов одного и того же файла.
