lunes, 10 de junio de 2013

Algoritmo Token Ring


Token Ring es una arquitectura de red desarrollada por IBM, utiliza la topología física de anillo con un frame llamado token que viaja alrededor del anillo.

Funcionamiento: 

-       Los procesos se organizan por un software formando un anillo lógico asignándose a cada proceso una petición en el anillo
-       Al iniciar el anillo se le da al proceso 0 una ficha token que circula en todo el anillo de proceso en proceso.
-       Cuando un proceso obtiene la ficha de su vecino verifica si intenta entrar a una región crítica.
o   En caso positivo.
- El proceso entra en la región crítica, hace el proceso necesario y sale de ella.
- Después de salir pasa el token a lo largo del anillo.
- (No se puede entrar a una segunda región crítica con el mismo token).
o   En caso negativo.
-  La vuelve a pasar.
-       En un instante dado, solo un proceso puede estar en una región crítica.
-       Si el token se pierde debe ser regenerado (es difícil detectar su perdida).
o   La cantidad de tiempo entre las apariciones sucesivas del token en la red no está acotado.
-       La falla de un proceso es detectada cuando su vecino intenta sin éxito pasarle la ficha.
o   Se debe eliminar del grupo y pasar el token al siguiente proceso activo.
o   Todos los procesos deben mantener la configuración actual del anillo.

ALGORITMO CENTRALIZADO

Con este algoritmo se elige a uno de los procesos como coordinador. Este proceso es el que se va a encargar de determinar si un proceso puede entrar a ejecutar dentro de la sección crítica. Cuando un proceso desea entrar a ejecutar dentro de la sección crítica envía un mensaje al coordinador solicitando la entrada. Si no existe ningún proceso dentro déla sección crítica, el coordinador envía un mensaje de respuesta permitiendo al proceso entrar en la sección. Si existe, sin embargo, un proceso dentro de la sección crítica, el coordinador no responde dejando bloqueado al proceso que desea entrar y la solicitud se almacena en una cola para su procesamiento posterior.

Cuando un proceso abandona la sección crítica envía un mensaje al coordinador indicándolo. El coordinador a continuación comprueba si existen procesos en la cola que esperan entrar en la sección crítica. En caso de que existan, elige al primero de ellos y le envía un mensaje permitiéndole entrar. Este mensaje de respuesta desbloquea al proceso que entra a continuación en la sección crítica.


El algoritmo descrito es relativamente sencillo; sin embargo, el hecho de utilizar un proceso coordinador hace que presente un único punto de fallo. En caso de que el proceso coordinador falle, el algoritmo deja de funcionar correctamente. Habría en este caso que elegir a un nuevo proceso coordinador.


centralizado.jpg

Algoritmo de exclusión mutua (Distribuido).

Algoritmo de exclusión mutua.
Un algoritmo distribuido.
(El algoritmo de Ricart y Agrawala ) Este algoritmo requiere de un orden total de todos los eventos en el sistema. Para cualquier pareja de mensajes debe quedar claro quién ocurrió primero.
Cuando un proceso desea entrar a la región crítica, construye un mensaje con el nombre de ésta, su número de proceso y la hor actual, y la envía a todos los demás procesos y de forma conceptual a él mismo. Se puede utilizar comunicación en grupo confiable.
Cuando un proceso recibe un mensaje de solicitud de otro proceso para entrar a una región crítica, debe distinguir tres casos:
  1. Si el receptor no está en la región crítica y no desea entrar a ella, envía de regreso un mensaje ok al emisor.
  2. Si el receptor desea entrar a la región crítica, no responde, sino que forma la solicitud en una fila.
  3. Si el receptor desea entrar a la región crítica, pero no lo ha logrado todavía, compara la marca de tiempo en el mensaje recibido con la marca contenida en el mensaje que envió a cada uno. La menor de las marcas gana. Si el mensaje recibido es menor, el receptor envía un mensaje ok. Si su propio mensaje tiene una marca menor, el receptor forma la solicitud en una fila y no envía nada.
