La mejor memoria compartida del mundo (la memoria compartida más completa de Linux) Parte 1

Hay 10 millones de tipos de intercambio en el mundo para compartir bicicletas, compartir cargando tesoros y compartiendo paraguas, y me encanta solo la memoria compartida.

La memoria compartida temprana enfatizaba que la misma pieza de memoria se asigna al espacio de direcciones virtuales de múltiples procesos (encontrar un área de VMA en el proceso correspondiente) para que la CPU pueda acceder a esta pieza de memoria en cada proceso.

En esta etapa, se usa ampliamente en el método de memoria compartida en el campo de multimedia y gráficos. En cierto sentido, ya no enfatiza el concepto de mapeo al espacio de direcciones virtuales del proceso (eso no es más que para que la CPU acceda), sino más énfasis en alguna forma de "manejar" , Deje que todos sepan la existencia de una pieza de video, gráficos e información de imagen y puede usar este "identificador" para referirse a esta pieza de memoria en los procesos, de modo que los codificadores de video, decodificadores, GPU, etc. puedan acceder a la memoria a través de los procesos. Por lo tanto, el hardware de aceleración utilizado por los diferentes procesos es realmente diferente. Lo que les importa más es que pueden obtener esta memoria a través de un controlador y ya no les importa la dirección virtual de la CPU que accede a ella (por supuesto, todavía pueden asignarse al espacio de direcciones virtual del proceso para Acceso a la CPU).

Mientras la copia de memoria (memcpy) siga siendo un gran consumidor de ancho de banda de memoria y utilización de CPU, la memoria compartida continuará prosperando como el método más eficiente de comunicación entre los procesos de Linux y la comunicación de diferentes componentes de hardware en los sistemas informáticos. Con respecto a la copia de memoria, ocupará en gran medida la utilización de la CPU. Este puede ser el intento más simple de copiar una velocidad de fotogramas de película 1080P de 60 fotogramas por segundo. Le garantizo que la CPU de su sistema no dañará.

Durante mucho tiempo he querido escribir sistemáticamente un artículo que resuma los diversos métodos de memoria compartida en Linux, pero siempre he sido atrapado por la causa de tener un bebé. Hoy decidí soportar las montañas y el tsunami de las muñecas. Escupir rápidamente.

Hay muchas formas de compartir memoria, y los métodos principales actuales siguen siendo:

 

Memoria compartida

1. Memoria compartida basada en SYS V tradicional;

2. Basado en la asignación de archivos POSIX mmap para lograr memoria compartida;

3. A través de memfd_create () y fd intercambio entre procesos para lograr memoria compartida;

4. Memoria compartida basada en dma-buf ampliamente utilizada en multimedia y gráficos.

Memoria compartida

 

SYS V memoria compartida

Tiene una larga historia, una larga historia y una API extraña. En correspondencia con el código del kernel linux / ipc / shm.c, cuando no selecciona CONFIG_SYSVIPC al compilar el kernel, ya no tiene esta capacidad.

La memoria compartida que ve en Linux al escribir el comando ipcs es esta memoria compartida:

Escribamos un programa simple para ver el sw.c de la memoria compartida:

Y la lectura final sr.c de la memoria compartida:

Compila y prepárate para correr:

Antes de ver el sistema gratuito:

Ejecute sw y sr de la siguiente manera:

Descubrimos que la impresión de SR es la misma que la escrita en sw. En este momento miramos gratis nuevamente:

Se puede ver que el uso ha aumentado significativamente (711632-> 715908), compartido ha aumentado significativamente (2264-> 6360), y la columna en caché también ha aumentado significativamente 326604-> 330716.

Todos sabemos que la columna en caché cuenta el tamaño de caché de página de los archivos respaldados por archivos. En teoría, la memoria compartida pertenece a páginas anónimas, pero dado que hay un tmpfs muy especial (/ dev / shm apunta a / run / shm, / run / shm se monta a tmpfs):

Por lo tanto, se puede ver que lo de tmpfs es realmente un poco vago: podemos entenderlo como una página anónima respaldada por archivos (página anónima), un poco similar al Zhou Shen en la voz femenina . Anteriormente enfatizamos repetidamente que las páginas anónimas no tienen un fondo de archivo, por lo que al intercambiar memoria, se intercambian con la partición de intercambio. La copia de los contenidos del sistema de archivos del disco en la memoria son páginas respaldadas por archivos, por lo que no hay ningún problema de intercambio con la partición de intercambio. Sin embargo, el contenido en tmpfs se cuenta realmente en la memoria caché de la página en un sentido estadístico, pero no tiene un fondo de disco real , que es esencialmente diferente de la memoria caché de la página generada al acceder a los archivos en el sistema de archivos del disco. Por lo tanto, realmente tiene una sensación de misceláneo, no hay absoluto en todo, solo el cambio en sí no cambia.

