Несмотря на продолжено Interest, по-прежнему нет возможности создать« коровью копию » области памяти в Linux. С появлением системного вызова memfd_create(2)
ситуация несколько улучшилась, поскольку больше не нужно создавать явный файл для разделяемой памяти.
Мне интересно, почему нет такой вещи, как следующее?
void *ptr = mmap((void *)0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, (size_t)0);
void *ptr2= mremap(ptr, 0, size, MREMAP_MAYMOVE | MREMAP_COW);
Предполагаемая семантика состоит в том, что ptr2
и ptr
совместно используют базовую память, но запись из любого из них вызовет копирование при записи с детализацией по страницам.
Это просто случай, когда «никто еще не позаботился об этом реализовать» или я упускаю что-то техническое?
memfd_create()
вы можете в точности достичь того, чего хотите, это очень чистый интерфейс с интуитивно понятной семантикой, на мой взгляд. Что у вас с этим не получается? - person Ctx   schedule 28.02.2017memfd_create
до сих пор. Но он имеет странную семантику и не позволяет сделать копию копии без создания еще одного файла. - person Fabian Klötzl   schedule 28.02.2017read()/write()
-вызовами. Или вы можете создать общее сопоставление для заполнения памяти, отменить сопоставление и сделать два частных сопоставления. - person Ctx   schedule 28.02.2017mmap()
собственного адресного пространства процесса?int fd = open( "/proc/self/as", O_RDWR ); void *ptr = mmap( 0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset );
Я подозреваю, чтоoffset
- это адрес области памяти, для которой вы хотите создать копию COW. - person Andrew Henle   schedule 28.02.2017fork
, но просто нет возможности явно вызвать ее‽ - person Fabian Klötzl   schedule 28.02.2017