Ejemplo sencillo para entender las diferencias entre un kernel monolítico y un microkernel

By marjuanm | msproys | 16 May 2022


Ejemplo de un sistema operativo

El sistema operativo es quien administra los recursos de una computadora y el acceso a los mismos | Cortesía de Pixabay

Que tal, un saludo para todos y gracias por seguir visitando este blog.

  Un sistema operativo de acuerdo con la definición que ofrece Wikipedia es que se trata de un software que administra todos los recursos de un equipo de cómputo, así mismo permite al resto de los programas interactuar con el hardware y otros recursos disponibles reduciendo con ello los tiempos de desarrollo, pues el programador no debe preocuparse por implementar todas las rutinas para que su software se ejecute correctamente. Además el sistema operativo mantiene la seguridad del sistema al ser él y no el software creado por el usuario quien administre los recursos de la computadora, evitando con ello el mal uso de los mismos o su deliberado daño como por ejemplo al implantar algún tipo de malware.

  Una parte clave de un sistema operativo es el kernel; el kernel es el corazón de un sistema operativo y consiste en una serie de rutinas que permiten al sistema operativo administrar los procesos y accesos al hardware limitando el acceso no autorizado a los mismos. Por ejemplo los programas no pueden acceder al hardware directamente, sino que lo hacen a través del kernel; siendo él quien administre quien puede por ejemplo acceder al disco, que información puede consultar o modificar y todo el tiempo supervisa el consumo de recursos. Si algo resulta fuera de las reglas el kernel bloqueará el acceso al recurso o tomará otra serie de medidas al respecto.

  Hay dos tipos de kernel principalmente: monolítico y microkernel¿Cuáles son las principales diferencias entre ambos y que ventajas/desventajas presenta cada uno de ellos?. Pongamos un ejemplo para entenderlo más fácilmente.

Un ejemplo para comprender como funcionan los dos tipos de kernel

  Supongamos que en la empresa "X" a un trabajador se le delega que además de su trabajo, debe realizar el trabajo de cuatro o cinco empleados al mismo tiempo, lo acepta porque muchas veces no tienen más remedio y entonces comienza a hacer mucho más trabajo del que debería realizar, ¿podrá realizarlo?, sí, pero a que costo: tardará más tiempo en realizarlo, se estresará mucho más, estará sumamente presionado por tanta carga de trabajo y finalmente no aguantará mucho, con cualquier cosa sentirá que ya no puede más.

  ¿Qué debería hacer la empresa?, pues quitarle trabajo a ese empleado y delegarlo a otros trabajadores o contratar a otros para que realicen ese exceso de trabajo. Supongamos que Juan está en esa situación tan agobiante de exceso de trabajo, pero ahora se contrata a Jorge, Pedro, Guadalupe y Francisco y cada uno realiza una tarea diferente reduciéndole la cantidad de trabajo que debe realizar Juan, ¡¡¡Qué alivio para Juan!!!, ¿o no?.

  No del todo porque ahora hay un problema, si cada uno de estos trabajadores trabaja por su lado, sin tener una comunicación efectiva entre ellos y tampoco tomando en cuenta las reglas de operación o aplicándolas a su criterio personal, entonces el trabajo final no servirá de nada, tendrán que repetirse muchos procesos y perdiendo tiempo en el proceso. Se necesita que alguien supervise el trabajo de ellos y coordine todas las operaciones para que el trabajo se realice correctamente.

  Tomando como base este ejemplo sencillo, veremos que un kernel monolítico es como ese empleado que debe hacer todo él solo. Sin embargo debido a la enorme carga de trabajo y a que todos los procesos se ejecutan en un mismo espacio de trabajo, es susceptible a que si un programa falla podría colapsar a todo el sistema (todo dependerá por supuesto de que tan efectivo sea el núcleo para manejar este tipo de eventualidades); también requiere de mayor tamaño en sus módulos para poder implementar todas las funciones y claro, resulta más difícil de mantener pues cada cambio requiere mantener la compatibilidad con los desarrollos ya existentes.

  Por el contrario, un microkernel es aquel kernel que separa en una serie de módulos todas sus operaciones y delega a cada módulo una tarea particular, se debe sincronizar todos los módulos para que todo funcione correctamente. Es como aquella empresa que tiene un trabajador para cada tarea y así no estresan al máximo a cada trabajar, realizan únicamente su trabajo y hay un supervisor para todo el equipo de trabajo; las ventajas son obvias, mayor agilidad para que cada trabajador desempeñe su trabajo, menor estrés emocional, pero, debe pagarse un sueldo a cada trabajador, además de otras prestaciones que la ley exige. En cambio si un solo trabajador realiza el trabajo de cuatro o cinco empleados la empresa "podría" optar por solo pagar un sueldo y exigir a ese empleado cumpla con sus exigencias ahorrando recursos en el proceso pero sobrecargando al trabajador de trabajo.

Así pues las ventajas de un kernel monolítico son las siguientes:

  • Todos los módulos y procesos necesarios para hacer funcional a este kernel están en un mismo espacio de trabajo, tiene como ventaja la velocidad de ejecución y comunicación entre ellos.
  • El desarrollo del kernel requiere menos tiempo para implementarlo porque no debe tener en cuenta tareas de sincronización entre procesos, tampoco tener tantas verificaciones de redundancia en las comunicaciones pues todo se realiza de manera directa.
  • Requiere menos recursos para ejecutarse pues al ocupar un solo espacio de trabajo para todos sus procesos no debe requerir de recursos especializados para cada modulo, como si ocurre en el caso de un microkernel. Cada uno de ellos requiere una cola para administrar los mensajes entre ellos, mientras que en un kernel monolítico la comunicación es directa entre los diferentes módulos.
  • Todos los módulos que forman parte del kernel se ejecutan con privilegios altos, lo que permite acceder a los recursos del computador sin ninguna restricción, agilizando el tiempo de acceso a los mismos y también reduciendo código en el desarrollo pues no requiere validaciones adicionales ya que se da por hecho que este espacio de trabajo es seguro y ningún otro módulo "extraño" tendrá acceso al mismo.