También puede encontrar la memoria compartida SYS V recién creada a través de ipcs:

POSIX memoria compartida

Mi amor por la memoria compartida de la serie API POSIX shm_open () y mmap () es mucho más de 100 veces mayor que la de SYS V. Perdóname por ser una persona perezosa, simplemente odio las API como ftok, shmget, shmat, shmdt.

Si el programa anterior está escrito en POSIX, se puede simplificar para escribir end psw.c:

Fin de lectura:

Compilar y ejecutar:

De esta manera veremos un archivo en / dev / shm /, / run / shm:

Hablando francamente, las API como mmap y munmap me hicieron sentir como en casa. Cuando comencé a hacer Linux, después de escribir el controlador framebuffer, usé / dev / fb0 mmap para operar en el espacio del usuario. Es realmente amable, como un ser querido.

Por supuesto, si no te gusta la API shm_open (), también puedes usar open normal para abrir el archivo y luego mmap. La clave es mmap, dijo Wikipedia:

mmap

En informática, mmap (2) es una llamada al sistema Unix compatible con POSIX que asigna archivos o dispositivos a la memoria. Es un método de E / S de archivo mapeado en memoria. Implementa la paginación bajo demanda, porque el contenido del archivo no se lee directamente del disco y, al principio, no utiliza RAM física en absoluto. Las lecturas reales del disco se realizan de manera "perezosa", después de acceder a una ubicación específica. Después de que la memoria ya no sea necesaria, es importante munmap (2) los punteros a ella. La información de protección se puede gestionar con mprotect (2), y se puede aplicar un tratamiento especial con madvise (2).

La memoria compartida de POSIX todavía se ajusta a las características de tmpfs que mencionamos anteriormente. Después de ejecutar sw, sr, y luego ejecutar psw y psr, encontramos que el comando free cambió dramáticamente de nuevo:

Compare los resultados de este comando gratuito con los campos de los dos resultados gratuitos anteriores:

¿La tercera vez en caché es mucho más grande que la segunda? Debido a que estaba escribiendo este artículo mientras accedía a los archivos en el disco. Por supuesto, la memoria compartida de POSIX también provocó un aumento del almacenamiento en caché.

memfd_create

Si el POSIX mmap me hace sentir como en casa, entonces memfd_create () es increíble. He visto esta API antes de saber qué es un aturdidor natural, y es un aturdidor en el aturdidor, es completamente del tipo que permite que el granjero congestione sus ojos cuando lo ve a primera vista. Ese tipo de API; la primera vez que las personas lo ven por primera vez, ignorarán su apariencia, porque su cuerpo es demasiado caliente y llamativo.

 

No lo piense, antes de comenzar, tenemos que mencionar el importante concepto de compartir entre procesos fd (descriptor de archivo, correspondiente al "identificador" que solemos decir).

Como todos sabemos, Linux fd pertenece a una cosa de nivel de proceso. Ingrese / proc / pid / fd de cada proceso para ver su lista de fds:

0, 1, 2 de este proceso no es lo mismo que 0, 1, 2 de ese proceso.

En un determinado día del año y mes, se descubrió que un proceso realmente quería acceder al fd de otro proceso . Por supuesto, esto es solo un fin, no un medio. Por ejemplo, el proceso A tiene dos fds que apuntan a dos fragmentos de memoria. Si el proceso B puede obtener estos dos fds, en realidad puede acceder a estos dos fragmentos de memoria a través de estos dos fds. En cierto sentido, este fd actúa como intermediario. Algunas personas dicen que no es fácil, si el proceso A:

fd = abierto ();

Si open () devuelve 100, ¿está bien decirle al proceso B este 100? El proceso B puede acceder a este 100. Esto muestra que aún no ha descubierto que fd es un proceso interno, y no es el concepto de proceso cruzado. Tus 100 y mis 100 no son lo mismo. No puedes entender estas cosas básicas, todo lo demás que haces es en vano.

Linux proporciona un método especial que puede transferir el fd de un proceso y patear la pelota a otro proceso. Tipo de compartir). Siempre quise volcar (compartir) mi error (compartir), pero descubrí que la gente siempre volcó el error.

Entonces, ¿cómo volcar (compartir) pot (compartir) fd?

Publicado 766 artículos originales · elogiados 474 · 2.54 millones de visitas

Supongo que te gusta

Origin blog.csdn.net/u010164190/article/details/105444456
Recomendado
Clasificación