Rendimiento de microkernel vs kernel monolítico

14

Un microkernel implementa todos los controladores como programas de espacio de usuario e implementa características centrales como IPC en el núcleo mismo. Sin embargo, un kernel monolítico implementa los controladores como parte del kernel (por ejemplo, se ejecuta en modo kernel).

He leído algunas afirmaciones de que los microkernels son más lentos que los núcleos monolíticos, ya que necesitan manejar el mensaje que pasa entre los controladores en el espacio del usuario. ¿Es esto cierto?

Durante mucho tiempo, la mayoría de los núcleos fueron monolíticos porque el hardware era demasiado lento para ejecutar micro-núcleos rápidamente. Sin embargo, ahora hay muchos microkernels y núcleos híbridos, como GNU / Hurd, Mac OS X, línea de Windows NT, etc.

Entonces, ¿ha cambiado algo sobre el rendimiento de los microkernels? ¿Sigue siendo válida esta crítica a los microkernels hoy en día?

mmk
fuente

Respuestas:

11

Como siempre es la respuesta (o al menos el prefacio) a las preguntas relacionadas con el rendimiento: conozca el dominio de su problema, ejecute puntos de referencia comparativos y recuerde qué es la optimización prematura .

Primero, ninguna prueba de evaluación comparativa exhaustiva ha comparado los núcleos monolíticos con los sistemas de microkernel de generación actual que funcionan de manera equivalente. Por lo tanto, aunque puede haber ensayos que comparen elementos específicos de esos núcleos, no serán representativos del "panorama general" que su pregunta busca pintar.

Dicho esto, hay observaciones muy divergentes del rendimiento del kernel en los microkernels; Por ejemplo, se puede decir que la familia de microkernel L4 tiene un rendimiento de IPC un orden de magnitud mayor que el kernel de Mach. Pero todos los dispositivos Apple de esta década ejecutan Mach, y parecen funcionar bastante rápido, ¿verdad?

La moraleja de la historia es que cualquiera que decida qué arquitectura de kernel usar debe decidir primero cuál es su objetivo final. Los sistemas de microkernel son (cuando se implementan adecuadamente, por supuesto) más seguros, mantenibles y modulares. Sin embargo, pueden ser difíciles de diseñar correctamente y pueden tener una sobrecarga de rendimiento sobre una implementación monolítica. Un núcleo monolítico será más rápido, pero la seguridad será más difícil de implementar y será menos modular y menos fácil de personalizar.

La arquitectura de su núcleo debe basarse en cuál es su objetivo final.

(Y cuando todo lo demás falla, pruébelo en ambos sentidos y vea qué sucede).

Adam Maras
fuente
"Pero todos los dispositivos Apple de esta década ejecutan Mach, y parecen funcionar bastante rápido, ¿verdad?" Eso es solo parcialmente correcto. "El núcleo de Darwin es XNU, un núcleo híbrido que utiliza OSFMK 7.3 (Open Software Foundation Mach Kernel) del OSF, varios elementos de BSD (incluido el modelo de proceso, la pila de red y el sistema de archivos virtual) y un sistema orientado a objetos. API de controlador de dispositivo llamada I / O Kit. El diseño del núcleo híbrido proporciona la flexibilidad de un microkernel y el rendimiento de un núcleo monolítico ".
Behrang Saeedzadeh
4

Prefiero llamar a Windows NT y al núcleo XNU de Apple monolítico en lugar de híbrido. No encuentro que la clasificación de híbrido tenga mucho significado en la práctica. De hecho, uno de los ingenieros originales de XNU lo llama monolítico [1].

Sobre el tema del rendimiento, la única comparación realmente profunda de monolítico frente a micro que puedo encontrar es "Computación de alto rendimiento extrema o Por qué los microkerenels chupan" [2] y una presentación de refutación "Do Microkernels Suck?" [3].

La modularidad y la personalización son más problemas de diseño que limitaciones inherentes en los núcleos monolíticos. El kernel de Linux, por ejemplo, puede variar desde varios megabytes hasta alrededor de un megabyte de tamaño dependiendo de las opciones de tiempo de compilación y la aplicación de ciertos parches. La gran mayoría de las más de 15 millones de líneas de código de Linux son módulos de kernel cargables. Se compilan por separado del núcleo base y solo se cargan cuando es necesario. Esos módulos pueden implementar controladores y llamadas al sistema (incluso anulando las llamadas al sistema base).

Las dos áreas donde los microkernels tienen una ventaja indiscutible son la memoria baja (<= 512k ram) o los sistemas operativos en tiempo real "duros", como los sistemas de vuelo de las aerolíneas o los sistemas de control de reactores nucleares.

Editar: Hablando más sobre las ventajas y desventajas de cualquiera de las arquitecturas del núcleo, Gernot Heiser admite libremente al final de su presentación [3] que los núcleos monolíticos son inherentemente más eficaces porque un microkernel siempre tiene algo de sobrecarga adicional. Sin embargo, esa sobrecarga adicional conduce a una mayor confiabilidad, por lo tanto, el dominio de microkernels de RTOS.

[1] Louis G. Gerbarg, "Sincronización avanzada en Mac OS X: extensión de Unix a SMP y en tiempo real", Actas de la Conferencia BSDCon 2002, págs. 2

[2] Chistoph Lameter, "Computación de alto rendimiento extremo o por qué los microkernels apestan", Simposio de Linux 2007, Volumen Uno

[3] Gernot Heiser, "Do Microkernels Suck?", Noveno Linux.conf.au, enero de 2008

Ironlenny
fuente
Estaba clasificando XNU y Windows NT como núcleos "híbridos"
mmk
Gracias @DW por la bienvenida. Limpié un poco mi publicación y agregué citas.
Ironlenny
@mmk Lo siento, los llamaste híbridos, tenía prisa por hacer mi publicación y leer mal.
Ironlenny