Curso de octavo semestre de la licenciatura en Ciencias de la Computación (plan 2013). El contenido es sobre los problemas teóricos que se suponen que dos computadoras de alguna naturaleza, comparten memoria de alguna forma, para exhibir que esto puede resultar en problemas a raíz de problemas no esperados. Se estudian técnicas, herramientas y estrategias mediante las cuales podemos diseñar nuestras soluciones a problemas de concurrencia.
Así con esta pequeña introducción dada, va una lista de las notas que he elaborado para este curso:
Ejercicios con el algoritmo de sincronización de PetersonDando por hecho que el lector conoce el algoritmo de Peterson, las notas exponen ejercicios para mostrar el uso y utilidad del mismo. |
Hilos de ejecución y calendarización de procesosEstas notas, exponen de forma detallada conceptos propios de sistemas operativos; que son fundamentales para el entendimiento de conceptos y eventos de la computación concurrente. |
Exclusión mutuaYa entrados en terreno, lo que exponen estas notas son más definiciones, pero ahora sí más propiamente en el terreno de la computación concurrente. |
Algoritmo de sincronización de KesselsEn estas notas, se explica qué es, cómo funciona y en qué casos podemos usar el algoritmo de sincronización de Kessels.Historico de versiones de estas notas: Agosto de 2015 - Incluye una introducción al algoritmo del torneo |
Algoritmo de la panaderíaSin salir del terreno de la sincronización, en estas notas expongo el algoritmo de la repostería o panadería... Aunque siendo natal de Ciudad de México, me gusta más llamarle "el algoritmo de la papelería del centro"... Verán porqué. |
Primitivas de sincronizaciónEn estas notas, describo en una larga lista varias primitivas de sincronización, también llamadas "objetos". Pero ojo, este no es el mismo concepto de objeto que se usa en programación orientada a objetos. |
Aplicaciciones de primitivas de sincronizaciónEn la misma línea que las notas anteriores, estas hablan sobre aplicaciones de primitivas de sincronización. |
Colas concurrentes, semáforos y moitoresEn estas notas, explico qué son y cómo se usan los semáforos y monitores. |
Problema de los filósofos comensalesEn estas notas, trato el problema de los filósofos comensales: qué es y una "posible" forma de resolverlo. |
Solución al problema de los filósofos comensales mediante apropiamiento y esperaEn la misma línea de las notas anteriores, se extiende el problema de los filósofos comensales, pero esta vez se propone una solución real. |
Problema de los fumadores de tabacoEn estas notas, se aborda y explica el problema de los fumadores. |
Problema del barbero dormilónEn estas notas, se aborda y explica el problema del barbero dormilón. |
Soluciones al problema del consensoEn estas notas, se da por hecho que el lector ya conoce el problema del consenso y se plantean varias formas de resolverlo. |
Ejemplos de soluciones al consensoSiguiendo la misma línea de las últimas notas, se presentan ejemplos de resoluciones al problema del consenso. |
Ejemplos en Java y C solución al problema del consensoEn un último ejemplo, se muestran implementaciones en Java y C para resolver el problema del consenso.Las notas tienen el siguiente anexo: Código de los ejemplos |
Intoducción a las GUIUna aplicación de la computación concurrente, está en el lado técnico del desarrollo de interfaces gráficas de usaurio. Cuando se trata de aplicaciones que reflejan cambios hechos por un solo usuario, como la mayoría de los editores de texto o por un solo hilo/proceso, no hay mucho problema en cuanto a la concurrencia. Los verdaderos retos empiezan a aparecer cuando la aplciación se hace de varios hilos trabajadores de segundo plano para tareas como obtener cada uno cierta información a partir de un servidor, realizar cáluclos intensivos etc.Esta aplicación; como podrán adivinar los clientes frecuentes, es una de mis favoritas, ya que nos conlleva casi inebitablemente a la programación de videojuegos, donde tener que animar a personajes manipulados por la entrada de los jugdores, otros por la IA, otros por las reglas del juego; como las simulaciones físicas; etc. Involucran muchos hilos/procesos manipulando el mismo videojuego: la concrrencia se pone divertida en más de un sentido. Las notas tienen el siguiente anexo: Ejemplo de aplicación gáficas en Java Swing |
Hilos de ejecución en JavaConforme nuestros proyectos y diseños crecen, es común que sea necesario trabajar a varios hilos. Un proceso (informalmente, un programa en ejecución) puede ejecutar tantas instrucciones "simultáneas" como sea necesario. La capacidad de paralelización de un programa está limitada únicamente por la capacidad física de la máquina que ejecute el programa.Sin embargo, por muy maravilloso que esto suene, no es un panorama claro y hermoso del todo. Ya que es muy posible que el comportamiento de nuestro programa dependa de cuando se manipulan los varios hilos con los recursos compartidos. Es aquí cuando vamos a empezar a lidiar con condiciones de carrera o competencia y tener que implementar estrategias de sincronización, como las que se mencionan en los puntos anteriores: implementar hilos es solo la primera parte. Las notas tienen el siguiente anexo: Ejemplo con hilos También hacen referencia al ejemplo de calendarización mencionado en la sección de notas para Estructuras de datos. |
Colas concurrentesDescribe qué son y cómo implementar colas concurrentes. |
Herramientas de concurrencia en JavaEn estas notas, describo a grandes rasgos cuáles son y cómo se usan las clases del paquete estándar de Java java.util.concurrent. Se pone énfasis en los semáforos. |
Herramientas de concurrencia y sincronización en PythonDe manera similar y análoga a las notas sobre concurrencia con Java, se estudian las herramientas estandar que ofrece Python para resolver problemas de concurrencia. Se exploran las bibliotecas que nos permiten implementar las soluciones estudiadas en el curso en esta plataforma interpretada y favorita de muchos.Las nota tienen el siguiente anexo: Ejemplos de sincronización en Python |
Herramientas de concurrencia y sincronización en C y C++Análogo al caso anterior, en estas notas se presentan las herramientas "estándares" (esto depende un poco más de la plataforma anfitriona y/o el compilador utilizado) para resolver problemas de concurrencia en C y C++; para también poder implementar soluciones a problemas de concurrencia con esta plataforma nativa.Las notas tienen el siguiente anexo: Ejemplos de sincronización en C y C++ |