multithreading - unidades - ¿Las CPU multinúcleo comparten la MMU y las tablas de páginas?
unidad de memoria concepto (6)
AFAIK existe una única MMU por procesador físico, al menos en los sistemas SMP, por lo que todos los núcleos comparten una sola MMU.
En los sistemas NUMA, cada núcleo tiene una MMU separada, porque cada núcleo tiene su propia memoria privada.
En una computadora de núcleo único, un hilo se ejecuta a la vez. En cada contexto, el programador verifica si el nuevo hilo a programar está en el mismo proceso que el anterior. Si es así, no es necesario hacer nada con respecto a la MMU (tabla de páginas). En el otro caso, la tabla de páginas debe actualizarse con la nueva tabla de páginas de proceso.
Me pregunto cómo suceden las cosas en una computadora multi-core. Supongo que hay una MMU dedicada en cada núcleo, y si dos hilos del mismo proceso se ejecutan simultáneamente en 2 núcleos, cada una de las MMU de este núcleo simplemente hace referencia a la misma tabla de páginas. Es esto cierto ? ¿Puedes señalarme buenas referencias sobre el tema?
Hasta ahora, las respuestas parecen desconocer la existencia de la traducción Lookaside Buffer (TLB), que es la manera en que la MMU convierte las direcciones virtuales utilizadas por un proceso en una dirección de memoria física.
Tenga en cuenta que en estos días el TLB en sí es una bestia complicada con múltiples niveles de almacenamiento en caché . Al igual que los cachés de RAM regulares de una CPU (L1-L3), no necesariamente esperaría que su estado en un instante dado contenga información exclusivamente sobre el proceso que se está ejecutando en ese momento, sino que se mueva por partes a pedido; ver la sección Cambio de contexto de la página de wikipedia.
En SMP, todos los TLB de los procesadores deben mantener una vista coherente de la tabla de páginas del sistema. Ver, por ejemplo, esta sección del libro de kernel de Linux para una forma de manejarlo.
En cuanto a la cuestión de las MMU por procesador, puede haber varias. La suposición es que cada MMU agregará ancho de banda de memoria adicional. Si la memoria DDR3-12800 permite 1600 mega transferencias por segundo en un procesador con una MMU, entonces una con cuatro teóricamente permitirá 6400. Asegurar el ancho de banda a los núcleos disponibles probablemente sea toda una hazaña. El ancho de banda publicitado se reducirá un poco en el proceso.
La cantidad de MMU en un procesador es independiente de la cantidad de núcleos que contiene. Los ejemplos obvios son las 16 CPU centrales de AMD, definitivamente no tienen 16 MMU. Un procesador de doble núcleo, por otro lado, podría tener dos MMU. O solo uno. O tres?
Editar
Tal vez estoy confundiendo MMUs con canales?
Eche un vistazo a este esquema. Esta es una vista de alto nivel de todo lo que hay en un solo núcleo en una CPU Corei7. La imagen ha sido tomada de Computer Systems: A Programmer''s Perspective, Bryant y Hallaron. Puede tener acceso a los diagramas aquí , sección 9.21.
Lo siento por la respuesta anterior. Borró la respuesta
TI PandaBoard se ejecuta en el procesador OMAP4430 Dual Cortex A9. Tiene una MMU por núcleo. Tiene 2 MMU para 2 núcleos.
http://forums.arm.com/index.php?/topic/15240-omap4430-panda-board-armcortex-a9-mp-core-mmu/
El hilo anterior proporciona la información.
Además, algo más de información sobre ARM v7
Cada núcleo tiene las siguientes características:
- CPU ARM v7 a 600 MHz
- 32 KB de L1 instrucción CACHE con control de paridad
- 32 KB de datos L1 CACHE con control de paridad
- FPU integrada para operaciones de punto flotante escalar de precisión de datos simples y dobles
- Unidad de gestión de memoria (MMU)
- Soporte de conjunto de instrucciones ARM, Thumb2 y Thumb2-EE
- Extensión de seguridad de TrustZone ©
- Componente de programa MacroCell y componente CoreSight © para depuración de software
- Interfaz JTAG
- Interfaz AMBA © 3 AXI de 64 bits
- Temporizador de 32 bits con preescaler de 8 bits
- Perro guardián interno (trabajando también como temporizador)
La configuración de doble núcleo se completa con un conjunto común de componentes:
- Unidad de control Snoop (SCU) para gestionar la comunicación entre procesos, la memoria caché-2-caché y la transferencia de memoria del sistema, la coherencia de la caché
- Unidad de control de interrupción genérico (GIC) configurada para admitir 128 fuentes de interrupción independientes con prioridad configurable por software y enrutamiento entre los dos núcleos
- Temporizador global de 64 bits con preescaler de 8 bits
- Puerto de coherencia del acelerador asincrónico (ACP)
- Soporte de paridad para detectar fallas de memoria interna durante el tiempo de ejecución
- 512 KB de caché L2 asociativa conjunto unificado de 8 vías con soporte para comprobación de paridad y ECC
- Controlador de caché L2 basado en IP PL310 lanzado por ARM
- Interfaz dual AMBA 3 AXI de 64 bits con posible filtrado en la segunda para usar un solo puerto para acceso a memoria DDR
Aunque todos estos son para ARM, proporcionarán una idea general.
TL; DR - Hay una MMU separada por CPU, pero una MMU generalmente tiene varios NIVELES de tablas de página y pueden compartirse.
Por ejemplo, en un ARM, el nivel superior ( PGD o el nombre de directorio global de página utilizado en Linux) cubre 1 MB de espacio de direcciones. En sistemas simples, puede mapear en secciones de 1MB. Sin embargo, esto normalmente apunta a una tabla de segundo nivel ( PTE o entrada de tabla de página).
Una forma de implementar eficientemente varias CPU es tener un PGD de nivel superior por CPU. El código y la información del sistema operativo serán consistentes entre los núcleos. Cada núcleo tendrá su propio TLB y L1-caché; Los cachés L2 / L3 pueden ser compartidos o no. El mantenimiento de cachés de datos / códigos depende de si son VIVT o VIPT, pero ese es un problema secundario y no debería afectar el uso de MMU y multi-core.
La porción de proceso o usuario de las tablas de página de segundo nivel permanece igual por proceso ; de lo contrario, tendrían una memoria diferente o necesitarían sincronizar tablas redundantes. Los núcleos individuales pueden tener diferentes conjuntos de tablas de página de segundo nivel (puntero de tabla de página de nivel superior diferente) cuando ejecutan procesos diferentes. Si tiene múltiples subprocesos y se ejecuta en dos CPU, la tabla de nivel superior puede contener las mismas entradas de tabla de página de segundo nivel para el proceso. De hecho, toda la tabla de la página de nivel superior puede ser idéntica (pero con una memoria diferente) cuando dos CPU ejecutan el mismo proceso. Si se implementan datos locales de subprocesos con una MMU, una sola entrada puede ser diferente. Sin embargo, los datos locales de subprocesos generalmente se implementan de otras formas debido al problema de TLB y caché (enrojecimiento / coherencia).
La imagen de abajo puede ayudar. Las entradas de CPU, PGD y PTE en el diagrama son como punteros.
La línea discontinua es la única diferencia entre ejecutar diferentes procesos y los mismos procesos (caso de subprocesos múltiples) con la MMU; es una alternativa a la línea continua que va desde el CPU2 PGD al proceso B PTE o la tabla de páginas de segundo nivel. El kernel siempre es una aplicación de CPU de subprocesos múltiples.
Cuando se traduce una dirección virtual, diferentes porciones de bits son índices en cada tabla. Si una dirección virtual no está en el TLB, entonces la CPU debe hacer una caminata de tabla (y buscar una memoria de tabla diferente). De modo que una sola lectura de una memoria de proceso daría como resultado tres accesos a la memoria (si el TLB no estaba presente).
El permiso de acceso del código / datos del kernel es obviamente diferente. De hecho, es probable que haya otros problemas, como la memoria del dispositivo, etc. Sin embargo, creo que el diagrama debería hacer obvio cómo la MMU logra mantener la misma memoria de subprocesos múltiples.
Es muy posible que una entrada en la tabla de segundo nivel sea diferente por hilo. Sin embargo, esto implicaría un costo al cambiar los subprocesos en la misma CPU, por lo que normalmente se mapean los datos para todos los "locales de subprocesos" y se utiliza otra forma de seleccionar los datos. Normalmente, los datos locales de la secuencia se encuentran a través de un puntero o registro de índice (especial por CPU) que se asigna / apunta a datos dentro del ''proceso'' o memoria de usuario. ''hilo de datos locales'' no está aislado de otros hilos, por lo que si tiene una sobreescritura de memoria en un hilo podría matar a otro hilo de datos.