La computación distribuida nos permite que equipos de cómputo independientes trabajen en conjunto para lograr una tarea. Estos sistemas utilizan protocolos especiales y técnicas como RPC y paso de mensajes para coordinarse. La finalidad de este trabajo conjunto es lograr solucionar problemas repartiendo el trabajo entre cada uno de los agentes del sistema distribuido. Los recursos en un sistema distribuido son concurrentes, es decir, pueden ser accedidos por dos o más miembros del grupo y por tanto es necesario utilizar técnicas para exclusión.
Principios de la computación distribuida
La computación distribuida necesita cumplir con los siguientes principios para considerar que esta siendo correctamente aplicada:
- Confiabilidad: un sistema distribuido, a parte de seguro, debe ser tolerante a fallas.
- Desempeño: un sistema distribuido en principio es capaz de desempeñar tareas más grandes en menor tiempo a comparación de un solo equipo.
- Disponibilidad: el hecho de tener varios equipos trabajando en conjunto debe garantizar que, aunque uno de ellos no esté disponible, sea posible seguir utilizando el sistema.
- Transparencia: el usuario debería de percibir el sistema completo como si fuera uno solo, escondiendo que en realidad hay varios equipos trabajando en conjunto.
- Escalabilidad: agregar o quitar agentes o miembros al sistema debería de ser muy sencillo puesto que la arquitectura del sistema no está ligada al tamaño del mismo.
Problemas en sistemas distribuidos
Como se está trabajando con recursos distribuidos a los que varios miembros del equipo pueden querer tomar control al mismo tiempo, se presentan ciertos problemas o limitaciones importantes:
- Algunos participantes pueden morir por inanición si nunca se les permite acceder a los recursos.
- Problemas de exclusión mutua si no se cuenta con algoritmos capaces de garantizar que a las secciones críticas del sistema solo pueda tener acceso un participante en un mismo periodo de tiempo.
- Problemas de bloqueo mutuo o interbloqueo cuando un proceso A necesita que B realice una acción específica para continuar su ejecución; al mismo tiempo B espera que A realice una acción específica, por tanto ambos se bloquean esperándose el uno al otro.
- Problemas de consenso cuando los participantes no se pueden poner de acuerdo debido a fallas en los algoritmos de decisión.
- Problemas de sincronización.
- Problemas de latencias elevadas, es decir, problemas en la velocidad de transmisión de mensajes y tareas.
- Problemas con corrupción de datos.
Algoritmos distribuidos
Para lograr el correcto funcionamiento de un sistema distribuido se necesitan ciertos algoritmos y técnicas que buscan garantizar el correcto funcionamiento del sistema:
- Algoritmos de exclusión mutua como semáforos o los algoritmos de Dekker1 o Peterson2 para evitar el acceso de más de un proceso a recursos críticos.
- Algoritmos no bloqueables que tratan de garantizar que, aunque un participante se bloquee con el control de un recurso, los demás participantes podrán seguir accediendo a él. Estos algoritmos son muy difíciles de implementar correctamente.
- Replicación de datos críticos así si el miembro que tenía dichos datos presenta algún problema, habrá otro o unos miembros con más copias.
- Algoritmos concurrentes para recursos compartidos.
- Árboles de expansión que crean varias rutas de comunicación entre nodos para garantizar la comunicación incluso aunque uno o varios fallen.
1 Algoritmo de Dekker en Wikipedia.
2 Algoritmo de Peterson en Wikipedia.