Programación concurrente en Linux

# Guia del curso

Este curso sobre Programación concurrente en Linux está orientado a complementar la formación de estudiantes de ingenierías que carecen de competencias en sistemas operativos y técnicas de programación concurrente, así como de profesionales que necesitan aplicar estas técnicas en entornos Linux. Los conceptos, métodos, técnicas y herramientas objetivo del curso son de aplicación en ámbitos como la robótica, la monitorización, el control y en general todo tipo de sistema empotrado, donde sistemas de propósito general como Linux son cada vez más habituales.

## ¿Cumplo los requisitos necesarios para el curso?

Es necesario un cierto manejo de programación en C o un lenguaje similar, así como algunos conocimientos de arquitectura de computadores (bastará por ejemplo haber hecho un curso sobre microprocesadores). No se presuponen conocimientos previos de Linux. Si los tienes, puedes pasar con rapidez por algunas de las actividades del curso. Si nunca has trabajado con Linux, ni siquiera a nivel de usuario, solamente te costará un poco más al principio.

Parte del material con el que tendrás que trabajar, en particular los manuales, está en inglés, así que conviene que te manejes en este idioma a nivel de lectura.

Nota

Ya sea por falta de costumbre o porque la alternativa “no suena bien”, la documentación del curso puede estar sesgada hacia la utilización del género masculino. Pido disculpas por ello. Si escribí “programador”, que es el término al uso, debería haber escrito “persona programadora”. No es excusa el que las mujeres no lleguen al 10% en las facultades de informática. Hace 30 años eran la mitad. Y la primera persona programadora fue una mujer, Ada Lovelace. No hay ningún motivo, por lo tanto, para asumir que la programación es cosa de hombres.

## Objetivos y competencias

### ¿Qué aprenderé en el curso?

El tratamiento concurrente de las entradas proporcionadas por los diferentes sensores de un robot es un problema representativo de muchas situaciones a las que un programador de sistemas empotrados debe enfrentarse. En el curso aprenderás los mecanismos y los conceptos subyacentes de la programación concurrente para manejar estas situaciones de manera coordinada y eficiente. Aprenderás los diferentes enfoques (por ejemplo, concurrencia a nivel de procesos y a nivel de hilos o threads), y sus ámbitos de aplicación adecuados, así como la forma de verificar correctamente las soluciones.

Aunque nos centramos en Linux y en C, los mecanismos que vas a usar son lo suficientemente universales como para que puedas aplicarlos sobre otra plataforma o lenguaje de programación. Al respecto aprenderás también el problema de la compatibilidad y la importancia de usar estándares generalmente aceptados (por ejemplo, POSIX).

El curso está orientado a la interfaz de programación y solo profundiza en los aspectos del soporte lo necesario para que se comprenda adecuadamente el funcionamiento de la interfaz. Por ejemplo, no aprenderás a instalar los sensores en un robot Linux, ni a desarrollar los drivers para manejarlos.

### ¿Qué competencias profesionales adquiriré?

Terminado el curso, no podrás considerarte un(a) experto/a en programación concurrente ni en Linux. Ten en cuenta que la plataforma y sus herramientas, tras décadas de ampliaciones, es demasiado compleja como para pretender abarcarla en su totalidad en este curso. Lo que se pretende en cambio es que el curso te proporcione las claves para que, con el tiempo, puedas convertirte en experto/a. Por eso verás que las actividades insisten más en aspectos metodológicos (cómo aprender) que en contenidos (qué aprender).

De esta forma, durante el curso deberías desarrollar un cierto nivel de competencia en cuanto a:

- Entender la especificación funcional de una herramienta o aplicación.
- Ante un problema nuevo, encontrar en los manuales de Linux la documentación que te permitirá resolverlo de la forma más adecuada.
- Identificar y resolver los problemas derivados de la complejidad de la programación concurrente.
- Dado el código de un programa concurrente, identificar sus implicaciones en cuanto a compatibilidad, eficiencia y mantenimiento.
- Aplicar el enfoque más adecuado para la construcción de una aplicación concurrente, teniendo en cuenta criterios de compatibilidad, eficiencia y facilidad de desarrollo.
- Verificar el funcionamiento de un programa a partir de su especificación.

Desarrollar esas habilidades te permitirá, con el tiempo, convertirte en un experto en la materia.

## ¿Cómo es el método de trabajo?

El curso está orientado al desarrollo de un proyecto, dividido en cuatro partes. Es eminentemente práctico y se desarrolla siguiendo una secuencia de actividades.

