Lamport's Logical Clock was created by Leslie Lamport. It is a procedure to determine the order of events occurring. It provides a basis for the more advanced Vector Clock Algorithm. Due to the absence of a Global Clock in a Distributed Operating System Lamport Logical Clock is needed.
Algorithm:
- Happened before relation(->): a -> b, means 'a' happened before 'b'.
- Logical Clock: The criteria for the logical clocks are:
- [C1]: Ci (a) < Ci(b), [ Ci -> Logical Clock, If 'a' happened before 'b', then time of 'a' will be less than 'b' in a particular process. ]
- [C2]: Ci(a) < Cj(b), [ Clock value of Ci(a) is less than Cj(b) ]
Reference:
- Process: Pi
- Event: Eij, where i is the process in number and j: jth event in the ith process.
- tm: vector time span for message m.
- Ci vector clock associated with process Pi, the jth element is Ci[j] and contains Pi's latest value for the current time in process Pj.
- d: drift time, generally d is 1.
Implementation Rules[IR]:
- [IR1]: If a -> b ['a' happened before 'b' within the same process] then, Ci(b) =Ci(a) + d
- [IR2]: Cj = max(Cj, tm + d) [If there's more number of processes, then tm = value of Ci(a), Cj = max value between Cj and tm + d]
For Example:

- Take the starting value as 1, since it is the 1st event and there is no incoming value at the starting point:
- e11 = 1
- e21 = 1
- The value of the next point will go on increasing by d (d = 1), if there is no incoming value i.e., to follow [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
- When there will be incoming value, then follow [IR2] i.e., take the maximum value between Cj and Tm + d.
- e17 = max(7, 5) = 7, [e16 + d = 6 + 1 = 7, e24 + d = 4 + 1 = 5, maximum among 7 and 5 is 7]
- e23 = max(3, 3) = 3, [e22 + d = 2 + 1 = 3, e12 + d = 2 + 1 = 3, maximum among 3 and 3 is 3]
- e25 = max(5, 6) = 6, [e24 + 1 = 4 + 1 = 5, e15 + d = 5 + 1 = 6, maximum among 5 and 6 is 6]
Limitation:
- In case of [IR1], if a -> b, then C(a) < C(b) -> true.
- In case of [IR2], if a -> b, then C(a) < C(b) -> May be true or may not be true.

Below is the C program to implement Lamport's Logical Clock:
// 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 the 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 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 the 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;
}
// Java program to illustrate the Lamport's
// Logical Clock
import java.util.*;
public class GFG {
// Function to find the maximum timestamp
// between 2 events
static int max1(int a, int b)
{
// Return the greatest of the two
if (a > b)
return a;
else
return b;
}
// Function to display the logical timestamp
static void display(int e1, int e2, int p1[], int p2[])
{
int i;
System.out.print(
"\nThe time stamps of events in P1:\n");
for (i = 0; i < e1; i++) {
System.out.print(p1[i] + " ");
}
System.out.println(
"\nThe time stamps of events in P2:");
// Print the array p2[]
for (i = 0; i < e2; i++)
System.out.print(p2[i] + " ");
}
// Function to find the timestamp of events
static void lamportLogicalClock(int e1, int e2,
int m[][])
{
int i, j, k;
int p1[] = new int[e1];
int p2[] = new int[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++)
System.out.print("\te2" + (i + 1));
for (i = 0; i < e1; i++) {
System.out.print("\n e1" + (i + 1) + "\t");
for (j = 0; j < e2; j++)
System.out.print(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);
}
public static void main(String args[])
{
int e1 = 5, e2 = 3;
int m[][] = new int[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);
}
}
// This code is contributed by nmkiniqw7b
# 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 the 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
// C# program to illustrate the Lamport's
// Logical Clock
using System;
public class GFG {
// Function to find the maximum timestamp
// between 2 events
static int max1(int a, int b)
{
// Return the greatest of the two
if (a > b)
return a;
else
return b;
}
// Function to display the logical timestamp
static void display(int e1, int e2, int[] p1, int[] p2)
{
int i;
Console.Write(
"\nThe time stamps of events in P1:\n");
for (i = 0; i < e1; i++) {
Console.Write(p1[i] + " ");
}
Console.WriteLine(
"\nThe time stamps of events in P2:");
// Print the array p2[]
for (i = 0; i < e2; i++)
Console.Write(p2[i] + " ");
}
// Function to find the timestamp of events
static void lamportLogicalClock(int e1, int e2,
int[, ] m)
{
int i, j, k;
int[] p1 = new int[e1];
int[] p2 = new int[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++)
Console.Write("\te2" + (i + 1));
for (i = 0; i < e1; i++) {
Console.Write("\n e1" + (i + 1) + "\t");
for (j = 0; j < e2; j++)
Console.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);
}
static public void Main()
{
// Code
int e1 = 5, e2 = 3;
int[, ] m = new int[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);
}
}
// This code is contributed by lokeshmvs21.
<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 the 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>
Output
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
Time Complexity: O(e1 * e2 * (e1 + e2))
Auxiliary Space: O(e1 + e2)