Миф: без опции /3GB отдельная программа не может выделить более 2Гб виртуальной памяти.


После небольшого перерыва, вызванного моим отпуском, блог продолжает свою работу.

Перевод с блога The Old New Thing. Оригинал здесь.

Виртуальная память — это НЕ виртуальное адресное пространство.

Виртуальное адресное пространство в режиме пользователя обычно имеет размер 2Гб, но это не ограничивает вас двумя гигабайтами виртуальной памяти. Вы можете выделить память без отображения в ваше виртуальное адресное пространство. (Те, кто вырос на Expanded Memory или других формах памяти, организованной в банки, хорошо знакомы с таким приемом.)

HANDLE h = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 1, 0, NULL);

Предполагается, что у вас достаточно физической памяти и/или места в файле подкачки, чтобы выделить 4Гб.

Конечно, вы не сможете отобразить все это в память на 32-битной машине, но вы можете сделать это по частям. Давайте прочитаем один байт из этой памяти.

BYTE ReadByte(HANDLE h, DWORD offset)

{

     SYSTEM_INFO si;

     GetSystemInfo(&si);

     DWORD chunkOffset = offset % si.dwAllocationGranularity;

     DWORD chunkStart = offset — chunkOffset;

     LPBYTE pb = (LPBYTE*)MapViewOfFile(h, FILE_MAP_READ, 0,

          chunkStart, chunkOffset + sizeof(BYTE));

     BYTE b = pb[chunkOffset];

     UnmapViewOfFile(pb);

      return b;

}

Конечно, в реальной программе, вы еще должны реализовать проверку ошибок и, возможно, кеширующий слой, чтобы избежать потерь времени на постоянное переключение отображений вместо того, чтобы заниматься делом.

Дело в том, что виртуальное адресное пространство – это не виртуальная память. Мы видели ранее, что можно отобразить одну и ту же память одновременно по нескольким адресам, так что соответствие один-к-одному между виртуальной памятью и виртуальным адресным пространством уже было нарушено. Здесь же мы увидели, что само выделение памяти еще не означает, что будет занято все адресное пространство.

Реклама
Запись опубликована в рубрике память. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s