Un proceso puede entrar a la región crítica si obtiene permiso de todos. Si es así, entra y cuando sale envía mensajes ok a todos los procesos de su fila y elimina los elementos de la fila.
Con este método la exclusión mutua queda garantizada sin bloqueo ni inanición. El número de mensajes necesarios por entrada es de 2(n-1), donde n es el número total de procesos en el sistema.
Ejemplo: Supongamos que tenemos 4 procesos numerados del 0 al 3, los procesos 1 y 3 desean entrar a la región crítica, 0 no desea entrar a la región crítica y 2 esta dentro de la región crítica. Los procesos 1 y 3 envían mensaje casi al mismo tiempo, pero la marca de 3 es menor a la de 1 (1 tiene marca de tiempo igual a 3 y 3 tiene marca de tiempo igual a 2). Cuando 0 recibe el mensaje de 3 le otorga el permiso, como la marca de tiempo de 3 es menor que la de 1 entonces 1 debe enviar un mensaje de ok a 3, 2 esta dentro de la región crítica por lo que forma el mensaje de 3 en una fila.
Cuando 0 recibe el mensaje de 1 le responde con un ok, 3 al recibir el mensaje de 1 checa su propia marca de tiempo, como su marca de tiempo es menor que la de 1 entonces forma la solicitud de 1 es una fila y no responde nada. El proceso 2 al recibir mensaje de 1, forma el mensaje en una fila ya que 2 esta en la r.c.












El proceso 3 tiene el permiso de 0 y 1 para entrar a la región crítica, y el proceso 1 tiene el permiso de 0. Cuando 2 sale de la región crítica envía mensajes de ok a los procesos de su fila, en este caso, a los procesos 3 y 1.




 El proceso 3 ya tiene el permiso de todos por lo tanto puede entrar a la r.c., mientras que el proceso 1 debe esperar a que 3 salga de la región crítica. Cuando 3 salga de la región crítica debe enviar un mensaje de ok al proceso 1.

Ahora existen n puntos de falla. Sino hay respuesta, se interpretará como ua negación de permiso, aún cuando el proceso haya muerto, podría haber bloqueos.
Una posible modificación es la siguiente, cada vez que se haga una solicitud debe haber una respuesta negativa o positiva.
Funciona bien con comunicación en grupo, donde se tenga un registro de los integrantes del grupo, quiénes entran y quiénes han salido o han fallado. Funciona bien con grupos pequeños.

El algoritmo es más lento, más complejo y más caro y menos robusto que el centralizado. Pero sirve para estimular a investigadores a producir algoritmos útiles.

Algoritmo de Lamport

La panadería de Lamport es un algoritmo basado en el sistema de turno existente en las panaderías y otros negocios.
 Consiste en darle a cada cliente un numero, el cual determina el orden de atención del vendedor y permitirles realizar su pedido, después de lo cual se le libera, pudiendo este comprar nuevamente solo si obtiene un numero nuevo.
 Llevado a programación, el Servidor entrega un numero a cada hilo que desea acceder a este y les atiende de uno en uno por orden de llegada. Una vez que toca le toca su turno, el proceso ingresa a su etapa  critica y después de realizada esta, el servidor le libera y atiende al siguiente proceso.

En la vida real, el sistema de los boletos funciona perfectamente, pero en un sistema informático la obtención del boleto es problemática: varios hilos pueden obtener el mismo número de turno. En el algoritmo de Lamport se permite que varios hilos obtengan el mismo número. En este caso, se aplica un algoritmo de desempate, que garantiza que sólo un hilo entra en sección crítica. El desempate se realiza así: si dos o más hilos tienen el mismo número de turno, tiene más prioridad el hilo que tenga el identificador con un número más bajo. Como no puede haber dos hilos con el mismo identificador, nunca se da el caso de que dos hilos evalúen al mismo tiempo que tienen derecho a ejecutar su sección crítica.

