Comprensión profunda del principio de MMAP, los medios técnicos que los fabricantes no pueden dejar de usar.

Por qué Dachang no puede dejarlo

Como el componente MMKV de WeChat , el componente Logan de Meituan y el módulo de registro xlog de WeChat ¿Por qué los grandes fabricantes lo prefieren? ¿Qué magia tiene? Creo que las principales razones son las siguientes:

  • Multiplataforma, escrito en C++, puede soportar múltiples plataformas
  • Proceso cruzado, a través del intercambio de archivos, múltiples procesos pueden compartir memoria y realizar la comunicación del proceso
  • Alto rendimiento, copia cero del espacio del usuario y del kernel, velocidad rápida y ahorro de memoria, etc.
  • Alta estabilidad, protector de interrupción de página, implementado por el sistema operativo, la estabilidad se puede imaginar

Introducción a la función

void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
复制代码
  • addr representa la dirección inicial de la memoria virtual mapeada;
  • longitud representa la longitud de la asignación;
  • prot describe los derechos de acceso de esta nueva área de memoria;
  • flags describe el tipo de mapeo;
  • fd significa descriptor de archivo;
  • offset representa el valor de compensación dentro del archivo.

El poder de mmap es que se puede usar para crear memoria compartida de acuerdo con la configuración de parámetros, mejorando así la eficiencia de E/S del área de mapeo de archivos y realizando la copia cero de E/S. La tecnología de copia cero se discutirá más adelante. En comparación, los principales factores que determinan estas funciones son Tres parámetros, explicados a continuación uno por uno

ganancia

Los cuatro casos son los siguientes:

  • PROT_EXEC , lo que significa que el mapa de memoria tiene permiso ejecutable, que puede considerarse como un segmento de código, que generalmente almacena el código de máquina ejecutable de la CPU
  • PROT_READ , lo que significa que el mapa de memoria es legible
  • PROT_WRITE , lo que significa que se puede escribir en el mapa de memoria
  • PROT_NONE , lo que significa que no se puede acceder al mapa de memoria

banderas

Los más representativos son los siguientes:

  • MAP_SHARED , para crear un área de mapa compartida
  • MAP_PRIVATE , para crear un área mapeada privada
  • MAP_ANONYMOUS , crea un área de mapeo anónimo, en este caso solo necesitas pasar -1
  • MAP_FIXED,当操作系统以addr为起始地址进行内存映射时,如果发现不能满足长度或者权限要求时,将映射失败,如果非MAP_FIXED,则系统就会再找其他合适的区域进行映射

fd

当参数fd不等于0时,内存映射将与文件进行关联,如果等于0,就会变成匿名映射,此时flags必为MAP_ANONYMOUS

应用场景

一个mmap竟有如此丰富的功能,从申请分配内存到加载动态库,再到进程间通信,真的是无所不能,强大到让人五体投地。下面就着四种情况,拿一个我最关心的父子进程通信来举例看下,实现一个简单的父子进程通信逻辑,毕竟我们学习的目的就是为了应用,光有理论怎么能称之为合格的博客呢?

父子进程共享内存

#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/mman.h>

int main() {
    pid_t c_pid = fork();

    char* shm = (char*)mmap(nullptr, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    if (c_pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (c_pid > 0) {
        printf("parent process pid: %d\n", getpid());
        sprintf(shm, "%s", "hello, my child");
        printf("parent process got a message: %s\n", shm);
        wait(nullptr);
    } else {
        printf("child process pid: %d\n", getpid());
        sprintf(shm, "%s", "hello, father.");
        printf("child process got a message: %s\n", shm);
        exit(EXIT_SUCCESS);
    }

    return EXIT_SUCCESS;
}
复制代码

运行后打印如下

parent process pid: 87799
parent process got a message: hello, my child
child process pid: 87800
child process got a message: hello, father.

Process finished with exit code 0
复制代码

用mmap创建了一块匿名共享内存区域,fd传入**-1MAP_ANONYMOUS配置实现匿名映射,使用MAP_SHARED**创建共享区域,使用fork函数创建子进程,这样来实现子进程通信,通过sprintf将格式化后的数据写入到共享内存中。

通过简单的几行代码就实现了跨进程通信,如此简单,这么强大的东西,背后有什么支撑么?带着问题我们接着一探究竟。

MMAP背后的保护神

说到MMAP的保护神,首页了解下内存页:在页式虚拟存储器中,会在虚拟存储空间和物理主存空间都分割为一个个固定大小的页,为线程分配内存是也是以页为单位。比如:页的大小为 4K,那么 4GB 存储空间就需要4GB/4KB=1M 条记录,即有 100 多万个 4KB 的页,内存页中,当用户发生文件读写时,内核会申请一个内存页与文件进行读写操作,如图

En este momento, si no hay datos en la página de memoria, ocurrirá un mecanismo de interrupción, que se llama interrupción de falla de página. Esta interrupción es el protector de MMAP. ¿Por qué dices esto? Sabemos que después de llamar a la función mmap, el espacio de direcciones virtuales del proceso solo se establece durante la asignación, y la memoria física correspondiente a la memoria virtual no se asigna.Al acceder a esta memoria virtual sin una relación de mapeo, la instrucción de carga de la CPU encuentra que falta el segmento de código. Se activa la interrupción de falla de página. Después de la interrupción, el kernel verifica el área de la dirección virtual y encuentra que hay un mapa de memoria. Puede calcular el desplazamiento del archivo a través de la dirección de memoria virtual, y ubique la página del archivo correspondiente a la página que falta en la memoria.Inicie el disco IO y cargue la página correspondiente del disco a la memoria. Al final, la protección de mmap se puede llevar a cabo sin problemas, dedicación desinteresada. Después de comprender la interrupción de falla de página, hablemos sobre el principio de asignación de memoria en los cuatro escenarios de mmap

Cuatro principios de asignación de escenas

Lo anterior es un resumen simple del principio, y no hay una expansión detallada.Si está interesado, puede verificar la información usted mismo.

Resumir

Este intercambio presenta principalmente los cuatro escenarios de aplicación de mmap, a través de un ejemplo para verificar la comunicación entre los procesos principal y secundario, y profundiza en mmap para encontrar su protector, y comprende profundamente cómo se organiza el sistema operativo de mmap en los cuatro escenarios. Distribución, a través de la comprensión de estos, tendrá una mejor base teórica para la aplicación real de mmap, y podrá elegir la implementación más adecuada de acuerdo con las diferentes necesidades, diferentes requisitos de rendimiento, etc.

Estoy participando en el reclutamiento del programa de firma de creadores de la Comunidad Tecnológica de Nuggets, haga clic en el enlace para registrarse y enviar .

Supongo que te gusta

Origin juejin.im/post/7119116943256190990
Recomendado
Clasificación