Linux y tiempo real
GNU/Linux (Linux) es uno de los términos empleados para referirse al sistema operativo libre similar a Unix que utiliza el núcleo de Linux y herramientas de sistema GNU. Su desarrollo es uno de los ejemplos más prominentes de software libre.
Linux hace su aparición a principios de la década de los noventa, era el año 1991 y por aquel entonces un estudiante de informática de la Universidad de Helsinki, llamado Linus Torvalds empezó, como una afición y sin poderse imaginar a lo que llegaría este proyecto, a programar las primeras lineas de código de este sistema operativo llamado Linux.
Este comienzo estuvo inspirado en MINIX, un pequeño sistema Unix desarrollado por Andy Tanenbaum. Las primeras discusiones sobre Linux fueron en el grupo de noticias comp.os.minix, en estas discusiones se hablaba sobre todo del desarrollo de un pequeño sistema Unix para usuarios de Minix que querían más.
Linus nunca anuncio la versión 0.01 de Linux (agosto 1991), esta versión no era ni siquiera ejecutable, solamente incluía los principios del núcleo del sistema, estaba escrito en lenguaje ensamblador y asumía que uno tenia acceso a un sistema Minix para su compilación.
El 5 de octubre de 1991, Linus anuncio la primera versión «Oficial» de Linux, -versión 0.02. Con esta versión Linus pudo ejecutar Bash (GNU Bourne Again Shell) y gcc (El compilador GNU de C) pero no mucho más funcionaba. En este estado de desarrollo ni se pensaba en los términos soporte, documentación, distribución .Después de la versión 0.03, Linus salto en la numeración hasta la 0.10, más y más programadores a lo largo y ancho de Internet empezaron a trabajar en el proyecto y después de sucesivas revisiones, Linus incremento el numero de versión hasta la 0.95 (Marzo 1992). Más de un año después (diciembre 1993) el núcleo del sistema estaba en la versión 0.99 y la versión 1.0 no llego hasta el 14 de marzo de 1994. Desde entonces no se ha parado de desarrollar, la versión actual del núcleo es la 2.6 y sigue avanzando día a día con la meta de perfeccionar y mejorar el sistema.
Las principales características de este sistema operativo son:
- ‣ Multitarea: La palabra multitarea describe la habilidad de ejecutar varios programas al mismo tiempo.
- ‣ Multiusuario: Muchos usuarios usando la misma maquina al mismo tiempo.
- ‣ Multiplataforma: Las plataformas en las que en un principio se puede utilizar Linux son 386-, 486-. Pentium, Pentium Pro, Pentium II, Amiga y Atari, también existen versiones para su utilización en otras plataformas, como Alpha, ARM, MIPS, PowerPC y SPARC.
- ‣ Multiprocesador: Soporte para sistemas con m as de un procesador esta disponible para Intel y SPARC.
- ‣ Funciona en modo protegido 386.
- ‣ Protección de la memoria entre procesos, de manera que uno de ellos no pueda colgar el sistema.
Otra característica de Linux es que puede trabajar en tiempo real, mediante la modificación del núcleo de Linux mediante un parche “prempt-rt”. Esta característica asegura que todos los programas que se están utilizando en un momento dado serán ejecutados, siendo el sistema operativo el encargado de ceder tiempo de microprocesador a cada programa.
Pero, ¿que es tiempo real? Las características que deben cumplir los sistemas en tiempo real son:
- ‣ Determinismo: Es la característica clave de todo sistema en tiempo real y es que debemos conocer en todo momento como nos va a responder el sistema.
- ‣ Tiempo de respuesta: Se trata de la cantidad de tiempo que tardamos en dar una respuesta al proceso una vez que este ha sido atendido y en el tiempo que tardamos en atender al proceso.
- ‣ Control de los procesos sobre el sistema: Los procesos deberán tener una prioridad en función de su tiempo de respuesta e importancia de su respuesta.
- ‣ Confiabilidad: No solo el sistema debe de estar libre de fallos sino que ademas su respuesta no puede degradarse y deberá ser capaz de recuperarse después de un fallo grave.
- ‣ Operación a prueba de fallos: Si ocurre algún fallo el sistema ademas deberá ser capaz de mantener todos sus datos y capacidades anteriores al fallo.
De entre todas estas características, el determinismo y el tiempo de respuesta son las características más importantes a la hora de definir un sistema de tiempo real, ya que el hecho de que el sistema sea confiable y a prueba de fallos esta más relacionado con la eficacia del sistema que con el tiempo de respuesta.
Por otra parte, autómata es un sistema secuencial y puede definirse como un equipo programable en lenguaje de programación (LADDER, C, ST, etc) y diseñado para controlar, en tiempo real y en ambiente industrial, procesos secuenciales.
Si nos fijamos bien en la definición anterior, tenemos el concepto de tiempo real, del cual hemos hablado anteriormente con Linux preempt-rt. Por lo tanto podemos decir que un sistema basado en Linux y con soporte en tiempo real, puede ejecutar un sistema secuencial para controlar uno o varios procesos, realizando la misma función que un autómata programable.
Pero, ¿cómo se consigue que el núcleo de Linux tenga soporte de tiempo real? El problema del kernel standard de Linux es que no se pueden interrumpir las tareas en cualquier punto, sino que hay que esperar que se cumplan ciertas pautas donde se pueda detener una tarea para conmutar a otra. Es aquí donde entra en juego un elemento importante en los sistemas operativos de tiempo real, el cual llamaremos latencia.
El parche para el kernel de Linux 2.6 desarrollado por Ingo Molnar permite reemplazar «spin-locks» con mutex (mutual exclusion mechanisms) siempre que sea posible. Esto proporciona seguridad en los recursos y la integridad requerida por el kernel para que el no se bloquee y espere.
El parche Ingo se aplica directamente a los archivos fuente del kernel Linux de la serie 2.6. Una vez que se tiene y se ejecuta el kernel parchado nuestro sistema operativo tratará de ejecutar las tareas en tiempo real. Un sistema Linux en Tiempo Real (Real Time Linux) es un Sistema Operativo que ejecuta Linux como un thread de menos prioridad que las tareas de tiempo real. Con este diseño, las tareas de tiempo real y los manejadores de interrupciones nunca se ven retrasados por operaciones que no son de tiempo real.
El parche Ingo nos permite obtener un sistema de Tiempo Real en Linux en donde es posible ejecutar tareas en tiempo real y manejar las interrupciones en una máquina Linux estándar. Estas tareas y los manejadores se ejecutan cuando se necesitan, el peor caso es entre que se detecta la interrupción de hardware y el procesador ejecuta la primera instrucción del manejador de la interrupción. Este tiempo es del orden de los 10 microsegundos en la plataforma x86.
Pero dejemos la teoría de un lado y pasemos a la practica para ver que es tan difícil utilizar un kernel con soporte de tiempo real. Lo primero que se necesita es las fuentes del kernel, las cuales se pueden descargar mediante la siguiente orden:
$ wget http://kernel.org/pub/Linux/kernel/v2.6/Linux-2.6.24.7.tar.bz2
Y a continuación nos descargamos el parche de tiempo real para el kernel en cuestión:
$ wget http://www.kernel.org/pub/Linux/kernel/projects/rt/patch-2.6.24.7-rt27.bz2
Después necesitamos descomprimir el kernel en un directorio de nuestra preferencia:
$ tar xvjf /path/to/Linux-2.6.24.7.tar.bz2
Y cambiamos a la carpeta que hemos descomprimido y aplicamos el parche:
$ cd Linux-2.6.24.7
$ patch -p1 < /path_descargas/patch-2.6.24.7-rt27
El ultimo paso es configurar nuestro kernel con las opciones necesarias para nuestro hardware y “activar el soporte de tiempo real”:
Processor type and features —>
Preemption Mode (Complete Preemption (Real-Time)) —>
( ) No Forced Preemption (Server)
( ) Voluntary Kernel Preemption (Desktop)
( ) Preemptible Kernel (Low-Latency Desktop)
(X) Complete Preemption (Real-Time)
Ya solo quedaria compilar nuestro kernel y ya estaríamos en disposición de utilizarlo en nuestra maquina x86 donde se va a ejecutar los threads de tiempo real.
Como ejemplo, veamos a continuación los diferentes jitters existentes en un kernel normal y otro al cual se le ha aplicado el parche de tiempo real:
Para finalizar, el parche de Ingo permite realizar las tareas tratando de ajustarse al deadline. Un valor negativo en las gráficas significa que la tarea empezó antes de lo debido. Un valor positivo significa que empezó después. Con un kernel normal podemos apreciar que los valores están muy dispersos y las tareas no cumplen con los deadlines impuestos. Al ejecutar el kernel con el parche de Ingo podemos apreciar que los valores están mas cercanos al cero que es el ideal. En general las tareas en el kernel con el parche Ingo cumplen con un menor rango de error las tareas en tiempo real tal y como se aprecian en las gráficas. Esto se debe en gran medida a la menor latencia que proporciona el desarrollo hecho por Ingo Molnar.
Por JMR – Larraioz Elektronika