You are on page 1of 6

DISTRIBUTED SYSTEMS

Winter Semester 2023-24

LAB DIGITAL ASSIGNMENT-1

School of Computer Science and Engineering

NAME: ELAVARASAN R
REG NO.: 21MID0092
FACULTY: SIVAKUMAR. N
SLOT: L15+L16
COURSE CODE: CSI3012
1. Lamport’s algorithm for mutual exclusion.

Code:
import java.util.Arrays;
import java.util.Scanner;

class LamportsMutex {
private static int[] clock;
private static boolean[] inCriticalSection;
private static int numProcesses;
private static boolean[] selectedProcesses;
private static boolean[] enteredCS;
private static final Object lock = new Object();

public static void main(String[] args) {


Scanner scanner = new Scanner(System.in);
System.out.print("Enter the number of processes: ");
numProcesses = scanner.nextInt();
clock = new int[numProcesses];
inCriticalSection = new boolean[numProcesses];
enteredCS = new boolean[numProcesses];
for (int i = 0; i < numProcesses; i++) {
System.out.print("Enter timestamp for Process " + i + ": ");
clock[i] = scanner.nextInt();
}
System.out.println("Enter the process IDs that should enter the critical section
(comma-separated):");
String selectedProcessesInput = scanner.next();
String[] selectedProcessIDs = selectedProcessesInput.split(",");
int maxProcessID = 0;
for (String id : selectedProcessIDs) {
int processID = Integer.parseInt(id.trim());
maxProcessID = Math.max(maxProcessID, processID);
}
selectedProcesses = new boolean[maxProcessID + 1];
for (String id : selectedProcessIDs) {
int processID = Integer.parseInt(id.trim());
selectedProcesses[processID] = true;
}
Integer[] selectedProcessIndices = new Integer[selectedProcessIDs.length];
for (int i = 0; i < selectedProcessIDs.length; i++) {
selectedProcessIndices[i] = Integer.parseInt(selectedProcessIDs[i].trim());
}
Arrays.sort(selectedProcessIndices);
for (int i = 0; i < selectedProcessIndices.length; i++) {
int processID = selectedProcessIndices[i];
Thread processThread = new Thread(() -> {
try {
Thread.sleep((long) (Math.random() * 1000));
System.out.println("Process " + processID + " with timestamp " +
clock[processID] + " wants to enter the critical section.");
enterCriticalSection(processID);
System.out.println("Process " + processID + " with timestamp " +
clock[processID] + " enters the critical section");
enteredCS[processID] = true;
Thread.sleep((long) (Math.random() * 1000));
System.out.println("Process " + processID + " with timestamp " +
clock[processID] + " exits the critical section.");
exitCriticalSection(processID);
System.out.println("Process " + processID + " finished critical section
work.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
processThread.start();
}
}

private static void enterCriticalSection(int processID) {


synchronized (lock) {
if (!selectedProcesses[processID]) {
return;
}
inCriticalSection[processID] = true;
clock[processID]++;
for (int i = 0; i < numProcesses; i++) {
if (i != processID && selectedProcesses[i]) {
clock[processID] = Math.max(clock[processID], clock[i]);
}
}
for (int i = 0; i < numProcesses; i++) {
if (i != processID && inCriticalSection[i] && (clock[processID] > clock[i]
|| (clock[processID] == clock[i] && processID > i))) {
while (inCriticalSection[i] && (clock[processID] > clock[i] ||
(clock[processID] == clock[i] && processID > i))) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
private static void exitCriticalSection(int processID) {
synchronized (lock) {
if (!selectedProcesses[processID]) {
return;
}
inCriticalSection[processID] = false;
lock.notifyAll();
clock[processID]++;
}
}
}

Screenshot:
Output:

****Thank you****

You might also like