Шаг 127 - Использование исключений для выделения страниц виртуальной памяти

www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Идея использования исключений для выделения страниц виртуальной памяти простая. Сначала резервируются страницы. По мере обращения эти страницы заполнятся и к ним есть доступ. Смотрим пример.

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

struct MemItem
{
	int a;
};

// указатель на резервируемую память
int* m_pVirtualAlloc;
// размер структуры
const sizestruct=sizeof(MemItem);

void Access(int index,int data);
void Printdata(int index);

void main()
{
// выделение памяти
m_pVirtualAlloc=(int*)VirtualAlloc(NULL/*ОС выберет начало*/, sizestruct*2500/*для  структур*/,
			   MEM_RESERVE/*резервирование*/,PAGE_NOACCESS/*без доступа*/);
// проверка инициализации
if (m_pVirtualAlloc!=NULL)
{
	// доступ
	Access(1,10);
	Printdata(1);
	Access(1,20);
	Printdata(1);
	Access(2000,12);
	cout << "finish" << endl;
	Printdata(1);
	Printdata(2000);
	// освободить
	VirtualFree(m_pVirtualAlloc,0,MEM_RELEASE);
}
else cout << "Error Alloc" << endl;
}

void Access(int index,int data)
{
	__try
	{
		MemItem* mi=(MemItem*)m_pVirtualAlloc+index*sizestruct;
		mi->a=data;
	}
	__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
	{
		cout << "Not Access" << endl;
		VirtualAlloc(m_pVirtualAlloc+index*sizestruct,sizestruct,MEM_COMMIT,PAGE_READWRITE);
		MemItem* mi=(MemItem*)m_pVirtualAlloc+index*sizestruct;
		mi->a=data;
	}
}

void Printdata(int index)
{
__try
	{
		MemItem* mi=(MemItem*)m_pVirtualAlloc+index*sizestruct;
		cout << mi->a << endl;
	}
	__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
	{
		cout << "Not Print" << endl;
		
	}
}

Если при попытки обращения к странице получаем EXCEPTION_ACCESS_VIOLATION то ее нужно заполнить. Дальше обращения к ней будут нормальные. Данное исключение будет сгенерированно только один раз. Использовать данный пример можно было например для заполнения памяти из файла по мере обращения к данным или для заполнения массива.

Смотрим результат.

Not Access
10
20
Not Access
finish
20
12
Press any key to continue

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление

Автор Каев Артем.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz