sistemas operativos manejo interrupciones ensamblador enmascaramiento enmascarables ejemplos computadoras arquitectura c linux x86-64

operativos - ¿Cómo se manejan las interrupciones en SMP?



manejo de interrupciones sistemas operativos (5)

¿Cómo se manejan las interrupciones en las máquinas SMP (multiprocesador / multinúcleo simétrico)? ¿Hay solo una unidad de gestión de memoria o más?

Diga dos subprocesos, A y B que se ejecutan en diferentes núcleos tocan una página de memoria (al mismo tiempo) que no está allí en la tabla de páginas, en cuyo caso habrá un error de página y se traerá una nueva página de la memoria.

¿Cuál es la secuencia de eventos que sucederá? Si hay una unidad de administración de memoria, ¿a qué núcleo se reenvía el fallo de página? ¿Cómo lo maneja el kernel? ¿Existen múltiples instancias del kernel, cada una ejecutándose en un núcleo diferente? Si es así, ¿cómo se sincronizan en eventos como el manejo de fallas de página?


Bueno, depende de la arquitectura específica, pero de lo que puedo recordar de los documentos de Intel ...

Hay dos fuentes principales de interrupciones:

  • Interno: Estos son generados por la propia CPU. Incluye fallas, trampas, interrupciones de software, etc.
  • Externo: Son interrupciones de hardware generadas por periféricos.

Las interrupciones internas siempre se entregan a la CPU que lo generó. Los externos se envían a un núcleo arbitrario.

En los modelos modernos, las interrupciones también se pueden entregar utilizando un sistema similar a un bus, en lugar del anterior, con interrupciones, pero ignoro si este modelo se está utilizando en cualquier sistema operativo actual.

Acerca de la MMU, cada núcleo tiene su propio núcleo, por supuesto, pero usualmente son forzados por el SO a los mismos segmentos, por lo que pueden usarse simétricamente. Tenga en cuenta que la mayoría de los mapas entre la memoria física y la virtual están en realidad en la memoria, y eso siempre se comparte.

Sobre la secuencia en tu ejemplo:

  • El error de página se reenvía al núcleo que lo generó.
  • El kernel actualiza sus tablas MMU, que están protegidas por un bloqueo compartido o similar.
  • No, solo hay un kernel, generalmente, a menos que aplique un modelo de virtualización.
  • Se sincronizan utilizando un bloqueo compartido o una estructura similar. Si ambos núcleos fallan en la misma página al mismo tiempo ... bueno, en realidad no es gran cosa.

Cada procesador tiene su propia unidad de administración de memoria con un búfer interno de traducción. Esto es necesario porque cada núcleo podría estar ejecutando un proceso diferente que tiene un espacio de direcciones diferente.

Los múltiples núcleos pueden manejar de forma independiente las interrupciones / excepciones al mismo tiempo. Por lo tanto, puede haber múltiples contextos de interrupción concurrentes ejecutándose en un kernel al mismo tiempo.

Una excepción como un error de página o una división por cero siempre se manejará en el mismo procesador en el que se produjo, ya que se refiere a lo que está haciendo ese procesador.

Las interrupciones externas normalmente atraviesan algún tipo de tejido de conmutación que les permite asignarse a los procesadores de alguna manera, estática o dinámicamente. Por ejemplo, el "APIC" en hardware de tipo PC.

Si el tejido es lo suficientemente sofisticado, las interrupciones se pueden reprogramar para apuntar a un núcleo diferente sobre la marcha.

Depende de la arquitectura. Una arquitectura simplista podría, por ejemplo, vincular todas las interrupciones externas a un núcleo. Eso no sería muy simétrico sin embargo; no permitiría el equilibrio de carga de IRQ.

(También tenga en cuenta que es útil que ocurran ciertas interrupciones externas en todos los procesadores. Un ejemplo de esto es la interrupción del temporizador. Si cada núcleo tiene su propio temporizador de interrupción, entonces el control del tiempo en el programador es simétrico: no hay un caso especial para un núcleo principal en comparación con los otros. Una interrupción se dispara, el núcleo ejecuta el código del programador y, si el tiempo de la tarea actual está arriba, elige otra tarea para ejecutar en ese núcleo.)


En arquitecturas multinúcleo / multiprocesador, se utiliza un APIC para enrutar las interrupciones a los núcleos / procesadores. Como su nombre lo indica, los APIC pueden programarse para hacer el enrutamiento como se desee.

Con respecto a la sincronización del kernel: Esto depende del kernel / OS. Puede usar un esquema con bloqueo (aunque los IPI pueden ser necesarios en arquitecturas no caché) o también puede usar el enfoque sugerido de ejecutar un kernel en cada núcleo y usar algún tipo de comunicación explícita entre kernels.

Barrelfish es un ejemplo de un sistema operativo que ejecuta varios núcleos. Si está interesado en ese tipo de arquitectura, puede leer el documento " El Multikernel: una nueva arquitectura de sistema operativo para sistemas multinúcleo escalables "


No obtuve las "múltiples instancias del kernel", por lo general las reglas del kernel son todas. lo que significa que no tiene instancia, en cambio, uno debería pensar en el kernel como un sistema reactivo global, que proporciona servicios a las aplicaciones.

Por lo que sé, la gestión de la memoria es una unidad (aunque cada núcleo tiene su propio vector de interrupción), las páginas se bloquean utilizando page_table_lock , por lo que la recuperación de la página se ejecuta solo una vez, en el orden de bloqueo.

** EDITAR: Después de ver los otros comentarios, mi respuesta podría estar desactualizada: de todos modos, debe consultar: http://www.xml.com/ldd/chapter/book/ch13.html


Cada CPU lógica (es decir, el núcleo de la CPU) tiene su propio registro cr3 , que maneja el puntero a las estructuras de paginación. Las dos fallas de la página pueden ocurrir ya sea:

  • en hilos del mismo proceso
  • En hilos de diferentes procesos.

Si esos son hilos de diferentes procesos, entonces no hay problema. No sé cuál es la implementación específica de Linux de esto (sí, sé que está etiquetado como "linux"), pero hay dos algoritmos generales para administrar la memoria virtual en el entorno SMP:

  • cada núcleo contiene su propia lista de páginas físicas gratuitas y solicita algo más cuando todas las páginas de su propia lista están asignadas
  • todos los núcleos utilizan la misma lista de páginas libres, protegidas por algún tipo de bloqueo (por lo general, el bloqueo de giro es suficiente en este caso), que por supuesto es una solución más lenta

El mismo código (controlador de #PF) puede ejecutarse simultáneamente en dos núcleos diferentes, eso no es un problema. Si los subprocesos usan dos VAS diferentes 1 , entonces sus fallas de página se manejan de manera simétrica. Si las fallas de la página ocurren dentro de un solo VAS, todavía no hay problema, hasta que los #PF sean causados ​​por el acceso a la misma página. En tal caso, cada página en VAS debe estar protegida por un spinlock (o simplemente #PF en un VAS dado puede ser protegido por un solo bloqueo, de esta manera reduce la sobrecarga de memoria, pero elimina la posibilidad de ejecutar dos controladores #PF simultáneamente).

De acuerdo con esta respuesta , solo en los sistemas NUMA, cada núcleo de CPU tiene su propia MMU; en otros sistemas, cada procesador físico tiene su propia MMU, así como TLB para manejar diferentes estructuras de paginación a las que hacen referencia diferentes valores de registro cr3 .

1. VAS = Espacio de direcciones virtuales