El proyecto consiste en el desarrollo de un módulo para un robot explorador basado en Linux con diferentes sensores. El desarrollo es incremental a través de las cuatro partes del curso, culminando la ultima parte con la aplicación funcionando sobre cualquier plataforma Linux. No dispondrás del robot real, pero el código desarrollado podría ser directamente portado a un robot Linux dotado de los sensores adecuados. La utilización de Linux como sistema soporte se justifica por su amplia difusión en el mundo de los sistemas empotrados, la claridad de los conceptos que maneja y su carácter de código abierto.

### ¿Cómo son las actividades del curso?

Lo habitual es que una actividad comience planteando un problema o experimento que te obligue a una exploración de alternativas de resolución, que podrás contrastar mediante un conjunto de pistas o experimentos adicionales. Los conceptos que van surgiendo se explican mediante lecciones cortas o mediante presentaciones. Una vez que la solución está encauzada, habitualmente se pide que la implementes. Finalmente tendrás que verificar tu solución con respecto a la especificación del problema siguiendo un método propuesto.

Una actividad suele tomar como punto de partida los resultados de la anterior. Para facilitar las cosas en lo posible, los desarrollos son incrementales e incluyen fases previas de exploración y tanteo. Habitualmente tendrás acceso a ejemplos que te servirán como plantilla y te ofreceré pistas para enfocar la solución.

Cada actividad finaliza normalmente recogiendo una valoración de los resultados, y a veces con un test de autoevaluación específico, como explicaré más adelante.

Aunque dispondrás del código resultante de los desarrollos, la idea es que nunca tengas que echar mano de él. Te facilito una serie de recomendaciones para ello.

### ¿Puedo trabajar con otra gente?

Si consigues animar a alguien para seguir el curso conjuntamente, ¡mucho mejor! Las ventajas de trabajar en equipo son incuestionables: tendrás con quien discutir las alternativas, permite que otras personas verifiquen tus soluciones y proporciona apoyo en los momentos difíciles. Si vas a trabajar en equipo vale la pena invertir algo de tiempo en organización: definid los roles de cada miembro al comienzo de cada actividad y asignad plazos para ejecutar las tareas.

### ¿Cómo verifico que estoy aprendiendo?

Mediante un una serie de mecanismos de autoevaluación contenidos en las actividades.

## Programa de actividades y desarrollo temporal

Las cuatro partes del curso se centran respectivamente en los siguientes aspectos:

> 1. Toma de contacto con Linux, gestión del entorno de desarrollo y un primer acercamiento a las interfaces de programación de Linux.
> 2. Manejo de la entrada/salida de datos en Linux.
> 3. Control de programas en Linux y manejo de la concurrencia con procesos.
> 4. Comunicación entre procesos, programación multihilo y coordinación de recursos compartidos.

Para una dedicación de media jornada (de 3,5 a 4 horas diarias), podrías completar el curso en aproximadamente un mes. Cada una de las tres primeras partes te requerirá una semana de trabajo, mientras que la cuarta parte, algo más larga, te exigirá semana y media. Sin embargo, el tiempo que realmente debas dedicar dependerá mucho de tu nivel de formación previo. Algunas actividades incluyen baterías de ejercicios para contrastar tu nivel inicial.

Para cada actividad se especifica al principio su duración estimada. También tienes un resumen de las actividades y su duración. Como verás, la suma total del tiempo de dedicación es de 68 horas. Sin embargo, es muy probable que tengas dificultades en algún punto (ten en cuenta que vas a desarrollar software con herramientas complejas), así que una estimación de unas 80 horas de trabajo parece realista.

## ¿Qué material y recursos necesito?

El curso completo se proporciona en forma de un recurso web que puedes descargar para desplegar y ver off-line en tu ordenador. Esto es más ágil que seguir el curso on-line.

El recurso web contiene no solo el guión de las actividades, sino también, enlazados desde los puntos adecuados, cualquier material que necesites para el desarrollo de las actividades, ya sea código o documentación. El único material que no está incluido son las soluciones de las actividades, fundamentalmente el código que deberás desarrollar. Es de esperar que el método incremental con el que se desarrolla el curso, los materiales auxiliares que se proporcionan y la abundante ayuda que puedas encontrar en Internet sean suficientes para que puedas finalizar satisfactoriamente todas las actividades. No obstante, como último recurso, en el sitio OCW del curso podrás encontrar un archivo comprimido con las soluciones.

En resumen, los recursos que necesitas son:

- El recurso web a descargar del sitio OCW del curso.
- Un ordenador con Linux (o un sistema compatible).
- Documentación adicional en la Web, según se sugiere en algunas actividades. Por ejemplo, para buscar ejemplos de código que te ayuden en el desarrollo, o para consultas adicionales en manuales o en foros.
- Algunas fuentes bibliográficas. No son imprescindibles, pero pueden resultar convenientes para adquirir otra perspectiva.
- Las soluciones a los trabajos propuestos, en la web del curso OCW (solo en caso de emergencia).