Un unikernel es un programa informático vinculado estáticamente con el código del sistema operativo del que depende. Los unikernels se construyen con un compilador especializado que identifica los servicios del sistema operativo que utiliza un programa y lo vincula con uno o más sistemas operativos de biblioteca que los proporcionan. Un programa de este tipo no requiere un sistema operativo separado y puede ejecutarse en su lugar como invitado de un hipervisor . [1]
La arquitectura unikernel se basa en conceptos desarrollados por Exokernel y Nemesis a finales de la década de 1990.
En un sistema operativo de biblioteca, los límites de protección se amplían hasta las capas de hardware más bajas, lo que da como resultado:
La arquitectura del SO de biblioteca tiene varias ventajas y desventajas en comparación con los diseños de SO convencionales. Una de las ventajas es que, dado que solo hay un único espacio de direcciones, no hay necesidad de transiciones de privilegios repetidas para mover datos entre el espacio de usuario y el espacio del núcleo. Por lo tanto, un SO de biblioteca puede proporcionar un rendimiento mejorado al permitir el acceso directo al hardware sin tener que realizar la transición entre el modo de usuario y el modo de núcleo (en un núcleo tradicional, esta transición consiste en una sola instrucción TRAP [2] y no es lo mismo que un cambio de contexto [3] ). Se pueden lograr ganancias de rendimiento mediante la eliminación de la necesidad de copiar datos entre el espacio de usuario y el espacio del núcleo, aunque esto también es posible con los controladores de dispositivos de copia cero en los sistemas operativos tradicionales.
Una desventaja es que, como no existe separación, intentar ejecutar varias aplicaciones en paralelo en un sistema operativo de biblioteca, pero con un fuerte aislamiento de recursos, puede resultar complejo. [4] Además, se requieren controladores de dispositivos para el hardware específico en el que se ejecuta el sistema operativo de biblioteca. Como el hardware cambia rápidamente, esto crea la carga de tener que reescribir periódicamente los controladores para que se mantengan actualizados.
La virtualización de SO puede superar algunos de estos inconvenientes en el hardware de consumo. Un hipervisor moderno proporciona a las máquinas virtuales tiempo de CPU y dispositivos virtuales fuertemente aislados. Un SO de biblioteca que se ejecuta como una máquina virtual solo necesita implementar controladores para estos dispositivos de hardware virtuales estables y puede depender del hipervisor para controlar el hardware físico real. Sin embargo, las bibliotecas de protocolos siguen siendo necesarias para reemplazar los servicios de un sistema operativo tradicional. La creación de estas bibliotecas de protocolos es donde radica la mayor parte del trabajo al implementar un SO de biblioteca moderno. [1] Además, la dependencia de un hipervisor puede reintroducir sobrecargas de rendimiento al cambiar entre el unikernel y el hipervisor, y al pasar datos hacia y desde dispositivos virtuales del hipervisor.
Al reducir la cantidad de código implementado, los unikernels necesariamente reducen la superficie de ataque probable y, por lo tanto, tienen propiedades de seguridad mejoradas. [5] [6]
Un ejemplo de cliente de mensajería basado en unikernel tiene alrededor del 4% del tamaño de las bases de código equivalentes que utilizan Linux. [7]
Debido a la naturaleza de su construcción, es posible realizar una optimización de todo el sistema en los controladores de dispositivos y la lógica de la aplicación, mejorando así la especialización. [8] [9] [10] Por ejemplo, las aplicaciones estándar como nginx, SQLite y Redis que se ejecutan sobre un unikernel han mostrado una mejora del rendimiento de 1,7x-2,7x. [11]
Se ha demostrado regularmente que los Unikernels se inician extremadamente rápido, a tiempo para responder a las solicitudes entrantes antes de que se agote el tiempo de espera de las solicitudes. [12] [13] [14]
Los unikernels se prestan a la creación de sistemas que siguen arquitecturas de software orientadas a servicios o microservicios .
El alto grado de especialización significa que los unikernels no son adecuados para el tipo de computación multiusuario de propósito general para la que se utilizan los sistemas operativos tradicionales. Generalmente no es posible agregar funcionalidad adicional ni modificar un unikernel compilado, y en su lugar, el enfoque consiste en compilar e implementar un nuevo unikernel con los cambios deseados.
. . . casi todas las llamadas al sistema [se] invocan desde programas C llamando a un procedimiento de biblioteca . . . El procedimiento de biblioteca . . . ejecuta una instrucción TRAP para cambiar del modo de usuario al modo kernel e iniciar la ejecución . . .