La concurrencia es uno de los esquemas más recientes que se
han introducido a la computación. Como es sabido, y como lo reitera Joe
Armstrong en su podcast, la concurrencia se generó alrededor del año 2003, una
vez que las empresas que fabrican procesadores llegaron al límite físico, en la
tendencia por el incremento de la frecuencia de reloj de los mismos
procesadores. La razón principal: sobrecalentamiento, ya que la misma
frecuencia de reloj incrementa proporcionalmente la potencia consumida por el
procesador. Dado esto, la nueva tendencia es el desarrollo de chips que
contengan varios procesadores, capaces de trabajar simultáneamente, ya sea
compartiendo información en memoria, o cada núcleo con su segmento de memoria
privado.
Joe Armstrong enfatiza que muchas de las tecnologías que se
usan hoy en día para generar concurrencia, en realidad no son concurrentes,
sino que sin formas de hacer que el calendarizador del sistema operativo mande
los diferentes procesos, o threads a los diferentes núcleos que tiene una misma
computadora. Sin embargo, estas tecnologías no permiten que un sólo ordenador
envíe procesos a los núcleos de otro ordenador. En otras palabras, si tenemos
acceso a otro ordenador mediante una conexión a Internet u otro medio, no
podríamos utilizarlo para realizar multiprocesamiento aunque el vínculo sea
compatible para ello. Se pueden implementar tareas como el “message passing”,
entre otros; para realizar multiprocesamiento. Sin embargo, estas
implementaciones son costosas en tiempo y recursos de los equipos.
Erlang es un algo similar a un sistema operativo que permite
a los programadores realizar segmentos de código que realmente sean capaces de
correr por sí mismos en una computadora con un procesador multinúcleo, e
inclusive utilizar nodos para intercomunicar computadoras entre sí, y que cada
proceso funcione de manera independiente completamente, en relación a los demás
núcleos y/o chips de procesador. Una de las cualidades de Erlang, es que
soporta el “message-passing”; sin embargo, esto se utiliza solamente cuando es
requerido, y no es una implementación fija en cada programa en Erlang.
Joe Armstrong enfatiza que hay 3 cuestiones en las que
debemos siempre tener cuidado para lograr una verdadera aplicación concurrente,
y evitar muchas cosas que terminan haciendo de nuestro programa una
implementación más parecida a una secuencial que a una paralela: a) el tiempo
de cambio de contexto, b) el tiempo de paso de mensaje, y c) el tiempo de
creación de los procesos. Personalmente, a estos puntos les puedo dar validez,
como ingeniero electrónico, ya que a nivel de hardware es más eficiente un
procesador que tarde menos en cambiar de contexto, en especial para las
aplicaciones de alto riesgo y que trabajan mediante interrupciones. Si un
procesador se espera mucho tiempo en atender una interrupción de alta
prioridad, la secuencia de atención no sería ejecutada a tiempo, y podría tener
resultados catastróficos. Por ejemplo, si tenemos un microcontrolador,
interconectado con muchos otros, y este microcontrolador tarda en procesar que
nuestro coche ha chocado y no trabaja oportunamente, el mensaje que debe
recibir el microcontrolador que maneja las bolsas de aire, no las abriría a
tiempo y los pasajeros correrían peligro de muerte.
Será interesante ver las implementaciones que se pueden
hacer con Erlang, y las ventajas que tiene este “lenguaje” en comparación de
las tecnologías thread y Fork/Join.
No hay comentarios.:
Publicar un comentario