Разрешает ли какая-либо ОС перемещать память с одного адреса на другой, не копируя ее физически? - PullRequest
5 голосов
/ 23 декабря 2011

дубликат memcpy / memmove (копирование данных) из источника в место назначения. Существует ли что-либо для перемещения страниц с одного виртуального адреса на другой без фактической побайтной копии исходных данных? Мне кажется, это вполне возможно, но позволяет ли это какая-либо операционная система? Мне кажется странным, что динамические массивы являются настолько распространенным и популярным понятием, но выращивание их путем физического копирования является такой расточительной операцией. Он просто не масштабируется, когда вы начинаете говорить о размерах массива в гигабайтах (например, представьте, что массив 100 ГБ можно превратить в массив 200 ГБ. Это проблема, которая полностью возможна на серверах в диапазоне

void* very_large_buffer = VirtualAlloc(NULL, 2GB, MEM_COMMIT);
// Populate very_large_buffer, run out of space.
// Allocate buffer twice as large, but don't actually allocate 
// physical memory, just reserve the address space.
void* even_bigger_buffer = VirtualAlloc(NULL, 4GB, MEM_RESERVE);
// Remap the physical memory from very_large_buffer to even_bigger_buffer without copying
// (i.e. don't copy 2GB of data, just copy the mapping of virtual pages to physical pages)
// Does any OS provide support for an operation like this?    
MoveMemory(very_large_buffer, even_bigger_buffer, 2GB)
// Now very_large_buffer no longer has any physical memory pages associated with it
VirtualFree(very_large_buffer)

Ответы [ 4 ]

6 голосов
/ 23 декабря 2011

В некоторой степени вы можете сделать это с помощью mremap в Linux.

Этот вызов воспроизводит таблицу страниц процесса для перераспределения нулевой копии , если он может . Это возможно не во всех случаях (проблема заключается в фрагментации адресного пространства и просто наличии других существующих отображений).

Справочная страница на самом деле говорит это:

mremap () изменяет отображение между виртуальными адресами и страницами памяти. Это может быть использовано для реализации очень эффективного realloc (3).

2 голосов
/ 23 декабря 2011

Да, это обычное использование файлов, отображаемых в памяти, для «перемещения» или копирования памяти между процессами путем сопоставления различных представлений файла

1 голос
/ 24 декабря 2011

Каждая система POSIX способна сделать это. Если вы используете mmap с файловым дескриптором (полученным с помощью open или shm_open), а не анонимно, вы можете удалить его, затем обрезать (уменьшить или увеличить) и затем отобразить его снова. Вы можете и часто будете получать разные виртуальные адреса для одних и тех же страниц.

0 голосов
/ 23 декабря 2011

Я имею в виду, что вы никогда не сможете абсолютно гарантировать, что в следующих 100 ГБ не будет активной памяти, поэтому вы не сможете сделать ее непрерывной.

С другой стороны, выможет использовать рваный массив (массив массивов), где массивы не обязательно должны быть рядом друг с другом (или даже одного размера).Многие из преимуществ динамических массивов могут не масштабироваться до уровня 100 ГБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...