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

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

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)
5
задан Eloff 23 December 2011 в 17:17
поделиться