¿Hay una diferencia entre mmap MAP_SHARED y MAP_PRIVATE cuando también se usa PROT_READ?
linux linux-kernel (2)
Si creo un mmap(2)
de un archivo con un parámetro prot
de PROT_READ
y el archivo de respaldo también es de solo lectura y no cambia, ¿hay alguna diferencia de rendimiento (o alguna diferencia) entre MAP_SHARED
y MAP_PRIVATE
? ¿El kernel hará algo diferente entre los dos?
(La documentación solo se refiere a la diferencia de comportamiento en términos de "actualizaciones", pero como es PROT_READ
no puede haber actualizaciones. Me pregunto si hay alguna otra diferencia.)
Bajo MAP_PRIVATE
, la página de MAP_PRIVATE
Linux dice que no se especifica si los cambios realizados en el archivo después de la llamada mmap () son visibles en la región asignada. Ese no es el caso con MAP_SHARED
. Entonces, si necesita que el contenido de la asignación se actualice junto con el contenido del archivo, MAP_SHARED
mejor que use MAP_SHARED
. Si el archivo subyacente en sí es de solo lectura y no se puede cambiar, por supuesto, nada de esto es aplicable.
Si se usa PROT_READ
, no puedo ver nada más que deba ser diferente entre MAP_PRIVATE
y MAP_SHARED
. De hecho, a pesar de la advertencia anterior sobre el comportamiento no especificado, mi suposición (que no he probado) sería que en la práctica no hay ninguna diferencia entre los dos bajo PROT_READ
.
Eventualmente, mmap
syscall llama a do_mmap_pgoff
a la configuración para llamar a mmap_region
para hacer el trabajo real.
Pasa a través de la bandera VM_SHARED
para indicar si se trata de una asignación compartida o privada en vm_flags
a mmap_region
En do_mmap_pgoff
hay:
if (file)
{
switch (flags & MAP_TYPE)
{
case MAP_SHARED:
if ((prot&PROT_WRITE) && !(file->f_mode&FMODE_WRITE))
return -EACCES; /* error */
...
vm_flags |= VM_SHARED | VM_MAYSHARE;
if (!(file->f_mode & FMODE_WRITE))
vm_flags &= ~(VM_MAYWRITE | VM_SHARED);
/* fall through */
case MAP_PRIVATE:
...
break;
...
}
...
}
Lo que indica si hay una copia de respaldo del archivo y la asignación es MAP_SHARED
y el archivo es de solo lectura y luego desactiva el VM_SHARED
compartido VM_SHARED
.
Sin embargo, VM_MAYSHARE
todavía está configurado, por lo que se puede utilizar para cambiar el comportamiento.