PSEUDOCODIGIO
/* Variables globales */
  Número: vector [1..N] de enteros  = {todos a 0};
  Eligiendo: vector [1..N] de booleanos = {todos a falso};
    
  /* Código del hilo i */
  Hilo(i) {
      loop {

          /* Calcula el número de turno */
          Eligiendo[i] = cierto;
          Número[i] = 1 + max(Número[1],..., Número[N]);
          Eligiendo[i] = falso;
          
          /* Compara con todos los hilos */
          for j in 1..N {                     

               /* Si el hilo j está calculando su número, espera a que termine */
               while ( Eligiendo[j] ) { /* nada */ }       

               /* Si el hilo j tiene más prioridad, espera a que ponga su número a cero */
               /* j tiene más prioridad si su número de turno es más bajo que el de i,  */
               /*  o bien si es el mismo número y además j es menor que i               */
               while ( (Número[j] != 0) && ((Número[j], j) < (Número[i], i)) ) { /* nada */ }  
          }

          /* Sección crítica */
         ...
          /* Fin de sección crítica */

          Número[i] = 0;

          /* Código restante */
      }

  }


Algoritmo de Cristian

Algoritmo de Cristian

Este algoritmo está basado en el uso del tiempo coordenado universal (siglas en inglés, UTC), el cual es recibido por un equipo dentro del sistema distribuido. Este equipo, denominado receptor de UTC, recibe a su vez solicitudes periódicas del tiempo del resto de máquinas del sistema a cada uno de los cuales les envía una respuesta en el menor plazo posible informando el tiempo UTC solicitado, con lo cual todas las máquinas del sistema actualicen su hora y se mantenga así sincronizado todo el sistema. El receptor de UTC recibe el tiempo a través de diversos medios disponibles, entre los cuales se menciona las ondas de radio, Internet, entre otros. Un gran problema en este algoritmo es que el tiempo no puede correr hacia atrás:
El tiempo del receptor UTC no puede ser menor que el tiempo de la máquina que le solicitó el tiempo.
El servidor de UTC debe procesar las solicitudes de tiempo con el concepto de interrupciones, lo cual incide en el tiempo de atención.
El intervalo de transmisión de la solicitud y su respuesta debe ser tomado en cuenta para la sincronización. El tiempo de propagación se suma al tiempo del servidor para sincronizar al emisor cuando éste recibe la respuesta.

La sincronización de relojes en un sistema distribuido consiste en garantizar que los procesos se ejecuten de forma cronológica y a la misma vez respetar el orden de los eventos dentro del sistema. Existen dos tipos de sincronización de relojes físicos:
  • Sincronización externa: consiste en sincronizar los relojes de los procesos Ci con una fuente de tiempo externa fiable.
|S(t) – Ci(t)| < D ; siendo D un límite mayor que cero y S una fuente de tiempo UTC.
  • Sincronización interna: si los relojes Ci están sincronizados entre ellos con un conocido grado de precisión y no necesariamente sincronizados con una fuente externa de tiempo.
|Ci(t) < Cj(t) | < D ; siendo D un límite mayor que cero.


Funcionamiento del algoritmo

  1. Un proceso p hace una petición de tiempo al servidor en un mensaje mr.
  2. El servidor responde con un mensaje mt en el que incluye su tiempo TUTC.
  3. El proceso que recibe el mensaje mt actualiza su reloj con el tiempo TUTC, pero hay que considerar el error cometido pues se ha requerido un tiempo para la transmisión del mensaje desde el servidor.
Se mide el tiempo que se tarda en recibir la respuesta desde que de envía el mensaje de petición, TVIAJE. El tiempo estimado de propagación, en ausencia de otra información, será TVIAJE /2 por lo que el cliente sincroniza su reloj a TUTC + TVIAJE/2. Esta estimación puede mejorarse si se conoce el tiempo mínimo de propagación del mensaje:
  • El tiempo mínimo en el que el servidor escribió el mensaje es min.
  • El tiempo máximo en el que el servidor escribió el mensaje es TVIAJE – min.
Por lo tanto el tiempo en el que el mensaje del servidor es recibido se sitúa en el rango [CUTC + min, CUTC+ TVIAJE –min ] cuya anchura es TVIAJE – 2min así que la precisión es ± TVIAJE/2 – min.

algoritmo de elección en anillos

  Algoritmos de elección


