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:

- ake 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 <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;
}

Books on Lamport Logical Clock
 English
 English Afrikaans
 Afrikaans Albanian
 Albanian Amharic
 Amharic Arabic
 Arabic Armenian
 Armenian Azerbaijani
 Azerbaijani Basque
 Basque Belarusian
 Belarusian Bengali
 Bengali Bosnian
 Bosnian Bulgarian
 Bulgarian Catalan
 Catalan Cebuano
 Cebuano Chichewa
 Chichewa Chinese (Simplified)
 Chinese (Simplified) Chinese (Traditional)
 Chinese (Traditional) Corsican
 Corsican Croatian
 Croatian Czech
 Czech Danish
 Danish Dutch
 Dutch Esperanto
 Esperanto Estonian
 Estonian Filipino
 Filipino Finnish
 Finnish French
 French Frisian
 Frisian Galician
 Galician Georgian
 Georgian German
 German Greek
 Greek Gujarati
 Gujarati Haitian Creole
 Haitian Creole Hausa
 Hausa Hawaiian
 Hawaiian Hebrew
 Hebrew Hindi
 Hindi Hmong
 Hmong Hungarian
 Hungarian Icelandic
 Icelandic Igbo
 Igbo Indonesian
 Indonesian Irish
 Irish Italian
 Italian Japanese
 Japanese Javanese
 Javanese Kannada
 Kannada Kazakh
 Kazakh Khmer
 Khmer Korean
 Korean Kurdish (Kurmanji)
 Kurdish (Kurmanji) Kyrgyz
 Kyrgyz Lao
 Lao Latin
 Latin Latvian
 Latvian Lithuanian
 Lithuanian Luxembourgish
 Luxembourgish Macedonian
 Macedonian Malagasy
 Malagasy Malay
 Malay Malayalam
 Malayalam Maltese
 Maltese Maori
 Maori Marathi
 Marathi Mongolian
 Mongolian Myanmar (Burmese)
 Myanmar (Burmese) Nepali
 Nepali Norwegian
 Norwegian Pashto
 Pashto Persian
 Persian Polish
 Polish Portuguese
 Portuguese Punjabi
 Punjabi Romanian
 Romanian Russian
 Russian Samoan
 Samoan Scottish Gaelic
 Scottish Gaelic Serbian
 Serbian Sesotho
 Sesotho Shona
 Shona Sindhi
 Sindhi Sinhala
 Sinhala Slovak
 Slovak Slovenian
 Slovenian Somali
 Somali Spanish
 Spanish Sudanese
 Sudanese Swahili
 Swahili Swedish
 Swedish Tajik
 Tajik Tamil
 Tamil Telugu
 Telugu Thai
 Thai Turkish
 Turkish Ukrainian
 Ukrainian Urdu
 Urdu Uzbek
 Uzbek Vietnamese
 Vietnamese Welsh
 Welsh Xhosa
 Xhosa Yiddish
 Yiddish Yoruba
 Yoruba Zulu
 Zulu