
- •1.1 Основы программирования в операционной системе Windows
- •1.1.1 Вызов функций api
- •1.1.2 Структура программы
- •1.2 Вопросы системного программирования в Windows
- •1.2.1 Страничная и сегментная адресация.
- •1.2.2 Адресное пространство процесса.
- •2.1 Управление процессами
- •2.2 Процессы и потоки в Windows
- •2.3 Создание процессов
- •2.4 Определение исполняемого образа и командной строки
- •2.5 Идентификация процессов
- •3.1 Создание потока. Функция CreateThread
- •3.2. Завершение потока
- •3.3 Другие функции работы с потоками
- •3.4 Структура context
- •3.5 Приоритеты потоков
- •4.1 Объект critical_section
- •4.2 Мьютексы
- •4.3 Семафоры
- •5.1 События
- •7.1 Кучи
- •7.2 Управление памятью кучи
- •Другие функции для работы с кучей
- •Резюме по управлению кучей
- •Отображение адресного пространства процесса в объекты отображения
- •Что такое импорт
- •Явная загрузка dll
- •Явное подключение экспортируемого идентификатора
- •10.1 Управление файлами и каталогами Создание и открытие файлов
- •10.2 Управление каталогами
- •10.3 Другие методы получения атрибутов файлов и каталогов
- •11.1 Блокировка файлов
- •11.2 Реестр
- •12.1 Стандартные устройства и консольный ввод-вывод
- •12.2 Асинхронный ввод-вывод и порты завершения
- •Параметры
- •Цели системы безопасности
- •Параметры
- •Аварийное завершение
- •Использование именованных каналов
- •Параметры
- •Наблюдение за сообщениями в именованном канале
- •Параметры
Другие функции для работы с кучей
Функция HeapCompact делает попытку объединения, или дефрагментации, смежных свободных блоков в куче; HeapValidate пробует определить повреждение кучи; HeapWalk перебирает блоки в куче, а GetProcessHeap получает все дескрипторы кучи, действительные для данного процесса.
Функции HeapLock и HeapUnlock позволяют потоку упорядочить доступ к куче.
Резюме по управлению кучей
Обычная последовательность действий при работе с кучей такова.
Получить дескриптор кучи с помощью функций CreateHeap или GetProcessHeap
Выделить блоки в куче, используя HeapAlloc.
3. По необходимости освободить все или некоторые блоки функцией HeapFree.
4. Уничтожить кучу и закрыть дескриптор функцией HeapDestroy.
Лекция 8. Тема: Отображаемые в память файлы
Динамическая память для кучи должна физически резервироваться в файле подкачки. Часть операционной системы, управляющая памятью, регулирует перемещение страниц между физической памятью и файлом подкачки, а также отображает в него виртуальное адресное пространство процесса. Когда процесс завершается, физическое пространство в файле освобождается.
Возможность отображения файлов в память Win32 также применима и для отображения в память обычных файлов. При этом проявляется ряд преимуществ.
• Нет необходимости выполнять прямой ввод-вывод из файла (запись и чтение).
• Структуры данных, созданные в памяти, могут быть сохранены в файле для дальнейшего использования в той же или другой программе. Будьте осторожны при использовании указателей.
• Удобные и эффективные алгоритмы для работы в памяти (сортировка, деревья поиска, обработка строк и т.д.) могут обрабатывать данные файла, даже если его размер намного превышает объем доступной физической памяти. При этом в случае больших файлов быстродействие будет определяться характером подкачки страниц.
• В некоторых случаях может быть значительно повышена производительность обработки файлов.
• Отсутствует потребность в уцравлении буферами и данными файла, которые они содержат. Эту работу эффективно и надежно выполняет операционная система.
• Несколько процессов могут совместно использовать одну область памяти, отображая свои виртуальные адресные пространства в один файл или в файл подкачки (межпроцессное разделение памяти — главная предпосылка для отображения в файл подкачки).
• Нет необходимости расходовать пространство файла подкачки.
Сама операционная система использует отображение в память для реализации библиотек динамической компоновки (DLLs), а также для загрузки исполняемых (.ехе) файлов и их выполнения.
Объекты отображения файлов
Первый этап — создание для открытого файла объекта отображения файла, который имеет дескриптор, и последующее отображение адресного пространства процесса на весь файл или на его часть. Объекты отображения файлов могут получать имена, поэтому они доступны другим процессам для разделения памяти. Также отображаемый объект имеет защиту, атрибуты безопасности и размер.
HANDLE CreateFileMapping ( HANDLE hFile,
LPSECURITY_ATTRIBUTES lpsa, DWORD fdwProtect,
DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow,
LPCTSTR lpszMapName)
Возвращаемое значение: дескриптор отображения файла или NULL при неудаче.
hFile — дескриптор открытого файла с флагами защиты, совместимыми с параметром fdwProtect. Значение (типа HANDLE) 0xFFFFFFFF (эквивалентно константе INVALID_HANDLE_VALUE) указывает на файл подкачки, и вы можете использовать это значение для межпроцессного разделения памяти без создания отдельного файла.
Тип LPSECURITY_ATTRIBUTES позволяет защитить объект отображения. Параметр определяет доступ к отображенному файлу с помощью описанных ниже флагов. Для специальных целей разрешены дополнительные флаги; например, флаг SEC_IMAGE определяет исполняемый образ (подробнее это описано во встроенной документации).
• Установленный флаг PAGE_READONLY означает, что программа может только читать страницы в отображенной области и не может записывать или исполнять их. Файл hFile должен быть открыт с правом доступа GENERIC_READ.
• Флаг PAGE_READWRITE предоставляет полный доступ к объекту, если файл hFile открыт с правами доступа GENERIC_READ и GENERIC_WRITE.
• Флаг PAGE_WRITECOPY определяет, что при изменении содержимого отображенной памяти собственная (для данного процесса) копия записывается в файл подкачки, а не в исходный файл. Отладчик может использовать этот флаг при определении точек останова в разделяемом коде. Результат будет различным в Windows 2000/NT и Windows 9x
Параметры dwMaximumSizeHigh и dwMaximumSizeLow определяют размер объекта отображения. Если указан нуль, используется текущий размер; обязательно определяйте размер при использовании файла подкачки. Если ожидается, что размер файла увеличится, используйте ожидаемый размер, и при необходимости будет немедленно установлен нужный размер файла. Не отображайте область файла за указанной границей — объект отображения не может расти.
lpszMapName указывает имя объекта отображения, что позволяет другим процессам совместно использовать объект. Регистр символов в имени не учитывается. Если разделение памяти не используется, указывайте значение null.
Об ошибке сообщает возвращаемое значение null (a не INVALID_HANDLE_VALUE).
Указав имя существующего объекта отображения, можно получить дескриптор отображения файла. Имя должно быть получено предшествующим вызовом функции CreateFileMapping. Два процесса могут совместно использовать память, разделяя отображение файла. Первый процесс создает отображение файла, а следующий открывает это отображение, используя имя. Если названного объекта не существует, открыть его не удастся..
HANDLE OpenFileMapping ( DWORD dwDesiredAccess,
BOOL bInheritHandle, LPCTSTR lpName);
Возвращаемое значение: дескриптор отображения файла или null при неудаче.
dwDesiredAccess использует тот же набор флагов, что и параметр функции CreateFileMapping. Значение lpName — имя, полученное вызовом функции CreateFileMapping. Параметр blnheritHandle - наследование дескриптора.
Функция CloseHandle, как и ожидалось, уничтожает дескрипторы отображения.