Muchas aplicaciones y servicios distribuidos se basan en la existencia de un proceso diferenciado que coordina el trabajo de un conjunto de procesos. Por ejemplo, acabamos de ver que el algoritmo centralizado para exclusión mutua distribuida requiere un proceso coordinador. En todas estas situaciones se requiere detectar que el proceso coordinador falla y elegir un nuevo proceso que asuma el papel de coordinador. La elección requiere el acuerdo sobre quién va a ser el nuevo y único coordinador. De nuevo, las decisiones se basan en la existencia de plazos para la recepción de los mensajes de respuesta.

Por otra parte, para determinar el criterio de elección de un proceso como coordinador se requieredefinir un orden total entre el conjunto de procesos.
Supondremos que los procesos tienen asociados identificadores únicos según los cuales pueden ordenarse.


Algoritmo del anillo

• Sistema síncrono [Chang & Roberts79]. Cada proceso tiene un canal con el siguiente proceso en el anillo. Los mensajes circulan en sentido de las agujas del reloj.
El proceso que inicia el algoritmo se marca como participante y envía su identificador en un mensaje de elección a su vecino.
Cuando un proceso recibe un mensaje de elección compara el identificador recibido con el suyo.

        Si es menor el recibido y el proceso no es un participante, sustituye el identificador en el mensaje por el suyo y lo reenvía al vecino y se marca como participante.
        Si es mayor el recibido, reenvía el mensaje y se marca como participante.
        Si es menor el recibido y el proceso es un participante, no hace nada (no envía ningún mensaje).
        Si el identificador coincide con el del proceso, ese proceso es el líder.

•  El líder se marca como no participante y envía un mensaje elegido al siguiente proceso.
• Cuando un proceso distinto al líder recibe este mensaje, anota qué proceso es el líder y reenvía el mensaje.



A tomar muy encuentra en la implementación: Cuando un proceso Pi sospecha que el coordinador falla, envía a su sucesor P(i+1) mod N un mensaje de elección que contiene el identificador de Pi. Si Pi+1 no responde (ACK), Pi repite el envío a Pi+2y así hasta que encuentra un proceso que confirma la recepción.

Algoritmo de elección grandulón

                         Algoritmo de elección grandulón o de García Molina

Diseñado por García Molina en el año 1982, se refiere a que cuando un proceso observa que el coordinador ya no responde a las solicitudes se inicia una elección. Un proceso P realiza una elección de la siguiente manera:

1.- P envía un mensaje ELECCION a los demás procesos con un número mayor.
2.- Si nadie responde, P gana la elección y de convierte en el coordinador.
3.- si uno de los procesos con un número mayor responde, toma el control. El trabajo de P termina

En cualquier momento, un proceso puede recibir un mensaje de elección de uno de sus compañeros con un número menor. Cuando llega dicho mensaje, el receptor envía de regreso un mensaje OK al emisor para indicar que está vivo y que tomará el control. El receptor realiza entonces una elección, a menos que ya esté realizando alguna. En cierto momento, todos los procesos se rinden, menos uno, el cual se convierte en el nuevo coordinador. Anuncia su victoria al enviar un mensaje a todos los procesos para indicarles que a partir de ese momento es el nuevo coordinador. El mensaje se va propagando hacia el más “grande”.

El grupo consta de ocho procesos, numerados del 0 al 7. Antes, el proceso 7 era el coordinador, pero acaba de fallar. El proceso 4 es el primero en notarlo, pero los que envía el mensaje ELECCION a todos los procesos mayores que el, 5, 6 y 7. Los procesos 5 y 6 responden con OK. Al recibir la primera de estas respuestas 4 sabe que su trabajo ha terminado. Sabe que alguno de estos grandulones tomara el control y se convertirá en el coordinador. Solo se sienta y espera para ver quién es el ganador.





En la figura se muestra el algoritmo para la elección. El proceso 4 hace una elección. Los procesos 5 y 6 responden e indican a 4 que se detenga. Ahora, 5 y 6 hacen una elección. El proceso 6 indica a 5 que se detenga. El proceso 6 gana y se lo informa a todos.