• Del autor
  • Principios y algoritmos de concurrencia

Ricardo Galli, de software

~ De software libre, internet, legales

Ricardo Galli, de software

Archivos de etiqueta: concurrencia

Cuidado con las «clever solutions» de concurrencia

21 sábado May 2016

Posted by gallir in concurrencia, programación, trucos

≈ 1 comentario

Etiquetas

concurrencia, race condition

Ayer a última hora me encontré con este código:

Ci61so_WgAEKHf_.jpg

Quité algunas líneas para que no se pudiese deducir la empresa, que no es importante. Tampoco el programador que lo hizo, no es mi intención criticar a nadie en particular sino a una mala práctica de solucionar problemas de concurrencia con «ideas geniales» que no lo son tanta.

El código anterior recibe consultas B2B, graba los resultados en un fichero (por requerimientos de negocio) y luego lee desde esos mismos ficheros para enviar la respuesta a la agencia que hizo la consulta.

Es un software que factura millones de euros al año y pasó semanas de tests y QA. No se descubrió el problema hasta que una de los clientes optimizó sus consultas enviando varias en paralelo. Allí descubrieron que obtenían resultados erróneos: eran duplicados (con un riesgo financiero bastante importante).

Moraleja 1: Los errores de concurrencia son difíciles de encontrar y cuando aparecen suelen ser difíciles de debuguear, ten mucho cuidado antes de implementar soluciones ad-hoc.

El código intenta resolver el problema de concurrencia de varios procesos que podrían escribir en el mismo fichero verificando primero si el fichero existe, si es así incrementa el contador -que forma parte del nombre- hasta que encuentra uno que no coincida.

Además de detalles de eficiencia tiene un problema grave, las operaciones de verificación (file_exists) y creación del fichero (fopen) no son atómicas. Eso significa que varios procesos concurrentes (con una o varias CPUs) verifican, les da falso a todos y luego todos escriben en el mismo fichero. Una race condition de libro.

Moraleja 2: Si has tardado en encontrar el problema o no entiendes la importancia de operaciones atómicas ya deberías estar aprendiendo más de concurrencia.

Afortunadamente entre los tres que estábamos analizando el código en plan «emergencia» y por vídeoconferencia (la captura es del chat de Skype de Linux) desde países diferentes nos dimos cuenta enseguida del bug y de una solución simple: agregar el PID del proceso al nombre del fichero. Como el PID es único en el sistema y cada proceso individual es secuencial no hay riesgos de que sobreescriban en el mismo fichero.

No es la solución más eficiente (ya lo corregiremos estos días con más tranquilidad) pero es una solución segura y que podía implementarse en pocos minutos y sin efectos colaterales que podrían afectar a la lógica del programa.

Además, el bug podría haber sido menos perjudicial si en vez de escribir los resultados en el fichero y luego leerlos para responder se hubiese enviado directamente la respuesta ya almacenada en el proceso local.

Moraleja 3: Si no te has dado cuenta de la diferencia entre datos locales y compartidos y los problemas que pueden generar estos últimos, ponte ya a aprender de concurrencia.

Moraleja 4: Los problemas de concurrencia son muchos más habituales de los que crees y las soluciones no son tan obvias como parecen a primera vista.

Obviamente tengo que recomendar el libro que ya sabéis (y aparece a la izquierda 😉 ) pero ni aún así se puede asegurar que no cometerás errores, se requiere práctica y ser muy cuidadoso.

 

 

 

Versión impresa de «Principios y algoritmos de concurrencia»

31 lunes Ago 2015

Posted by gallir in concurrencia

≈ 5 comentarios

Etiquetas

concurrencia, edición impresa

Ya se puede comprar el libro en versión en papel. Está disponible en Amazon (también en .COM y todos los Amazon europeos) y en CreateSpace. En los próximos días y semanas estará disponible en otros canales de distribución, también para universidades e instituciones académicas.



