- •1) Назначение операционной системы
- •7) Контекст потока
- •13) Завершение потоков
- •19) Наследование дескрипторов
- •25). Аппаратная реализация синхронизации
- •31) Семафоры
- •37)Работа с анонимными каналами в Windows
- •43)Финальная обработка исключений
- •49) Распределение и освобождение памяти из кучи
- •55) Концепция механизма отображения файлов в память
49) Распределение и освобождение памяти из кучи
Для распределения памяти из кучи используется функция неарАНос, которая имеет следующий прототип:
LPVOID HeapAlloc(
HANDLE hHeap, // дескриптор кучи
DWORD dwFlags, // управляющие флаги
SIZE_T dwBytes // размер распределяемой памяти) ;
В случае успешного завершения эта функция возвращает адрес распределенной памяти, а в случае неудачи возможны два варианта работы функции. Если флаг HEAP_GENERATE_EXCEPTIONS Не установлен, ТО функция HeapAlloc в случае неудачи возвращает значение null. Если же этот флаг установлен, то в случае неудачи эта функция генерирует одно из следующих исключений:
□ sтatus_no_memory — не хватает памяти или повреждение кучи;
□ s т atu s_ac с es s_v I ol at I on — повреждение кучи или неправильные параметры функции.
Теперь кратко опишем назначение параметров этой функции. В параметре ьнеар должен быть установлен дескриптор кучи, из которой распределяется память.
Параметр dwFlags управляет режимом работы функции и может быть установлен в любую комбинацию из следующих управляющих флагов:
□ нЕAP_GENERATЕ_ЕХСЕРтIONS — в случае неудачи функция сгенерирует ис-ключение;
□ heap_no_s er I al i z е — нет взаимного исключения при доступе к куче;
□ HEAP_ZERO_MEMORY — распределенная память инициализируется нулями.
Параметр dwBytes задает в байтах размер памяти, которая будет распределена из кучи.
Распределение и освобождение памяти из кучи процесса
# include <windows.h>
#include <iostream.h>
int main(){
HANDLE hHeap;
int *a = NULL;
int size = 1000;
hHeap = GetProcessHeap(); if (!hHeap){
cout « «Heap create failed.» « endl; return GetLastError();}
а = (int*)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, size * sizeof(int));
cout « «а[10] = « « а[10] « endl;
if (IHeapFrее(hHeap, NULL, а)){
cout « «Heap free failed.» « endl;
return GetLastError();}
return 0;}
55) Концепция механизма отображения файлов в память
Прежде чем перейти к описанию динамически подключаемых библиотек, рассмотрим механизм, который позволяет динамически выполнять это подключение. Этот механизм называется отображением содержимого файла (file mapping) в виртуальную память процесса.В операционных системах Windows реализован механизм, который позволяет отображать в адресное пространство процесса не только содержимое файлов подкачки, но и содержимое обычных файлов. То есть в этом случае файл или его часть рассматривается как набор виртуальных страниц процесса, которые имеют последовательные логические адреса. Файл, отображенный в адресное пространство процесса, называется представлением или видом файла (file view). После отображения файла в адресное пространство процесса доступ к виду может осуществляться с помощью указателя, как к обычным данным в адресном пространстве процесса.То есть для доступа к файлу, который отображен в память, не используется функция writeFiie. Такая согласованность данных, хранящихся в файле, отображенном в память несколькими процессами, называется когерентностью данных. Однако следует отметить, что когерентность данных для файла, отображенного в память, не поддерживается в том случае, если этот файл отображается в адресное пространство процессов, которые выполняются на других компьютерах в локальной сети.
Теперь кратко опишем общую последовательность действий, которые необходимо выполнить для работы с отображаемым в память файлом. Эти действия могут быть разбиты на следующие шаги:
□ открыть файл, который будет отображаться в память;
□ создать объект ядра, который выполняет отображение файла;
□ отобразить файл или его часть в адресное пространство процесса;
□ выполнить необходимую работу с видом файла;
□ отменить отображение файла;
□ закрыть объект ядра для отображения файла;
□ закрыть файл, который отображался в память.
