29 de septiembre de 2006

Detección asíncrona de dispositivos en Linux 2.6.19

Suena raro, pero en realidad es muy simple. A día de hoy, cuando el kernel inicializa los dispositivos lo hace de forma síncrona. Es decir, se inicia el kernel, se van iniciando los subsistemas, se ejecutan los drivers que están incluidos dentro del kernel...y se espera a que termine para continuar haciendo otras cosas. O sea, se hace de un modo lógico: Se carga el driver, se detecta el dispositivo, se termina y se sigue haciendo otra cosa.

Este sistema tiene problemas. Por ejemplo: Mucha gente recordará, antes de que se pusieran de moda las pantallas de arranque (bootsplash) y de que se silenciara la salida del kernel, que el kernel se pasaba un rato (¿segundos, quizás?) "escaneando" el bus IDE. Y qué decir de SCSI, que puede tirarse medio minuto perfectamente.

El problema aquí es que ese método de detección de dispositivos es ineficiente: El kernel se pasa segundos parado, esperando a algo, a pesar de que aun tiene cosas de hacer. Lo eficiente sería que el kernel continuara inicializando otras cosas, mientras que se termina de detectar lo que sea. Más aun, sería recomendable que se pudiera detectar simultaneamente lo dispositivos IDE, SCSI, USB, mientras el kernel continua arrancando. Este problema afecta principalmente a los dipositivos embebidos, que aspiran a tener un inicio lo más corto posible.

Así que Greg Kroah-Hartman, el gran asesino de devfs, ha implementado la infraestructura para cambiar las cosas. Se crea un nuevo thread (porque los kernels bien hechos tienen infraestructura interna para lanzar threads propios y mejorar el diseño de algunos puntos, a diferencia de lo que cuentan desde el mundo de los microkernel) que inicializa el dispositivo, mientras que el kernel sigue ejecutándose. Cuando llega la hora de ejecutar init, el kernel espera a que terminen los threads que inicializan los dispositivos, si es que no han terminado (con procesadores multicore, los threads se ejecutarían en paralelo). Es más, supongo que esta idea se podría extender para permitir que se pueda montar el sistema de archivos raiz y que se ejecute aunque no hayan terminado de detectarse, pongamos, los dispositivos USB - bien por lentitud del proceso, o bien por un fallo de hardware o software.

De momento no está activado - por mucho que se diga, los hackers del kernel no meten cosas inestables a go-go -, pero ya se han mandado parches experimentales para implementarlo para el subsistema PCI, para SCSI...en fin, algo interesante

6 comentarios:

  1. Cierto, muy interesante.

    ResponderEliminar
  2. He actualizado a blogger beta, y por alguna razón al planet no le caigo bien.

    ResponderEliminar
  3. Interesante sin duda.

    Ten cuidado con la beta, que juega malas pasadas, pero en líneas generales es mejor (cruzo los dedos para que no vuelvan los problemas).

    ResponderEliminar
  4. Anónimo6:53 p. m.

    Mmm, qué interesante... pero esas cosas ya las tenía BeOS en 1995, y sí, es microkernel. De hecho, en un PII tardaba en arrancar 15 segundos ¿cuando podrá hacer eso linux? NUNCA. Siento desilusionarte.

    ResponderEliminar
  5. Anónimo11:01 p. m.

    diego:
    Bueno, tampoco lo hace windows, y BeOS está MUERTO Y ENTERRADO desde hace muchísimo, así que en ver de trollear, reconoce que es un avance positivo.

    ResponderEliminar
  6. Anónimo11:27 p. m.

    BeOS está muerto y enterrado, cierto ¿haiku?

    Y ningún avance es positivo en un kernel obsoleto.

    Y sí, linux mola, hay que usarlo porque es código libre y gratis, pero no me digáis que la filosofía de kernel monolítico está bien a estas alturas, por favor.

    El problema es que nadie se lo plantea y da el salto a lo realmente bueno, no sólo para los programadores, sino también (y quizás más importante) para los usuarios finales ¿qué es más fácil cuando hay que instalar un nuevo driver, recompilar el kernel o dejarlo en el directorio donde debe estar?

    Y, por cierto, si no te importa, creo que dar la opinión no es trollear. O ¿acaso he dicho alguna mentira?

    ResponderEliminar