Si adquirís la versión impresa en Amazon luego se puede comprar la versión Kindle por menos de 1 € ($ 0.99). Si tenéis algún problema o si queréis la versión para otro lector avisadme por email (gallir en gmail).

En breve haré una presentación conjuntamente con APSL en el Parc Bit en Palma. En octubre está planificado en Madrid, organizado por Open Innovation de BBA. Iré avisando.

Breve historia

No pensaba sacar, al menos en plazo tan breve, la versión impresa. El libro fue diseñado para un ebook por lo que tenía que solucionar dos problemas:

  1. Conversión adecuada a PDF.
  2. Editar y modificar porque el código completo no podía ser incluido en el papel. Serían al menos unas doscientas páginas más y tampoco se cuenta con la facilidad de hiperenlace directo a la página del código.

Pero gente de Create Space se puso en contacto conmigo para que lo saque en papel, les expliqué el problema y el trabajo adicional que me costaría la conversión. Consultaron a sus técnicos para ver si podrían convertir desde asciidoc (el formato original en el que escribí) o DocBook (el formato intermedio que usa) pero respondieron que no sabían cómo hacerlo.

Siguieron insistiendo en que haga el esfuerzo hasta que al final me convencieron (gracias Yasmin y Alessandro). El conversor más moderno, asciidoctor-pdf, no funciona correctamente todavía. Era imposible usarlo por lo que tuve que usar el «tradicional» Apache-FO. No es nada simple usarlo, de hecho es muy complicado para hacer funcionar todo el toolchain.

Una solución la dan los scripts de aciidoctor-fopub, al que tuve que hacer algunas modificaciones para que incluya el separador de sílabas. Luego aprender el formato y esquema de las hojas de estilo en XSLT que usa el Apache-FO para poder darle el formato adecuado (tamaño, páginas, fuentes, colores, cabeceras y pie de páginas, etc.).

Una vez solucionado la conversión a PDF el trabajo consistió en eliminar los apéndices y modificar las referencias para indicar los ficheros en el repositorio de Github.

Pero lo que más trabajo me llevó, diría que más de 40 horas, fue solucionar lo de la conversión a PDF que expliqué antes. Luego todo fue más sencillo, y la verdad es que en papel ha quedado muy bien. Bueno, IMHO 🙂

Principios y algoritmos de concurrencia: Fe de erratas

21 domingo Jun 2015

Posted by gallir in concurrencia

≈ Comentarios desactivados en Principios y algoritmos de concurrencia: Fe de erratas

Etiquetas

concurrencia, fe de erratas

Estas son las fe de erratas (disculpas) de las diferentes versiones del libro Principios y algoritmos de concurrencia. Cuando las hago actualizo inmediatamente las versiones de Amazon y Google Play. Pero si la habéis comprado antes no las recibís a menos que notifique que es un error importante, en cuyo caso recibiréis una versión actualizada.

El número de versión y fecha sale al principio, en la página de créditos:

Principios y algoritmos de concurrencia
© Ricardo Galli Granada
Diseño de portada: Damián Vila
Ilustraciones: Juan Ramón Mora «JRMora»
Foto: Spaghetti Worlds, Carl Milner (Flickr)
Corrección: Marilín Gonzalo y Juan Sosa
Versión: 1.0.7, 2015-06-20
Palma de Mallorca, 2015
ISBN: 978-84-606-8761-0
Licencia: CC BY-NC-ND 4.0

Sigue leyendo →

Las viñetas de «Principios y algoritmos de concurrencia»

30 sábado May 2015

Posted by gallir in concurrencia

≈ Comentarios desactivados en Las viñetas de «Principios y algoritmos de concurrencia»

Etiquetas

concurrencia, jrmora, viñetas

No sé cómo, pero conseguí que JRMora se enrolle para hacer las viñetas introductorias de cada capítulo del libro Principios y algoritmos de concurrencia. Quería darle un toque de humor sutil relacionado con el tema de cada capítulo . El pobre JRMora tuvo que escuchar explicaciones de temas muy técnicos. Creo que los dibujos, aunque muy simples (de concepto, no de trabajo),  son representativos.

