El reloj lógico de Lamport

El reloj lógico de Lamport fue creado por Leslie Lamport. Es un procedimiento para determinar el orden de los eventos que ocurren. Proporciona una base para el algoritmo de reloj vectorial más avanzado . Debido a la ausencia de un reloj global en un sistema operativo distribuido, se necesita un reloj lógico Lamport .

Algoritmo:

  • Ocurrió antes de la relación (->): a -> b, significa que ‘a’ sucedió antes que ‘b’.
  • Reloj Lógico: Los criterios para los relojes lógicos son:
    • [C1]: C i (a) < C i (b), [ C i -> Reloj lógico, si ‘a’ sucedió antes que ‘b’, entonces el tiempo de ‘a’ será menor que ‘b’ en un determinado proceso. ]
    • [C2]: C i (a) < C j (b), [El valor del reloj de C i (a) es menor que C j (b)]

Referencia:

  • Proceso : Pi
  • Evento: E ij , donde i es el proceso en número y j : j ésimo evento en el i ésimo proceso .
  • t m : lapso de tiempo del vector para el mensaje m.
  • Reloj vectorial Ci asociado con el proceso P i , el elemento j ésimo es Ci[j] y contiene el valor más reciente de Pi para el tiempo actual en el proceso P j .
  • d: tiempo de deriva, generalmente d es 1.

Reglas de implementación [IR]:

  • [IR1]: Si a -> b [‘a’ sucedió antes que ‘b’ dentro del mismo proceso] entonces, C i (b) =C i (a) + d
  • [IR2]: C j = max(C j , t m ​​+ d) [Si hay más cantidad de procesos, entonces t m = valor de C i (a), C j = valor máximo entre C j y t m + d ]

Por ejemplo:

  • Tome el valor inicial como 1, ya que es el primer evento y no hay ningún valor entrante en el punto inicial:
    • e11 = 1
    • e21 = 1
  • El valor del siguiente punto irá aumentando en d (d = 1), si no hay valor entrante, es decir, para seguir [IR1].
    • e12 = e11 + d = 1 + 1 = 2
    • e13 = e12 + d = 2 + 1 = 3
    • e14 = e13 + d = 3 + 1 = 4
    • e15 = e14 + d = 4 + 1 = 5
    • e16 = e15 + d = 5 + 1 = 6
    • e22 = e21 + d = 1 + 1 = 2
    • e24 = e23 + d = 3 + 1 = 4
    • e26 = e25 + d = 6 + 1 = 7
  • Cuando haya un valor entrante, siga [IR2] , es decir, tome el valor máximo entre C j y T m + d .
    • e17 = max(7, 5) = 7, [e16 + d = 6 + 1 = 7, e24 + d = 4 + 1 = 5, el máximo entre 7 y 5 es 7]
    • e23 = max(3, 3) = 3, [e22 + d = 2 + 1 = 3, e12 + d = 2 + 1 = 3, máximo entre 3 y 3 es 3]
    • e25 = max(5, 6) = 6, [e24 + 1 = 4 + 1 = 5, e15 + d = 5 + 1 = 6, máximo entre 5 y 6 es 6]

Limitación :

  • En el caso de [IR1], si a -> b, entonces C(a) < C(b) -> verdadero.
  • En el caso de [IR2], si a -> b, entonces C(a) < C(b) -> Puede ser cierto o no serlo.

A continuación se muestra el programa C para implementar el reloj lógico de Lamport:

C++

// C++ program to illustrate the Lamport's
// Logical Clock
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum timestamp
// between 2 events
int max1(int a, int b)
{
    // Return the greatest of th two
    if (a > b)
        return a;
    else
        return b;
}
 
// Function to display the logical timestamp
void display(int e1, int e2,
             int p1[5], int p2[3])
{
    int i;
 
    cout << "\nThe time stamps of "
         "events in P1:\n";
 
    for (i = 0; i < e1; i++) {
        cout << p1[i] << " ";
    }
 
    cout << "\nThe time stamps of "
         "events in P2:\n";
 
    // Print the array p2[]
    for (i = 0; i < e2; i++)
        cout << p2[i] << " ";
}
 
// Function to find the timestamp of events
void lamportLogicalClock(int e1, int e2,
                         int m[5][3])
{
    int i, j, k, p1[e1], p2[e2];
 
    // Initialize p1[] and p2[]
    for (i = 0; i < e1; i++)
        p1[i] = i + 1;
 
    for (i = 0; i < e2; i++)
        p2[i] = i + 1;
    cout << "\t";
    for (i = 0; i < e2; i++)
        cout << "\te2" << i + 1;
 
    for (i = 0; i < e1; i++) {
 
        cout << "\n e1" << i + 1 << "\t";
 
        for (j = 0; j < e2; j++)
            cout << m[i][j] << "\t";
    }
 
    for (i = 0; i < e1; i++) {
        for (j = 0; j < e2; j++) {
 
            // Change the timestamp if the
            // message is sent
            if (m[i][j] == 1) {
                p2[j] = max1(p2[j], p1[i] + 1);
                for (k = j + 1; k < e2; k++)
                    p2[k] = p2[k - 1] + 1;
            }
 
            // Change the timestamp if the
            // message is received
            if (m[i][j] == -1) {
                p1[i] = max1(p1[i], p2[j] + 1);
                for (k = i + 1; k < e1; k++)
                    p1[k] = p1[k - 1] + 1;
            }
        }
    }
 
    // Function Call
    display(e1, e2, p1, p2);
}
 
