¿Qué sucede con el contenido de la memoria caché en un cambio de contexto?

50

En un procesador multinúcleo, ¿qué sucede con el contenido de la memoria caché de un núcleo (digamos L1) cuando se produce un cambio de contexto en esa memoria caché?

¿El comportamiento depende de la arquitectura o es un comportamiento general seguido por todos los fabricantes de chips?

Ankit
fuente

Respuestas:

42

Eso depende tanto del procesador (no solo de la serie del procesador, puede variar de un modelo a otro) como de los sistemas operativos, pero existen principios generales. Si un procesador es multinúcleo no tiene un impacto directo en este aspecto; el mismo proceso podría ejecutarse en múltiples núcleos simultáneamente (si es multiproceso), y la memoria se puede compartir entre procesos, por lo que la sincronización de caché es inevitable independientemente de lo que ocurra en un cambio de contexto.

Cuando un procesador busca una ubicación de memoria en la memoria caché, si hay una MMU , puede usar la dirección física o virtual de esa ubicación (a veces incluso una combinación de ambas, pero eso no es realmente relevante aquí).

Con las direcciones físicas, no importa qué proceso esté accediendo a la dirección, los contenidos se pueden compartir. Por lo tanto, no es necesario invalidar el contenido de la memoria caché durante un cambio de contexto. Si los dos procesos asignan la misma página física con diferentes atributos, esto es manejado por la MMU (que actúa como una MPU (unidad de protección de memoria)). La desventaja de un caché direccionado físicamente es que la MMU debe ubicarse entre el procesador y el caché, por lo que la búsqueda de caché es lenta. Los cachés L1 casi nunca son direcciones físicas; cachés de nivel superior pueden ser.

La misma dirección virtual puede denotar diferentes ubicaciones de memoria en diferentes procesos. Por lo tanto, con un caché prácticamente direccionado, el procesador y el sistema operativo deben cooperar para garantizar que un proceso encuentre la memoria correcta. Existen varias técnicas comunes. El código de cambio de contexto proporcionado por el sistema operativo puede invalidar todo el caché; Esto es correcto pero muy costoso. Algunas arquitecturas de CPU tienen espacio en su línea de caché para un ASID (identificador de espacio de direcciones), la versión de hardware de una ID de proceso, también utilizada por la MMU. Esto separa efectivamente las entradas de caché de diferentes procesos, y significa que dos procesos que mapean la misma página tendrán vistas incoherentes de la misma página física (generalmente hay un valor ASID especial que indica una página compartida, pero estos deben vaciarse si no están asignados a la misma dirección en todos los procesos donde están asignados). Si el sistema operativo se encarga de que los diferentes procesos usen espacios de direcciones no superpuestos (lo que anula el propósito de usar la memoria virtual, pero a veces se puede hacer), las líneas de caché siguen siendo válidas.

La mayoría de los procesadores que tienen una MMU también tienen un TLB . El TLB es un caché de asignaciones de direcciones virtuales a direcciones físicas. El TLB se consulta antes de las búsquedas en cachés direccionadas físicamente, para determinar la dirección física rápidamente cuando sea posible; el procesador puede comenzar la búsqueda de caché antes de que se complete la búsqueda de TLB, ya que a menudo las líneas de caché candidatas se pueden identificar desde los bits intermedios de la dirección, entre los bits que determinan el desplazamiento en una línea de caché y los bits que determinan la página. Las memorias caché con dirección virtual omiten el TLB si hay un impacto en la memoria caché, aunque el procesador puede iniciar la búsqueda de TLB mientras consulta la memoria caché, en caso de una falla.

El TLB en sí mismo debe administrarse durante un cambio de contexto. Si las entradas TLB contienen un ASID, pueden permanecer en su lugar; el sistema operativo solo necesita vaciar las entradas TLB si su ASID ha cambiado de significado (por ejemplo, porque un proceso ha salido). Si las entradas de TLB son globales, deben invalidarse al cambiar a un contexto diferente.

Gilles 'SO- deja de ser malvado'
fuente
2
Muy informativo. Si pudiera agregar algunos ejemplos de cómo se hace esto en arquitecturas reales, sería aún mejor.
JohnTortugo
2
@JohnTortugo Lo que he escrito corresponde bastante a lo que puedes hacer en ARMv7 (por ejemplo, la CPU de tu teléfono inteligente) (la única arquitectura en la que he escrito el código de manejo de MMU). Espero que otras plataformas como x86 sean bastante similares, pero no pude escribir sobre ellas. Si está buscando información concreta sobre una plataforma real, Computer Science no es el sitio adecuado, puede preguntar sobre Stack Overflow o Electrical Engineering o Embeddedd (propuesto) .
Gilles 'SO- deja de ser malvado'
10

El caché suele ser ajeno a un cambio de contexto. Solo la secuencia de direcciones de memoria a las que se accede determina qué líneas de caché se reemplazan.

La política de reemplazo suele ser una heurística dependiente del fabricante y de la microarquitectura particular. El problema es que la heurística no puede predecir el futuro, a qué dirección y, por lo tanto, a la línea de caché se accederá a continuación.

La heurística puede ser tan simple como LRU (menos utilizada recientemente). Pero con las CPU modernas, las heurísticas son más complejas.

Eche un vistazo al Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32 El Volumen 3 Capítulo 11 explica la memoria caché y los mecanismos de control de la memoria caché. AMD tiene esto en el Capítulo 7 del Manual del Programador de Arquitectura AMD64 Volumen 2: Programación del sistema . Para las CPU basadas en ARM, parece que los PDF solo están disponibles para clientes registrados.

uli
fuente
¿Puedes dar una referencia para el primer párrafo? ¿O los documentos vinculados se refieren a este problema?
Raphael
El comportamiento depende en gran medida de si el caché se dirige física o virtualmente. La política de reemplazo no es relevante aquí. Para ARM, hay información en los manuales técnicos del procesador, que son públicos, por ejemplo, L1 en Cortex-A9 (lo que obtienes en los teléfonos celulares de última generación), aunque puede ser difícil de entender sin el manual de referencia de arquitectura no pública .
Gilles 'SO- deja de ser malvado'
1
@Raphael escribí "típicamente" porque con los procesadores con los que me he encontrado, la caché en sí misma no tiene ningún conocimiento sobre hilos, procesos, contextos, etc. Simplemente reacciona a los accesos a la memoria. Si la memoria caché de datos se vacía y la memoria caché de instrucciones se invalida en un cambio de contexto, es el sistema operativo el que activa esta acción, no la memoria caché. Si instala un sistema operativo diferente, este comportamiento podría cambiar.
uli
@Gilles Por una vez intenté dar una respuesta breve y decidí no escribir sobre memoria virtual, porque esto involucra de inmediato al sistema operativo. Y también hay que considerar el calendario. "Nada cambia" podría ser una respuesta por el tiempo entre el cambio de contexto y el siguiente acceso a la memoria, ya que el contenido de la memoria caché podría invalidarse pero no modificarse en absoluto.
uli