Por las dudas: Copyright: JRMora Licencia, como el resto del libro: CC BY-NC-ND 4.0

Manifiesto

00-prefacio Sigue leyendo →

Principios y algoritmos de concurrencia: Prefacio

18 lunes May 2015

Posted by gallir in concurrencia

≈ 8 comentarios

Etiquetas

concurrencia, prefacio

Este artículo es el primer manuscrito del Prefacio y concurrencia del libro que estoy escribiendo Principios y algoritmos de concurrencia. Todo el código de los ejemplos están en Github.

Nota: me gustaría leer opiniones.

Manifiesto

Hace más de veinte años que enseño Concurrencia en las asignaturas de Sistemas Operativos I y II y en Programación Concurrente y Distribuida de la carrera de informática en la Universitat de les Illes Balears. A pesar de la cantidad de notas y presentaciones que elaboré en todos estos años, nunca se me pasó por la cabeza escribir un libro. Ni siquiera el típico libro de apoyo a la asignatura. Es sumamente complicado transmitir las sutilezas y conflictos generados por ejecuciones que no cumplen con la secuencialidad de sus programas. Si ya me resultaba difícil en clases magistrales y prácticas en laboratorio, me parecía tarea imposible escribir un libro.

Pero eso cambió en diciembre de 2014.

Sigue leyendo →

Ciencias de la computación e ingeniería, y [algunas de] sus diferencias

07 martes Oct 2014

Posted by gallir in ciencia, desarrollo, programación

≈ 17 comentarios

Etiquetas

concurrencia, exlcusión mutua

Hay un tema que se estudia en todas las carreras de informática, el de «sincronización, concurrencia y exclusión mutua entre procesos». Surgió en la década de 1950 cuando empezaron a desarrollarse los primeros sistemas con multiprogramación. Aunque surgió como problemática de sistemas operativos se ha convertido en un tema de general y fundamental en informática. Todas las carreras de informática incluyen su estudio tanto en las asignaturas de sistemas operativos como en otras específicas de programación concurrente.

El tema de concurrencia (y su hermano más complejo «programación distribuida») es un típico tema de «ciencias de la computación», donde se estudian los algoritmos y se prueban formalmente que funcionan: se demuestra que aseguran exclusión mutua, que no produce inanición (starvation), ni interbloqueos (deadlocks). No es simple enseñar estos temas y sus soluciones obligan a pensar de otro manera, un programa ya no es una serie secuencial de instrucciones, sino que se mete por medio una intercalación «no controlada» y no determinística de otras instrucciones de procesos independientes.

El tema de exclusión mutua es un tema relativamente sencillo de demostrar, por ejemplo este código que suma una variable desde cero hasta 99.999.999 (cien millones menos uno), pero no lo hace de una forma tradicional, sino que son dos hilos (threads) los que la incrementan individualmente. Podéis compilarlo y probarlo (no olvidéis de compilarlo con la opción -pthread), veréis que produce unos errores enormes. El problema es que dos procesos diferentes acceden al mismo recurso compartido (la variable count) y se «pierden» operaciones debido a las interrupciones e intercalaciones.

Este caso es muy estudiado y todas las asignaturas comienzan con algo similar, es la exclusión mutua entre [solo] dos procesos. Así se estudian los «cuatro intentos» para solucionarlo, luego el algoritmo de Dekker y finalmente el de Peterson (aquí los tenéis a todos).

Así se puede demostrar formalmente que funciona correctamente, que asegura exclusión mutua y tal y cual. Pero si lo implementas (aquí lo tenéis listo para compilar y ejecutar con el ejemplo anterior) y lo pruebas en cualquier ordenador moderno verás que… falla como escopeta de feria.