// Driver Code
int main()
{
    int e1 = 5, e2 = 3, m[5][3];
 
    // message is sent and received
    // between two process
 
    /*dep[i][j] = 1, if message is sent
                   from ei to ej
    dep[i][j] = -1, if message is received
                    by ei from ej
    dep[i][j] = 0, otherwise*/
    m[0][0] = 0;
    m[0][1] = 0;
    m[0][2] = 0;
    m[1][0] = 0;
    m[1][1] = 0;
    m[1][2] = 1;
    m[2][0] = 0;
    m[2][1] = 0;
    m[2][2] = 0;
    m[3][0] = 0;
    m[3][1] = 0;
    m[3][2] = 0;
    m[4][0] = 0;
    m[4][1] = -1;
    m[4][2] = 0;
 
    // Function Call
    lamportLogicalClock(e1, e2, m);
 
    return 0;
}

C

// C program to illustrate the Lamport's
// Logical Clock
#include <stdio.h>
 
// Function to find the maximum timestamp
// between 2 events
int max1(int a, int b)
{
    // Return the greatest of th two
    if (a > b)
        return a;
    else
        return b;
}
 
// Function to display the logical timestamp
void display(int e1, int e2,
             int p1[5], int p2[3])
{
    int i;
 
    printf("\nThe time stamps of "
           "events in P1:\n");
 
    for (i = 0; i < e1; i++) {
        printf("%d ", p1[i]);
    }
 
    printf("\nThe time stamps of "
           "events in P2:\n");
 
    // Print the array p2[]
    for (i = 0; i < e2; i++)
        printf("%d ", p2[i]);
}
 
// Function to find the timestamp of events
void lamportLogicalClock(int e1, int e2,
                         int m[5][3])
{
    int i, j, k, p1[e1], p2[e2];
 
    // Initialize p1[] and p2[]
    for (i = 0; i < e1; i++)
        p1[i] = i + 1;
 
    for (i = 0; i < e2; i++)
        p2[i] = i + 1;
 
    for (i = 0; i < e2; i++)
        printf("\te2%d", i + 1);
 
    for (i = 0; i < e1; i++) {
 
        printf("\n e1%d \t", i + 1);
 
        for (j = 0; j < e2; j++)
            printf("%d\t", m[i][j]);
    }
 
    for (i = 0; i < e1; i++) {
        for (j = 0; j < e2; j++) {
 
            // Change the timestamp if the
            // message is sent
            if (m[i][j] == 1) {
                p2[j] = max1(p2[j], p1[i] + 1);
                for (k = j + 1; k < e2; k++)
                    p2[k] = p2[k - 1] + 1;
            }
 
            // Change the timestamp if the
            // message is received
            if (m[i][j] == -1) {
                p1[i] = max1(p1[i], p2[j] + 1);
                for (k = i + 1; k < e1; k++)
                    p1[k] = p1[k - 1] + 1;
            }
        }
    }
 
    // Function Call
    display(e1, e2, p1, p2);
}
 
// Driver Code
int main()
{
    int e1 = 5, e2 = 3, m[5][3];
 
    // message is sent and received
    // between two process
 
    /*dep[i][j] = 1, if message is sent
                   from ei to ej
    dep[i][j] = -1, if message is received
                    by ei from ej
    dep[i][j] = 0, otherwise*/
    m[0][0] = 0;
    m[0][1] = 0;
    m[0][2] = 0;
    m[1][0] = 0;
    m[1][1] = 0;
    m[1][2] = 1;
    m[2][0] = 0;
    m[2][1] = 0;
    m[2][2] = 0;
    m[3][0] = 0;
    m[3][1] = 0;
    m[3][2] = 0;
    m[4][0] = 0;
    m[4][1] = -1;
    m[4][2] = 0;
 
    // Function Call
    lamportLogicalClock(e1, e2, m);
 
    return 0;
}

Python3

# Python program to illustrate the Lamport's
# Logical Clock
 
# Function to find the maximum timestamp
# between 2 events
def max1(a, b) :
 
    # Return the greatest of th two
    if a > b :
        return a
    else :
        return b
 
# Function to display the logical timestamp
def display(e1, e2, p1, p2) :
    print()
    print("The time stamps of events in P1:")
    for i in range(0, e1) :
        print(p1[i], end = " ")
     
    print()
    print("The time stamps of events in P2:")
     
    # Print the array p2[]
    for i in range(0, e2) :
        print(p2[i], end = " ")
 