Las desventajas son las siguientes:

  • El tamaño del kernel es mayor que el de un microkernel, pues engloba todos los procesos y servicios necesarios en un solo paquete. 
  • Debido a que se da por hecho que el espacio de trabajo es seguro, cualquier fallo o ataque al mismo podría hacer que colapsara el kernel al no contemplar posibles accesos no autorizados al mismo.
  • También un proceso que presentara un mal funcionamiento podría hacer que el kernel se colgara y todo el sistema operativo podría comenzar a fallar hasta que colapse.
  • Puesto que todo el código forma parte de un solo ejecutable (o unos pocos sincronizados), cualquier cambio que no se encuentre correctamente implementado y validado podría ser catastrófico, además de que debe mantener la compatibilidad con lo ya existente. Lo que dificulta  que pueda ser extendido a nuevas funcionalidad (dependiendo clara está todo esto de como halla sido desarrollado el kernel pues puede haber cierta flexibilidad en la administración del código fuente, pero al final todo se englobará en un solo ejecutable).

Por contraparte veamos las ventajas de un microkernel:

  • En un microkernel todo se separa en una multitud de módulos y solo aquellos estrictamente necesarios forman parte del kernel, el resto se van a otros espacios de trabajo, con ello se reduce el tamaño del mismo.
  • Puesto que cada módulo forma parte de un proceso independiente, entonces si alguno de ellos falla no habrá riesgo de cuelgue para todo el sistema operativo. Bastará reiniciar dicho módulo para devolver la funcionalidad perdida, en contraparte un kernel monolítico requerirá reiniciar todo el sistema operativo.
  • El sistema operativo puede ser extendido fácilmente con nuevas funcionalidades, pues cada nueva función se montará en un módulo independiente sin tener que recompilar todo el kernel, solo las secciones afectadas.
  • Hay mayor seguridad en comparación con un kernel monolítico, mientras que en un kernel monolítico todo se ejecuta en un mismo espacio de trabajo, en un microkernel todo se separa en una multitud de procesos. Cada proceso está separado de los demás, no hay comunicación directa entre ellos, sino que se hace a través de una cola de mensajes, esto tiene como ventaja que si uno de ellos falla no afecte gravemente al resto del sistema operativo, tampoco se puede acceder desde un modulo a otro directamente evitando con ello que pueda ser manipulado maliciosamente.

Pero así como tiene ventajas, también hay importantes desventajas en un microkernel:

  • Puesto que cada módulo tiene que estar perfectamente sincronizado con los demás, esto requiere mayor tiempo de desarrollo en el sistema operativo.
  • Tiene que haber más medidas de seguridad entre la comunicación entre procesos puesto que cualquier fallo podría hacer que no hubiera una comunicación efectiva entre ellos, cada módulo debe estar blindado contra fallos, de manera que el mal funcionamiento de un módulo no afecte a los demás, esto tiene como desventaja el mayor tiempo de desarrollo de todo el kernel como ya se mencionó en el punto anterior.
  • La comunicación es más lenta comparada con el kernel monolítico, pues no hay comunicación directa, sino por una cola de mensajes.
  • La ejecución del kernel es más lenta comparada con el kernel monolítico pues debe haber sincronización entre cada proceso, si dicha sincronización no está funcionamiento correctamente debe reintentarse una y otra vez hasta que todo funcione correctamente.
  • Si todo no está funcionando correctamente, esto conducirá a problemas difíciles de tratar, por lo que debe haber muchas validaciones en cada paso durante el desarrollo llevando con ello al mayor tiempo para desarrollar un kernel bajo esta filosofía.

Conclusiones:

  Los dos métodos de trabajo para un kernel presentan ventajas y desventajas, sin embargo, debido a que es más fácil implementar un kernel monolítico, esto ha hecho que se prefiera como método de trabajo para la mayoría de los sistemas operativos importantes; por ejemplo: Windows en sus primeras versiones usaba un kernel de este tipo, actualmente un híbrido que toma características de ambos tipos de kernel, igualmente ocurre con las versiones más recientes del sistema operativo Mac OS. Linux (que es un kernel en si mismo, no confundir con una distribución Linux) también usa un kernel monolítico al igual que las primeras versiones del sistema operativo de las computadoras Mac.

  Por otra parte, aunque la cantidad de sistemas operativos que usan un microkernel es mayor que que los que usan un kernel monolítico, no son tan conocidos, pueden ver una lista visitando el siguiente artículo de Wikipedia para mayor información.

 

How do you rate this article?

1


marjuanm
marjuanm

I'm a VB.NET Programmer, but too programming on PHP, greetings.


msproys
msproys

Blog informático para dar a conocer mis proyectos, soy desarrollador de sistemas y partidario del software libre. Por medio de este blog estaré dando a conocer algunos de mis trabajos, así como publicando diversos códigos fuentes útiles.

Send a $0.01 microtip in crypto to the author, and earn yourself as you read!

20% to author / 80% to me.
We pay the tips from our rewards pool.