¿Qué pasó? ¿Falla la teoría? ¿Fallan las demostraciones? ¿Los teóricos de las ciencias de la computación no sirven para nada?

Actualización: la respuesta.

Ninguna de ellas, este es un típico ejemplo donde la teoría se distanció de la «realidad», o mejor dicho, donde la evolución tecnológica de los microprocesadores modernos hace que las técnicas de concurrencia que dábamos por buenas (y que lo son formalmente y con todos los modelos de computación y/o de lenguajes «tradicionales») ya no funcionen. Es la diferencia entre hacer «sólo ciencia» y la «ingeniería» (es decir, resolver problemas que te impone la realidad, no tan perfecta como la teoría).

Tampoco es para los ingenieros se feliciten y miren por encima del hombro a los teóricos, porque la mayoría de «ingenieros» tampoco saben explicar o resolver este problema, muchas veces ni siquiera son capaces de identificarlo (no, si estás leyendo este blog no eres de la «media», eres bastante friki y al menos lo habrás oído, o sabrás buscar rápidamente en la Wikipedia o Stackoverflow 😉 ).

Si no tienes idea de qué está pasando, ya lo explicaré en un comentario (si nadie lo hace antes), pero mientras tanto puedes ir probando este otro código que sí funciona y sólo difiere en una línea con el anterior.

Sólo quería recordar que aún en ciencias tan «formales» como la informática la teoría no siempre funciona en la práctica, que el tema de concurrencia tiene sus complejidades no siempre a la vista, que un buen ingeniero debe saber reconocer esos problemas y poder solucionarlo, y que esto exige que conozcamos bastante de detalles del hardware y microprocesadores actuales.

No es nada simple, lleva su tiempo, y tendemos a pensar que lo sabemos todo. O que la «ingeniería informática» consiste en saber liderar sprints de Scrums con postits de colores fosforitos.

PS: Por estas cosas, entre muchas, la informática es apasionante.

Comprar el libro

Principios y algoritmos de concurrencia

gallir@twitter

  • Inventan problemas inexistentes en las leyes, las cambian y la cagan. Inventan tabúes inexistentes... ¿qué vendrá a… twitter.com/i/web/status/1… 14 hours ago
  • RT @jlhortelano: Siempre ha sido un manipulador. Pero encima es muy tonto si trata de colar esta foto de Septiembre de 2021, época donde no… 1 day ago
  • ¿Qué? Por algo se re-empieza. https://t.co/dJ16CcMu9J 2 days ago
  • "sexeafectives" twitter.com/La_Directa/sta… https://t.co/or6E5bOLvT 2 days ago
Follow @gallir

RSS Notas recientes

  • Se ha producido un error; es probable que la fuente esté fuera de servicio. Vuelve a intentarlo más tarde.

Archivos

Comentarios recientes

PM en Cuidado con las «clever soluti…
Me matan si no traba… en Cuando el periodismo cede el c…
surco en Cuando el periodismo cede el c…
pancho pérez (@lonch… en Cuando el periodismo cede el c…
Fernando en Cuando el periodismo cede el c…
@beoxman en Cuando el periodismo cede el c…
gallir en Cuando el periodismo cede el c…
Jan Smite en Cuando el periodismo cede el c…
Alejandro en Cuando el periodismo cede el c…
Galletor en Cuando el periodismo cede el c…

Meta

  • Registro
  • Acceder
  • Feed de entradas
  • Feed de comentarios
  • WordPress.com

Licencia

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.

Blog de WordPress.com.

  • Seguir Siguiendo
    • Ricardo Galli, de software
    • Únete a 667 seguidores más
    • ¿Ya tienes una cuenta de WordPress.com? Accede ahora.
    • Ricardo Galli, de software
    • Personalizar
    • Seguir Siguiendo
    • Regístrate
    • Acceder
    • Denunciar este contenido
    • Ver sitio web en el Lector
    • Gestionar las suscripciones
    • Contraer esta barra
 

Cargando comentarios...