# Function to find the timestamp of events
def lamportLogicalClock(e1, e2, m) :
    p1 = [0]*e1
    p2 = [0]*e2
 
    # Initialize p1[] and p2[]
    for i in range (0, e1) :
        p1[i] = i + 1
 
    for i in range(0, e2) :
        p2[i] = i + 1
     
    for i in range(0, e2) :
        print(end = '\t')
        print("e2", end = "")
        print(i + 1, end = "")
     
    for i in range(0, e1) :
        print()
        print("e1", end = "")
        print(i + 1, end = "\t")
 
        for j in range(0, e2) :
            print(m[i][j], end = "\t")
         
    for i in range(0, e1) :
 
        for j in range(0, e2) :
           
            # Change the timestamp if the
            # message is sent
            if(m[i][j] == 1) :
                p2[j] = max1(p2[j], p1[i] + 1)
                for i in range(j + 1, e2) :
                    p2[k] = p2[k - 1] + 1
 
            # Change the timestamp if the
            # message is received
            if(m[i][j] == -1) :
                p1[i] = max1(p1[i], p2[j] + 1)
                for k in range(i + 1, e1) :
                    p1[k] = p1[k - 1] + 1
 
    # Function Call
    display(e1, e2, p1, p2)
 
# Driver Code
 
if __name__ == "__main__" :
    e1 = 5
    e2 = 3
    m = [[0]*3 for i in range(0,5)]
     
    # dep[i][j] = 1, if message is sent
    # from ei to ej
    # dep[i][j] = -1, if message is received
    # by ei from ej
    # dep[i][j] = 0, otherwise
 
    m[0][0] = 0
    m[0][1] = 0
    m[0][2] = 0
    m[1][0] = 0
    m[1][1] = 0
    m[1][2] = 1
    m[2][0] = 0
    m[2][1] = 0
    m[2][2] = 0
    m[3][0] = 0
    m[3][1] = 0
    m[3][2] = 0
    m[4][0] = 0
    m[4][1] = -1
    m[4][2] = 0
     
    # Function Call
    lamportLogicalClock(e1, e2, m)
 
    # This code is contributed by rakeshsahni

Javascript

<script>
    // JavaScript program to illustrate the Lamport's
    // Logical Clock
 
    // Function to find the maximum timestamp
    // between 2 events
    const max1 = (a, b) => {
        // Return the greatest of th two
        if (a > b)
            return a;
        else
            return b;
    }
 
    // Function to display the logical timestamp
    const display = (e1, e2, p1, p2) => {
        let i;
 
        document.write(`<br/>The time stamps of events in P1:<br/>`);
 
        for (i = 0; i < e1; i++) {
            document.write(`${p1[i]} `);
        }
 
        document.write(`<br/>The time stamps of events in P2:<br/>`);
 
        // Print the array p2[]
        for (i = 0; i < e2; i++)
            document.write(`${p2[i]} `);
    }
 
    // Function to find the timestamp of events
    const lamportLogicalClock = (e1, e2, m) => {
        let i, j, k, p1 = [], p2 = [];
 
        // Initialize p1[] and p2[]
        for (i = 0; i < e1; i++)
            p1[i] = i + 1;
 
        for (i = 0; i < e2; i++)
            p2[i] = i + 1;
 
        for (i = 0; i < e2; i++)
            document.write(`\te2${i + 1}`)
 
        for (i = 0; i < e1; i++) {
 
            document.write(`<br/>e1${i + 1} `)
            for (j = 0; j < e2; j++)
                document.write(`${m[i][j]}\t`);
        }
 
        for (i = 0; i < e1; i++) {
            for (j = 0; j < e2; j++) {
 
                // Change the timestamp if the
                // message is sent
                if (m[i][j] == 1) {
                    p2[j] = max1(p2[j], p1[i] + 1);
                    for (k = j + 1; k < e2; k++)
                        p2[k] = p2[k - 1] + 1;
                }
 
                // Change the timestamp if the
                // message is received
                if (m[i][j] == -1) {
                    p1[i] = max1(p1[i], p2[j] + 1);
                    for (k = i + 1; k < e1; k++)
                        p1[k] = p1[k - 1] + 1;
                }
            }
        }
 
        // Function Call
        display(e1, e2, p1, p2);
    }
 
    // Driver Code
 
    let e1 = 5, e2 = 3;
 
    // message is sent and received
    // between two process
 
    /*dep[i][j] = 1, if message is sent
                from ei to ej
    dep[i][j] = -1, if message is received
                    by ei from ej
    dep[i][j] = 0, otherwise*/
    const m = [
        [0, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0],
        [0, -1, 0]
    ]
 
    // Function Call
    lamportLogicalClock(e1, e2, m);
     
// This code is contributed by rakeshsahni
 
</script>
Producción

        e21    e22    e23
 e11    0    0    0    
 e12    0    0    1    
 e13    0    0    0    
 e14    0    0    0    
 e15    0    -1    0    
The time stamps of events in P1:
1 2 3 4 5 
The time stamps of events in P2:
1 2 3 

Complejidad de Tiempo: O(e1 * e2 * (e1 + e2))
Espacio Auxiliar: O(e1 + e2)

Publicación traducida automáticamente

Artículo escrito por swgtmalik y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *