2012-04-19 32 views
24

¿Cómo se manejan las interrupciones en las máquinas SMP (multiprocesador symmeteric/multicore)? ¿Hay solo una unidad de administración de memoria o más?¿Cómo se manejan las interrupciones en SMP?

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

¿Cuál es la secuencia de eventos que sucederá? Si hay una unidad de gestión de memoria, ¿a qué núcleo se reenvía la falla de página? ¿Cómo lo maneja el kernel? ¿Hay varias 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?

Respuesta

7

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

En cuanto a la sincronización del núcleo: Esto depende del núcleo/sistema operativo. Puede usar un esquema con bloqueo (aunque los IPI pueden ser necesarios en arquitecturas que no son de caché) o también puede usar su enfoque sugerido para ejecutar un núcleo en cada núcleo y usar algún tipo de comunicación explícita entre núcleos.

Barrelfish es un ejemplo de un SO que ejecuta kernels múltiples.Si está interesado en ese tipo de arquitectura, puede leer el documento "The Multikernel: A new OS architecture for scalable multicore systems"

8

Bueno, depende de la arquitectura específica, pero por lo que puedo recordar de la documentación de Intel ...

Hay dos fuentes principales de interrupciones:

  • interno: Estos son generados por la CPU en sí. Incluye fallas, interrupciones, interrupciones de software, etc.
  • Externo: Son interrupciones de hardware generadas por periféricos.

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

En los modelos modernos, las interrupciones también se pueden entregar utilizando un sistema similar al bus en lugar del antiguo impulsado por interrupción, pero ignoro si este modelo se está utilizando en cualquier sistema operativo actual.

Acerca de la MMU, cada núcleo tiene su propio, por supuesto, pero normalmente se ven forzados por el sistema operativo, por lo que se pueden usar simétricamente. Tenga en cuenta que la mayoría de las asignaciones entre la memoria física y la virtual están realmente en la memoria, y eso siempre se comparte.

Acerca de la secuencia en su ejemplo:

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

De nuevo, por favor, eche un vistazo a Barrelfish como ejemplo para múltiples kernels. Un enfoque de kernel monolítico no escala mucho más allá de cientos de núcleos. – mensi

+0

@mensi - Por supuesto, pero sentí que el OP se refería más a sistemas operativos mainstreams, particularmente a Linux, ya que incluía esa etiqueta. Y AFAIK cientos de núcleos aún no son un problema de escalabilidad ... – rodrigo

1

Cada CPU lógica (es decir, el núcleo de la CPU) tiene su propio registro cr3, manejando el puntero a las estructuras de búsqueda. Los dos fallos de página pueden ocurrir ya sea:

  • en hilos de un mismo proceso
  • en hilos de diferentes procesos

Si esos son hilos de diferentes procesos, entonces no hay problema. No sé lo que es la implementación de Linux específica de este (sí, sé que es etiquetada como "Linux"), pero hay dos algoritmos generales para la gestión de la memoria virtual en el entorno de SMP:

  • cada núcleo sostiene su propio lista de páginas físicas gratuitas y solicita algunas más cuando se asignan todas las páginas de su propia lista
  • todos los núcleos utilizan la misma lista de páginas libres, protegidas por algún tipo de bloqueo (generalmente, el bloqueo de giro es suficiente en tal caso), que es por supuesto, una solución más lenta

El mismo código (controlador #PF) se puede ejecutar simultáneamente en dos núcleos diferentes, eso no es un problema em. Si los subprocesos usan dos VAS diferentes , sus fallas de página se manejan simétricamente. Si las fallas de página se producen dentro de un solo VAS, sigue sin ser un problema, hasta que los #PFs sean causados ​​por el acceso a la misma página. En tal caso, cada página en VAS debería estar protegida por un spinlock (o simplemente #PF en un VAS determinado puede protegerse con un solo bloqueo; de esta forma se reduce la sobrecarga de memoria, pero se elimina la posibilidad de ejecutar dos manejadores #PF simultáneamente).

De acuerdo con this answer, solo en los sistemas NUMA, cada núcleo de CPU tiene su propia MMU; en otros sistemas, todos los procesadores físicos tienen su propia MMU, así como TLB para manejar las diferentes estructuras de paginación a las que hacen referencia los diferentes valores del registro cr3.


1. VAS = Espacio Virtual

0

Dirección no he tenido los "múltiples instancias del kernel", por lo general las reglas del núcleo em todos. lo que significa que no tiene instancia, en su lugar uno debería pensar en el núcleo como un sistema reactivo global, que proporciona servicios a las aplicaciones. Hasta donde yo sé, la memoria es una unidad (aunque cada núcleo tiene su propio vector de interrupción), las páginas se bloquean usando page_table_lock, por lo que la recuperación de página se ejecuta solo una vez, en el orden de bloqueo.

** EDIT: Después de ver los otros comentarios, mi respuesta podría ser fuera de moda: de todos modos se debe comprobar: http://www.xml.com/ldd/chapter/book/ch13.html

+0

Por "múltiples instancias del kernel", quiere decir "múltiples manejadores #PF ejecutándose simultáneamente". – Griwes

+0

Para ver un ejemplo de "varias instancias del kernel", consulte el documento que he vinculado en mi respuesta – mensi

3

Cada procesador tiene su propia unidad de gestión de memoria con una memoria tampón 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 independientemente interrupciones/excepciones al mismo tiempo. Por lo tanto, puede haber múltiples contextos de interrupción simultáneos 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 trata de lo que está haciendo ese procesador.

Las interrupciones externas normalmente pasan por algún tipo de cambio de estructura que les permite mapearse de alguna manera, estática o dinámicamente. P.ej. el "APIC" en hardware de PC.

Si la tela es lo suficientemente sofisticada, las interrupciones pueden reprogramarse para un objetivo diferente sobre la marcha.

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

(También tenga en cuenta que es útil que ocurran ciertas interrupciones externas en todos los procesadores. Si cada núcleo tiene su propio temporizador de interrupción, entonces el manejo del tiempo en el programador es simétrico: hay no hay manejo de casos especial para un núcleo principal frente a los demás. Se activa una interrupción, el núcleo ejecuta el código del planificador y si el tiempo de la tarea actual está activo, elige otra tarea para ejecutar en ese núcleo).

+0

Cool; me gusta cómo lo llamas "la tela". ¿Algún detalle sobre esto para ARM arch (como OMAP3/4)? Gracias. – kaiwan

Cuestiones relacionadas