Uno de los lectores de nuestro blog (Josema) se puso en contacto conmigo para consultar que posibilidades tenemos en un kernel 2.6.x para definir el tiempo de CPU que queremos asignar a cierto proceso, o bien definir que tareas quieres que tengan mayor tiempo de CPU frente al resto.
Dándole vueltas al asunto, se me ocurrieron varias posibilidades, tal vez la menos intrusiva y más sencilla pasa por jugar un poco con las prioriades de los procesos usando los comandos nice y renice.
De cualquier modo, mucho más alla de esta sencilla aproximación al objetivo está la posibilidad de trabajar usando tiempo real.
Josema ha tenido la amibilidad de mandarme unas líneas explicándome como había conseguido sus objetivos usando hilos de ejecución en tiempo real sobre un sistema embebido uCLinux:
pthread_attr_setschedpolicy(&m_RtpThreadAttr, SCHED_RR)
Al habilitar esta política de planificación, trabajamos con threads en tiempo real pero el kernel se bloquea (entra en Livelock). Un livelock es similar a un deadlock, excepto que el estado de los dos procesos envueltos en el livelock constantemente cambia con respecto al otro. Livelock es una forma de inanición y la definición general sólo dice que un proceso específico no está procesando.
Nos comentaba que este es un problema de la version 0.7 de LinuxThread incluidas en uClib. Este problema esta solucionado en la version 0.8, pero para uClinux no había encontrado nada. Como ya hemos comentado están usando uClinux en su sistema embebido.
Parece que han encontrado una solución temporal para que el kernel no se bloquee poniendo un sleep en el thread.